繁体   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