STM32 ISR 例程挂在 cmsis-OS osThreadFlagSet()

问题描述

我对 STM32G070 上的 cmsis OS 线程标志和中断服务例程之间的交互有一个奇怪的问题。

当从 GPIO 上升沿中断调用 osThreadFlagsSet() 时,整个程序挂在 FreeRTOS 软件的 tasks.c [line 4853] 内的 configASSERT() 内

/* The task should not have been on an event list. */
configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL );

有了这个处理器,网上的解决方案都没有解决这个问题。

我试过了:

  • 设置 NVIC 优先级分组(不适用于 G070 或未定义)
  • 更改所有任务优先级
  • 增加堆栈/堆分配

出于某种奇怪的原因,我在下面的回答修复了它。如果有人想评论为什么这可能会修复它,请随意。我把这个贴在这里,以防其他可怜的人在搜索引擎上找到这个。

解决方法

通过更改 osThreadAttr_t 结构中的 .stack_size 变量来修复以较低优先级运行的完全不相关的线程。

CubeMX 软件以字为单位定义了最小堆栈大小,我的一项任务与该最小大小相同(128 个字)。这不会导致其他任何问题,但是一旦我将其更改为 256,osThreadFlagsSet() 调用一组不同的函数/线程就可以正常工作。