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

文章讲述了在使用FreeRTOSV9.0.0的STM32F103RET6MCU中,作者在can总线接收中断中使用xQueueSendFromISR发送数据时遇到TPDO不触发的问题。通过调整can中断优先级到操作系统可管理级别,解决了中断处理任务阻塞的问题。
摘要由CSDN通过智能技术生成

记录一次问题处理的过程

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消息接收处理任务阻塞不执行的情况,后来我在别的板子上在中断中使用操作系统的方法往队列里面写入数据或者发送任务通知或事件组置位等操作,会直接造成系统重启,也是由于中断设置的优先级不是FreeRTOS可管理的优先级造成的。希望对遇到同样问题的老铁们有帮助。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值