文章目录
一、前言
在网络上搜寻了相关的问题,看一下其他人有没有碰到这个问题。实际上有较多CSDN的博主都碰到这个问题,但能把问题说清楚的博主真的很少。这篇CSDN博文解决了我的问题,只是中断的类型跟我不一样(我使用的是串口中断)。
相关CSDN博文的地址:FreeRTOS死机原因
二、串口中断调用xQueueSendFromISR
我计划将串口中断接收到的字节存放到FreeRTOS的消息队列里,代替裸机系统下的ringbuffer。
2.1、串口中断回调函数(usart.c)
在串口中断回调函数里,需要调用xQueueSendFromISR而不是xQueueSend。
2.2、stm32h7xx_it.c
将函数放进STM32系统中断的回调函数USART3_IRQHandler里,当串口3产生中断时,程序就会进入这个函数里面。
三、调试
3.1、串口中断后,程序卡死
进入MDK调试模式,找到程序卡死的位置。
3.2、卡死原因
FreeRTOS源码的注释里,对产生这个问题的原因进行了描述。
从上面的注释看来,大概的问题应该比较清楚了,就是因为中断优先级造成的。
四、NIVC中断优先级
4.1、串口中断优先级
4.2、FreeRTOS配置文件的MAX_SYSCALL_INTERRUPT_PRIORITY
程序卡死的根本原因是串口的中断优先级比FreeRTOS配置文件上的MAX_SYSCALL_INTERRUPT_PRIORITY要高。在明白问题的本质后,就有解决问题的解决方案:
- 串口中断的中断优先级设置2(比MAX_SYSCALL_INTERRUPT_PRIORITY大一级)。
- 在不修改中断优先级的情况下,串口中断回调函数里不要调用FreeRTOS的API函数。