您好!
希望您能帮助解决我发现的差异。
我修改了 FreeRTOS | ut 演示以检索 ping_main()末尾的运行时统计信息(vTaskGetRunTimeStats)。 请注意,PING_MAIN 被简化为只调用 test_taskSwitchWithSemaphore(),它的优点是减少运行时间并确保在获得统计数据时'pong'任务仍然有效。
我很惊讶地看到、累积的乒乓/闲置% CPU 使用率大于100%。 实际数字因执行情况而异、示例为:
启动 FreeRTOS ut
[freertos] ping 任务... 开始!!!
任务切换的执行时间= 3614ms
任务开关数量= 2000000
每个任务切换的时间(信标给出/接受)= 1807ns
所有测试均已通过!!
运行时间统计
Ping 1494683 38%
空闲 304801 7%
Pong 3697129 94%
TMR 服务 19. <1%
任务列表
Ping x 2 32520 5.
空闲 R 0 945 2
TMR 服务 B 15 172 3
Pong S 3 32656 4
为了总结我的调查结果,当在运行环境切换期间(在本例中) 通过信标在 ping 和 pong 任务之间切换时,当计时器节拍中断发生时,vTaskSwitchContext()中 ulTaskSwitchSchedulInTime 的值似乎已损坏。 损坏是指 之前上下文切换中基于 ulTotalRunTime 的 ulTaskSwitchedInTime 值已被一个看起来是 tickCount*1000的值覆盖。 "新"值大约比旧值小1000、 因此,在下次执行 vTaskSwitchContext()时,pxCurrentTCB->ulRunTimeCounter += ulTotalRunTime - ulTaskSwitchInTime 的计算 最终会将任务 ulRunTimeCounter 的增加 量增加大约1000us,因此基于 ulRunTimeCounter 的统计 数据显示出比实际情况高得多的 CPU 使用率。 下面显示的跟踪数据对此进行了演示。
同样令人关注的是,此跟踪还显示 ,被中断的 vTaskSwitchContext()永远不会恢复。 例如,在显示的'pong'的 traceTASK_switched_out ()已被调用,但 ping 的预期 traceTASK_switched_in ()不是。
希望注释澄清上述说明。

此致
斯蒂芬
