FreeRTOS消息队列发送成功,但消息队列读取任务不成功

记录一次问题处理的过程

FreeRTOS 版本:V9.0.0

MCU:STM32F103RET6

在can总线接收中断中使用xQueueSendFromISR往消息队列里发送数据,如下

使用can分析仪,每50ms往开发板发送一次同步报文,如下

同步报文触发TPDO的发送,在消息队列处理任务里将接收的can报文进行消息分发。但每次同步报文发送几百条后都会出现TPDO不触发的现象,即can接收中断能接收到can报文,并且xHigherPriorityTaskWoken 返回 pdTRUE。但

接收消息任务就是不就绪,找不到问题,百思不得其解,消息队列的数量是8,每个消息的大小也就十多个字节,并且can接收处理任务的优先级足够高。在该系统中,我设置的can接收中断的中断优先级是2。并且在对应的接收中断中调用了FREERTOS的API。

我们知道:

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

设置FreeRTOS系统可管理的最大优先级,就是BASEPRI寄存器的阈值。范围是0~15,如果设置为5,也就是高于等于5的优先级不归FreeRTOS管理。
configMAX_SYSCALL_INTERRUPT_PRIORITY

是configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY左移configPRIO_BITS bit来的,低于configKERNEL_INTERRUPT_PRIORITY设置好的阈值,可以安全调用FreeRTOS的API函数,但未被FreeRTOS管理的中断是不能禁止的(调用FreeRTOS开关中断时,对这些中断不受影响),其中断函数不能调用FreeRTOS的API函数。

于是,我将使用到带ISR的API 的can中断优先级改为6,也就是设置为freeRTOS操作系统可管理的中断范围。然后进行测试,系统can通信收发正常,不再出现can消息接收处理任务阻塞不执行的情况。希望对遇到同样问题的老铁们有帮助。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值