4,4) 0x20000730 0x20000510 552 B 0x200006BC ( 120 B) 384 B 0x00000C6E ( 9%)
6 no (0) 0x20001C68 Main Blocked (1,1) 0x20001C58 0x20001A08 600 B 0x20001BDC ( 128 B) 356 B 0x00000000 ( <1%)
3 no (0) 0x20001378 Radio Blocked (3,3) 0x20001368 0x20000F88 1000 B 0x200012F4 ( 120 B) 680 B 0x00000001 ( <1%)
4 no (0) 0x20001658 Sumo Blocked (2,2) 0x20001648 0x20001458 504 B 0x200015C4 ( 136 B) 360 B 0x00000000 ( <1%)
5 no (0) 0x20001948 Drive Blocked (3,3) 0x20001938 0x20001748 504 B 0x200018B4 ( 136 B) 264 B 0x00000000 ( <1%)
绝对数字是运行时间计时器滴答数(TCB中的ulRunTimeCounter)以及此计数器相对于总运行时间的百分比(task.c中的ulTotalRunTime)。
对于IDLE任务,它显示了这一点:
TCB Static Handle Name State Prio Stack Beg Stack End Size Stack Top Unused Runtime
7 no (0) 0x20001E68 IDLE Ready (0,0) 0x20001E58 0x20001CD0 400 B 0x20001DFC ( 96 B) 312 B 0x00007C35 ( 91%)
0x7C35是定时器计数器(在本例中使用0.1 ms定时器,因此它意味着IDLE任务运行约3秒(0x7C35 / 10 => 3179 ms)并使用91%的运行时间。
问题可能是:中断花费的时间是多少?答案是RTOS不知道中断,它只知道任务使用了多少运行时间计时器。或者换句话说:FreeRTOS运行时计数器显示的运行时* includes*中断的时间。
?教程:使用FreeRTOS进行运行时分析
在下一节中,我将展示如何使用FreeRTOS启用运行时分析。基本步骤是:
- 创建一个新项目(如果尚未存在)
- 更新FreeRTOSConfig.h
- 初始化和配置计时器
- 添加钩子/回调到应用程序
1、创建项目
创建一个基于你的目标板的项目:
项目创建的目标板
确保包含FreeRTOS:
项目的FreeRTOS选项
2、添加FreeRTOS任务
接下来添加一个任务,例如:
1 #include "FreeRTOS.h"
2
3 #include "task.h"
4
5
6
7 static void MyTask(void *pvParameters) {
8
9 for(;;) {
10
11 vTaskDelay(pdMS_TO_TICKS(100));
12
13 }
14
15 }
在main()内部,创建一个任务并启动调度程序:
1 /* create task */
2
3 if (xTaskCreate(MyTask, "MyTask", 500/sizeof(StackType_t), NULL, tskIDLE_PRIORITY+1, NULL) != pdPASS) {
4
5 for(;;){} /* error */
6
7 }
8
9 vTaskStartScheduler(); /* start RTOS */
10
11 for(;;) {
12
13 /* should not get here */
14
15 }
添加FreeRTOS任务
构建和调试该项目,只是为了确保一切正常。
调试FreeRTOS任务
要在Debug视图中显示FreeRTOS线程,请参阅https://mcuoneclipse.com/2018/06/29/show-freertos-threads-in-eclipse-debug-view-with-segger-j-link-and-nxp-s32-design-studio/
但是FreeRTOS任务列表(使用Menu FreeRTOS>任务列表来显示该视图)不显示任何运行时信息:
FreeRTOS任务列表,没有运行时信息
这是我们将在接下来的步骤中添加的内容。
3、跟踪和运行时统计信息
在FreeRTOSConfig.h中,确保将以下定义设置为1(打开):
1 #define configGENERATE_RUN_TIME_STATS 1 /* 1: generate runtime statistics; 0: no runtime statistics */
2
3 #define configUSE_TRACE_FACILITY 1 /* 1: include additional structure members and functions to assist with execution visualization and tracing, 0: no runtime stats/trace */
启用运行时统计信息和跟踪功能
该configUSE_TRACE_FACILITY需要使用RTOS有在任务描述当前存储的运行时间计数器的附加数据元素,在configGENERATE_RUN_TIME_STATS自动关上,以创纪录的任务执行时间的功能。
4、配置定时器
接下来,我们必须设置一个计时器来测量任务执行时间。该计时器的运行速度至少比RTOS Tick计时器快10倍。
在我们的示例中,滴答率为1 kHz:
1 #define configTICK_RATE_HZ ((TickType_t)1000)
这意味着我们的运行时间应至少以10 kHz运行。
要配置这样的计时器,我可以使用MCUXpresso配置外设工具:
外围设备工具
在外设工具中,我们选择了FTM0定时器(我们