硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5628|回复: 13
收起左侧

[CMSIS-RTOS] RTX5消息队列接口使用疑问

[复制链接]

11

主题

44

回帖

77

积分

初级会员

积分
77
发表于 2018-6-7 22:12:39 | 显示全部楼层 |阅读模式
1、osMessageQueuePut接口在中断内部使用是无效的,但翻看了cmsis_os2.h中有关消息队列的接口,并未找到有专门用于中断中的接口,因此问下硬汉,是否有专用于中断的putmsg接口

2、题外话:我的目的是想省去自己做一个全局ringbuffer去接收串口的数据,请问硬汉,中断中直接使用OS自带的消息队列是否为最常用的方式
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2018-6-8 11:03:14 | 显示全部楼层
回复

使用道具 举报

11

主题

44

回帖

77

积分

初级会员

积分
77
 楼主| 发表于 2018-6-8 17:02:08 | 显示全部楼层
eric2013 发表于 2018-6-8 11:03
1、此贴末尾
http://www.armbbs.cn/forum.php?mod=viewthread&tid=85578&extra=page%3D1%26filter%3Dty ...

osMessageQueuePut接口在中断内部使用测试是无效的呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2018-6-8 17:02:55 | 显示全部楼层
十二月的肖邦 发表于 2018-6-8 17:02
osMessageQueuePut接口在中断内部使用测试是无效的呀

那就是你使用错误了,看看正确创建了没。
回复

使用道具 举报

11

主题

44

回帖

77

积分

初级会员

积分
77
 楼主| 发表于 2018-6-8 18:01:27 | 显示全部楼层
eric2013 发表于 2018-6-8 17:02
那就是你使用错误了,看看正确创建了没。

我在俩任务中可以自由收发,Put丢进中断就歇菜!!!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2018-6-8 18:06:19 | 显示全部楼层
十二月的肖邦 发表于 2018-6-8 18:01
我在俩任务中可以自由收发,Put丢进中断就歇菜!!!!

这种基础问题,尝试自己解决下。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2018-6-13 11:18:08 | 显示全部楼层
十二月的肖邦 发表于 2018-6-8 18:01
我在俩任务中可以自由收发,Put丢进中断就歇菜!!!!

能使用,但是根据手册在中断内使用的话超时接收等待必须是0~
回复

使用道具 举报

11

主题

44

回帖

77

积分

初级会员

积分
77
 楼主| 发表于 2018-6-13 14:15:48 | 显示全部楼层
YTFZ 发表于 2018-6-13 11:18
能使用,但是根据手册在中断内使用的话超时接收等待必须是0~

我好像是null,直接用的默认值,晚上回去试试
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-9-9 15:17:10 | 显示全部楼层
想问一下,lz解决了么是0的问题么?
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-9-9 15:18:22 | 显示全部楼层
十二月的肖邦 发表于 2018-6-13 14:15
我好像是null,直接用的默认值,晚上回去试试

请问,解决了么,是NULL问题么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2020-9-9 17:30:05 | 显示全部楼层
bigyang 发表于 2020-9-9 15:18
请问,解决了么,是NULL问题么?

他的和你的不同,他的是RTX5,你的是RTX4
回复

使用道具 举报

0

主题

53

回帖

53

积分

初级会员

积分
53
发表于 2020-11-18 17:28:47 | 显示全部楼层
虽然这个帖是两年多以前发的,但是还是有必要回复一下,方便后来的阅读者。

因为最近在STM32上使用FreeRTOS,在串口中断中使用osMessageQueuePut()发送消息到队列时,程序卡死了。
Debug发现,卡死的位置是vPortValidateInterruptPriority()的断言语句configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

搜索后,发现了这个帖子探究为什么FreeRTOS 有些API不能在中断服务函数中调用,转而需要调用带ISR的版本

也就是说,如果你要在中断函数中调用RTOS的API,那么就要求这个中断的优先级(ucCurrentPriority)大于或等于最大的系统调用优先级(ucMaxSysCallPriority)。
而ucMaxSysCallPriority的值,由宏定义configMAX_SYSCALL_INTERRUPT_PRIORITY决定,在FreeRTOS默认配置是5。

在CubeMX配置STM32的串口中断时,默认是0(优先级最高),所以导致configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );断言失败。
我将串口中断优先级改成5,就解决问题了。
当然,在中断中调用API,timeout参数必须为0。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2020-11-19 08:13:52 | 显示全部楼层
adlu 发表于 2020-11-18 17:28
虽然这个帖是两年多以前发的,但是还是有必要回复一下,方便后来的阅读者。

因为最近在STM32上使用FreeR ...

这个帖子专门整理了此问题,更加简单易理解

第12章 FreeRTOS中断优先级配置(重要)
http://www.armbbs.cn/forum.php?m ... 1094&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2020-12-8 11:21:30 | 显示全部楼层
能在中断用,但是超时参数必须为0,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 11:32 , Processed in 0.270409 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表