interrupt - (STM32L476RG)标志设置(osThreadFlagsSet)在中断(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 库,设置优先级组的正确函数是:
HAL_NVIC_SetPriorityGrouping(4);
当您可以更改所有内容时,为什么要使用相同的名称?
因此,如果您在 FreeRTOS/CMSIS RTOS 中使用嵌套中断,请确保在内核初始化之前调用此函数。
另外,请确保您的嵌套中断优先级在您的 FreeRTOS 配置的中断优先级范围内,否则 osThreadFlagsSet 函数将自动失败。
推荐阅读
- java - Cucumber-JVM 3 - 使用 asMap() 将 DataTable 转换为单个对象
- javascript - 将部分 url 与变量进行比较
- dart - 自定义滚动谷歌颤动中的水平列表视图
- sql - 比较 SQL 中的先前值和当前值
- angular5 - 每次重试时重新计算的动态标头
- ios - UICollectionView(水平CollectionView内)滚动时如何缩小大标题?
- android - [[17.0.0,17.0.0]] 的各种其他库正在请求库 com.google.firebase:firebase-iid,但解析为 16.2.0
- python - 使用键进行内存高效排序
- r - 如何在 R 的回归线上找到最低和最高值?
- javascript - 删除对缓冲区 NodeJS 的要求