【问题标题】:STM32 ISR routine hanging inside of cmsis-OS osThreadFlagSet()STM32 ISR 例程挂在 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 不可用或未定义)
  • 更改所有任务优先级
  • 增加堆栈/堆分配

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

【问题讨论】:

    标签: stm32 freertos isr cmsis


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 2021-09-12
      • 2022-09-22
      • 2012-04-21
      • 2023-04-06
      • 2017-03-06
      • 2021-09-27
      • 1970-01-01
      • 2021-02-11
      相关资源
      最近更新 更多