【问题标题】:A FreeRTOS task suddenly does nothingFreeRTOS 任务突然什么都不做
【发布时间】:2017-07-02 20:32:09
【问题描述】:

我正在开发一个带有 FreeRTOS 的实时系统 STM3240G 板。

  • 系统包含一些不同的任务(GUI、KB、ModBus、Ctrl 等)
  • 任务有不同的优先级。
  • GUI 似乎显示有点慢。

所以我使用 Profiler 软件来查看不同任务之间发生了什么 在跑步期间。该分析器向我显示每个时刻(微秒)正在运行的任务以及到达的中断。

此分析器使我能够“标记”代码上的不同位置,以便我知道 当它在那里的时候。所以我运行程序并做一个记录。

我查看了记录,发现(例如)Ctrl 任务介于两个 15 毫秒的代码行(这次改变大小)没有任何 任务更改没有中断到达,此后系统根据记录和我的标记从这一点正常继续。

我尝试关闭禁用不同的中断但没有任何成功。 有人知道它可能是什么吗?

【问题讨论】:

  • 在这些行之间使用调试器会发生什么?另外,您确定您没有处于分析器不知道的中断中吗?
  • 您是否在任何地方使用portENTER_CRITICAL(),因为这会禁用中断,因此不会发生任务切换,或者您是否阻止任何中断?我会将所有中断代码注释掉,但保持程序流程相同,然后看看你是否得到相同的行为 - 隔离问题。
  • 这是无法远程回答的问题。所有 RTOS 应用程序都有这样的任务并使用中断。为什么它不能按我预期的那样工作的问题在这里只是题外话

标签: scheduled-tasks microcontroller stm32 freertos


【解决方案1】:

在评估板上,有一个支持 ETM 跟踪的 MIPI 连接器 - 与其他开发板相比,这是一个相当大的优势/优势! 如果您还有一种更昂贵的调试适配器也支持 ETM 跟踪(例如,uTraceJ-TraceULINKproI-jet Trace),您应该使用它来跟踪整个控制流,而无需检测任务和 ISR。

否则,您应该重新检查是否真的每个 IRQ 处理程序都已在足够低的级别进行检测(感谢 @RealtimeRik,他指出了这一点),以便分析器能够真正发现它。 特别是如果您使用第三方库,可能是某些 IRQ 由您(或分析器)没有代码的处理程序提供服务。 由于我必须亲自体验一次,建议您仔细检查 NVIC 设置,以重新检查是否存在您不知道的 ISR。

另一个问题是分析器在内部是如何工作的。 如果它基于 ETM/TPIU 或 ITM/SWO 跟踪,请参见上文。 如果它创建并计算大量快照,则可能存在一些系统性情况会阻止在软件的特定部分创建快照:

会不会是不可屏蔽的中断或异常处理程序以一种无法被收集快照的机制中断的方式运行? 控制任务的时间是否与用于快照的时间信号相关(出于某种巧合)? 如果您在意外的“分析差距”(例如,数百或数千个NOPs)前面插入一些耗时的额外代码会发生什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多