FreeRTOS | STM32H7串口中断调用FreeRTOS API,导致程序卡死
生活随笔
收集整理的這篇文章主要介紹了
FreeRTOS | STM32H7串口中断调用FreeRTOS API,导致程序卡死
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、前言
- 二、串口中斷調用xQueueSendFromISR
- 2.1、串口中斷回調函數(usart.c)
- 2.2、stm32h7xx_it.c
- 三、調試
- 3.1、串口中斷后,程序卡死
- 3.2、卡死原因
- 四、NIVC中斷優先級
- 4.1、串口中斷優先級
- 4.2、FreeRTOS配置文件的MAX_SYSCALL_INTERRUPT_PRIORITY
一、前言
在網絡上搜尋了相關的問題,看一下其他人有沒有碰到這個問題。實際上有較多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要高。在明白問題的本質后,就有解決問題的解決方案:
總結
以上是生活随笔為你收集整理的FreeRTOS | STM32H7串口中断调用FreeRTOS API,导致程序卡死的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西单大悦城苹果店4s_“神秘列车”复活!
- 下一篇: STM32H743+CubeMX-两路F