FreeRTOS 调试–打印任务执行情况
官方API函数中有两个函数可以提供任务的一些情况,一个是:
void vTaskList( char * pcWriteBuffer )
第二个是:
void vTaskGetRunTimeStats( char *pcWriteBuffer )
;
下面就介绍下这两个函数:
任务列表函数:
void vTaskList( char * pcWriteBuffer )
,该函数将任务的运行状态,任务优先级,剩余栈,优先级通过sprintf()函数打印到pcWriteBuffer中,接下来只需要将pcWriteBuffer通过串口打印出来即可。下面是一个调用void vTaskList( char * pcWriteBuffer )
的例子。static void vLEDTask( void *pvParameters ) { uint8_t pcWriteBuffer[500]; while(1) { LED_Toggle(GREEN_LED_Toggle); printf("LED Toggle\n"); vTaskList((char *)&pcWriteBuffer); printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n"); printf("%s\r\n", pcWriteBuffer); } }
在工程中创建上述任务,编译提示不通过,
使用sourceinsight跟踪源代码,发现xTaskList()前有条件编译:
所以必须满足条件编译条件才能使用该函数,那么就需要将FreeRTOSConfig.h中
改为:#define configUSE_TRACE_FACILITY 1
并且在 FreeRTOSConfig.h中添加:
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
这样子配置完,编译通过,打印效果如下图:
其中要注意的是剩余栈的大小单位是WORD,如IDLE的剩余栈大小为:118*4=472字节。任务运行状态函数:
void vTaskGetRunTimeStats( char *pcWriteBuffer )
,该函数可以提供相应任务的计数以及相应的占用率;要获准任务准确的运行状态,需要定义一个初始化一个定时器,用来提供相应的计时,FreeRTOS要求该定时器的频率至少为滴答定时器的10倍,见下图:
所以你可以初始化一个1ms的定时器,在FreeRTOSConfig.h提供一个外部变量,并做以下定义:
并且记得在该定时器的中断中要对该外部变量进行自加,这样子配置完,就可以使用该函数了,效果如下:static void vLEDTask( void *pvParameters ) { uint8_t pcWriteBuffer[500]; while(1) { LED_Toggle(GREEN_LED_Toggle); printf("LED Toggle\n"); vTaskList((char *)&pcWriteBuffer); printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n"); printf("%s\r\n", pcWriteBuffer); vTaskGetRunTimeStats((char *)&pcWriteBuffer); printf("\r\n任务名 运行计数 使用率\r\n"); printf("%s\r\n", pcWriteBuffer); } }
参考资料
【安富莱】FreeRTOS操作系统教程发布,支持F103,F407和F429,配套145个例子,1200页教程|FreeRTOS