FreeRTOS | STM32H7串口中断调用FreeRTOS API,导致程序卡死
文章目錄
- 一、前言
- 二、串口中斷調(diào)用xQueueSendFromISR
- 2.1、串口中斷回調(diào)函數(shù)(usart.c)
- 2.2、stm32h7xx_it.c
- 三、調(diào)試
- 3.1、串口中斷后,程序卡死
- 3.2、卡死原因
- 四、NIVC中斷優(yōu)先級
- 4.1、串口中斷優(yōu)先級
- 4.2、FreeRTOS配置文件的MAX_SYSCALL_INTERRUPT_PRIORITY
一、前言
在網(wǎng)絡(luò)上搜尋了相關(guān)的問題,看一下其他人有沒有碰到這個問題。實(shí)際上有較多CSDN的博主都碰到這個問題,但能把問題說清楚的博主真的很少。這篇CSDN博文解決了我的問題,只是中斷的類型跟我不一樣(我使用的是串口中斷)。
相關(guān)CSDN博文的地址:FreeRTOS死機(jī)原因
二、串口中斷調(diào)用xQueueSendFromISR
我計劃將串口中斷接收到的字節(jié)存放到FreeRTOS的消息隊(duì)列里,代替裸機(jī)系統(tǒng)下的ringbuffer。
2.1、串口中斷回調(diào)函數(shù)(usart.c)
在串口中斷回調(diào)函數(shù)里,需要調(diào)用xQueueSendFromISR而不是xQueueSend。
2.2、stm32h7xx_it.c
將函數(shù)放進(jìn)STM32系統(tǒng)中斷的回調(diào)函數(shù)USART3_IRQHandler里,當(dāng)串口3產(chǎn)生中斷時,程序就會進(jìn)入這個函數(shù)里面。
三、調(diào)試
3.1、串口中斷后,程序卡死
進(jìn)入MDK調(diào)試模式,找到程序卡死的位置。
3.2、卡死原因
FreeRTOS源碼的注釋里,對產(chǎn)生這個問題的原因進(jìn)行了描述。
從上面的注釋看來,大概的問題應(yīng)該比較清楚了,就是因?yàn)橹袛鄡?yōu)先級造成的。
四、NIVC中斷優(yōu)先級
4.1、串口中斷優(yōu)先級
4.2、FreeRTOS配置文件的MAX_SYSCALL_INTERRUPT_PRIORITY
程序卡死的根本原因是串口的中斷優(yōu)先級比FreeRTOS配置文件上的MAX_SYSCALL_INTERRUPT_PRIORITY要高。在明白問題的本質(zhì)后,就有解決問題的解決方案:
總結(jié)
以上是生活随笔為你收集整理的FreeRTOS | STM32H7串口中断调用FreeRTOS API,导致程序卡死的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西单大悦城苹果店4s_“神秘列车”复活!
- 下一篇: java精通时间_你真的精通 Java