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

Posted

技术标签:

【中文标题】STM32 ISR 例程挂在 cmsis-OS osThreadFlagSet() 内部【英文标题】:STM32 ISR routine hanging inside of cmsis-OS osThreadFlagSet() 【发布时间】:2021-09-23 19:35:45 【问题描述】:

我在 STM32G070 上的 cmsis 操作系统线程标志和中断服务例程之间的交互存在一个奇怪的问题。

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

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

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

我试过了:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于STM32 ISR 例程挂在 cmsis-OS osThreadFlagSet() 内部的主要内容,如果未能解决你的问题,请参考以下文章

STM32:将 USART 与字符匹配 ISR 和 DMA 缓冲区一起使用

我们不能在 stm32 F407VG 的 ISR 中使用 HAL_Delay()

GuiLite移植GUI例程到STM32

关于使用STM32单片机完成脉冲计数功能的问题

STM32FreeRTOS 系统内核控制函数

STM32F407学习板 开发板 全部例程+原理图