打印
[应用相关]

FreeRTOS 调试–打印任务执行情况

[复制链接]
905|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FreeRTOS 调试–打印任务执行情况

官方API函数中有两个函数可以提供任务的一些情况,一个是:
void vTaskList( char * pcWriteBuffer )
第二个是:
void vTaskGetRunTimeStats( char *pcWriteBuffer );
下面就介绍下这两个函数:

沙发
goodluck09876|  楼主 | 2018-9-11 10:59 | 只看该作者
任务列表函数: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);   
        }
    }

使用特权

评论回复
板凳
goodluck09876|  楼主 | 2018-9-11 10:59 | 只看该作者
在工程中创建上述任务,编译提示不通过,

使用特权

评论回复
地板
goodluck09876|  楼主 | 2018-9-11 10:59 | 只看该作者
使用sourceinsight跟踪源代码,发现xTaskList()前有条件编译

使用特权

评论回复
5
goodluck09876|  楼主 | 2018-9-11 11:00 | 只看该作者
所以必须满足条件编译条件才能使用该函数,那么就需要将FreeRTOSConfig.h中



改为:#define configUSE_TRACE_FACILITY 1
并且在 FreeRTOSConfig.h中添加:
#define configUSE_STATS_FORMATTING_FUNCTIONS 1

使用特权

评论回复
6
goodluck09876|  楼主 | 2018-9-11 11:00 | 只看该作者
这样子配置完,编译通过,打印效果如下图:

使用特权

评论回复
7
goodluck09876|  楼主 | 2018-9-11 11:01 | 只看该作者
其中要注意的是剩余栈的大小单位是WORD,如IDLE的剩余栈大小为:118*4=472字节。

任务运行状态函数:void vTaskGetRunTimeStats( char *pcWriteBuffer ),该函数可以提供相应任务的计数以及相应的占用率;要获准任务准确的运行状态,需要定义一个初始化一个定时器,用来提供相应的计时,FreeRTOS要求该定时器的频率至少为滴答定时器的10倍,见下图:

使用特权

评论回复
8
goodluck09876|  楼主 | 2018-9-11 11:01 | 只看该作者
所以你可以初始化一个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);        
        }
    }

使用特权

评论回复
9
goodluck09876|  楼主 | 2018-9-11 11:01 | 只看该作者
以下是测试结果:

使用特权

评论回复
10
goodluck09876|  楼主 | 2018-9-11 11:02 | 只看该作者
测试效果 杠杠滴!

使用特权

评论回复
11
磨砂| | 2018-9-11 13:09 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
12
晓伍| | 2018-9-11 13:13 | 只看该作者
楼主的讲解很详细

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

5843

帖子

20

粉丝