簡體   English   中英

(STM32L476RG)標志設置(osThreadFlagsSet)在中斷(GPIO EXTI)中執行時使微控制器崩潰

[英](STM32L476RG) Flag setting (osThreadFlagsSet) crashes microcontroller when executed in an Interrupt (GPIO EXTI)

我目前正在學習 CMSIS-RTOS v2,但我遇到了一個困擾我的問題,我找不到我需要的答案。

我使用 STM32L476-Disco 板和操縱桿中心按鈕作為中斷。 我的中心操縱桿中斷有一個非常簡單的中斷回調:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
    //osEventFlagsSet(evt_id,0x0001);
    HAL_GPIO_TogglePin(LD5_GPIO_Port,LD5_Pin);
    osThreadFlagsSet(ThId_Led_Blink,0x0001);
}

當我調用 osThreadFlagsSet 時,微控制器凍結,沒有其他任何事情發生。 這就是我放置 HAL_GPIO_TogglePin: 以查看 mcu 是否仍在響應的原因。

我知道我的中斷正確重置,因為當我只撥動引腳時,我可以正確切換 LED。

ThId_Led_Blink 是一個 ThreadId

osThreadId ThId_Led_Blink;

我已經檢查了我的調試器中的 ID 設置是否正確並且它是(它不為空)。

如您所見,我已經嘗試過使用 osEvenFlagsSet 並且得到了相同的結果。

當我檢查 CMSIS_RTOS v2 文檔時,它確實指定可以從 ISR 調用 osThreadFlagsSet,但我不確定在這種情況下我是否需要做其他事情才能正確設置標志並解決 ISR 時的問題絞刑。

謝謝你的幫助

因此,經過數小時的令人沮喪的搜索后,我終於解決了我的問題。

如本網站所述: https://www.freertos.org/RTOS-Cortex-M3-M4.html ,對於 STM32 微處理器,您需要將 NVIC Group Priority 設置為 4。如果您查看 freeRTOS,他們正在說話關於將這一行放入您的代碼中:

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

但是,STM32 有自己的 NVIC 庫,正確的 function 設置優先級組是:

HAL_NVIC_SetPriorityGrouping(4);

當您可以更改所有內容時,為什么 go 具有相同的名稱?

因此,如果您在 FreeRTOS/CMSIS RTOS 中使用嵌套中斷,請確保在 kernel 初始化之前調用此 function。

此外,請確保您的嵌套中斷優先級在 FreeRTOS 配置的中斷優先級范圍內,否則 osThreadFlagsSet function 將自動失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM