KaiGe 发表于 2021-9-15 19:13:24

FreeRTOS教程第8章的调试方法:运行计数为什么为0?

下图红色区域的几个任务,按理说每隔几百ms就运行一次,为啥计数没增加,而只有vTaskUserIF和IDLE任务持续有计数?
我按照例程实现也是这个样子,如下第二张图:
这是什么原理呢?谢谢你!

eric2013 发表于 2021-9-16 08:28:54

统计的时间单位是50us,如果任务的执行时间低于50us,是统计不到的。

KaiGe 发表于 2021-9-16 09:45:31

eric2013 发表于 2021-9-16 08:28
统计的时间单位是50us,如果任务的执行时间低于50us,是统计不到的。

您好,意思是其他的闪灯任务运行一次时间小于50us,所以没统计到?谢谢你,我去验证一下,加一句打印。

KaiGe 发表于 2021-9-16 15:41:48

我的四个任务vTaskUserIF,vTaskLED,vTaskMsgPro,vTaskStart分别主动延时100ms,200ms,400ms,800ms,之前后3个任务都是LED灯闪烁,运行时间小于50us,现在在后面三个任务加了串口打印,任务运行状态如下:

task name        task state        priority        remain stack        task index
vTaskUserIF              X        1        3918        1
IDLE                       R        0        119        5
vTaskMsgPro              B        3        468        3
vTaskStart                 B        4        468        4
vTaskLED                 B        2        468        2
Tmr Svc                    B        2        233        6


task name        run cnt                use rate
vTaskUserIF              7558                <1%
IDLE                       9098094                99%
vTaskStart                 1713                <1%
vTaskLED                 9124                <1%
vTaskMsgPro              4552                <1%
Tmr Svc                    0                <1%

vTaskUserIF主动延时100ms,优先级为1,即优先级最低,运行次数小于主动延时200ms的vTaskLED,????
/*
*********************************************************************************************************
* 函 数 名: vTaskTaskUserIF
* 功能说明: 接口消息处理,这里用作 LED 闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 1 (数值越小优先级越低,这个跟 uCOS 相反)
*********************************************************************************************************
*/
static void vTaskTaskUserIF(void *pvParameters)
{
        uint32_t ucKeyCode;
        uint8_t pcWriteBuffer;
       
        while(1)
        {
                ucKeyCode=STM_EVAL_PBGetState(BUTTON_WAKEUP);
                if(ucKeyCode == 1)
                {
                        printf("=================================================\r\n");
                        printf("task name        task state        priority        remain stack        task index\r\n");
                        vTaskList((char *)&pcWriteBuffer);
                        printf("%s\r\n", pcWriteBuffer);
               
                        printf("\r\ntask name        run cnt                use rate\r\n");
                        vTaskGetRunTimeStats((char *)&pcWriteBuffer);
                        printf("%s\r\n", pcWriteBuffer);
                }

                vTaskDelay(100);
        }
}

/*
*********************************************************************************************************
* 函 数 名: vTaskMsgPro
* 功能说明: 信息处理,这里是用作 LED 闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 3
*********************************************************************************************************
*/
static void vTaskLED(void *pvParameters)
{
        while(1)
        {
                STM_EVAL_LEDToggle(LED2);
                printf("aa");
                vTaskDelay(200);
        }
}
/*
*********************************************************************************************************
* 函 数 名: vTaskMsgPro
* 功能说明: 信息处理,这里是用作 LED 闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 3
*********************************************************************************************************
*/
static void vTaskMsgPro(void *pvParameters)
{
        while(1)
        {
                STM_EVAL_LEDToggle(LED3);
                printf("bb");
                vTaskDelay(400);
        }
}

/*
*********************************************************************************************************
* 函 数 名: vTaskStart
* 功能说明: 启动任务,也就是最高优先级任务,这里用作 LED 闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 4
*********************************************************************************************************
*/
static void vTaskStart(void *pvParameters)
{
        while(1)
        {
                STM_EVAL_LEDToggle(LED4);
                printf("cc");
                vTaskDelay(800);
        }
}

eric2013 发表于 2021-9-17 08:49:49

KaiGe 发表于 2021-9-16 15:41
我的四个任务vTaskUserIF,vTaskLED,vTaskMsgPro,vTaskStart分别主动延时100ms,200ms,400ms,800ms,之前 ...

函数的执行时间主要是你程序里面的代码影响的。你贴的代码里面延迟100还是200影响不大。

vTaskUserIF任务里面的ucKeyCode=STM_EVAL_PBGetState(BUTTON_WAKEUP);在未执行打印功能时,执行时间非常短。

你可以在你的程序里面泡个阻塞的while死循环几万次就有效果了。

KaiGe 发表于 2021-9-18 14:56:04






/*
*********************************************************************************************************
* 函 数 名: vTaskTaskUserIF
* 功能说明: 接口消息处理,这里用作 LED 闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 1 (数值越小优先级越低,这个跟 uCOS 相反)
*********************************************************************************************************
*/
static void vTaskTaskUserIF(void *pvParameters)
{
        uint32_t ucKeyCode,i;
        uint8_t pcWriteBuffer;
       
        while(1)
        {
                ucKeyCode=STM_EVAL_PBGetState(BUTTON_WAKEUP);
                if(ucKeyCode == 1)
                {
                        printf("=================================================\r\n");
                        printf("task name        task state        priority        remain stack        task index\r\n");
                        vTaskList((char *)&pcWriteBuffer);
                        printf("%s\r\n", pcWriteBuffer);
               
                        printf("\r\ntask name        run cnt                use rate\r\n");
                        vTaskGetRunTimeStats((char *)&pcWriteBuffer);
                        printf("%s\r\n", pcWriteBuffer);
                }
               
                for(i=0;i<10000;i++)
                {
               
                }
               
                vTaskDelay(100);
        }
}

/*
*********************************************************************************************************
* 函 数 名: vTaskMsgPro
* 功能说明: 信息处理,这里是用作 LED 闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 3
*********************************************************************************************************
*/
static void vTaskLED(void *pvParameters)
{
        uint32_t i;
       
        while(1)
        {
                STM_EVAL_LEDToggle(LED2);
                for(i=0;i< 10000;i++)
                {
               
                }
                vTaskDelay(200);
        }
}
/*
*********************************************************************************************************
* 函 数 名: vTaskMsgPro
* 功能说明: 信息处理,这里是用作 LED 闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 3
*********************************************************************************************************
*/
static void vTaskMsgPro(void *pvParameters)
{
        uint32_t i;
       
        while(1)
        {
                STM_EVAL_LEDToggle(LED3);
                for(i=0;i< 10000;i++)
                {
               
                }
                vTaskDelay(400);
        }
}

/*
*********************************************************************************************************
* 函 数 名: vTaskStart
* 功能说明: 启动任务,也就是最高优先级任务,这里用作 LED 闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 4
*********************************************************************************************************
*/
static void vTaskStart(void *pvParameters)
{
        uint32_t i;
       
        while(1)
        {
                STM_EVAL_LEDToggle(LED4);
                for(i=0;i< 10000;i++)
                {
               
                }
               
                vTaskDelay(800);
        }
}
代码如上,目前除了vTaskUserIF次数稍微多点,其他次数都差不多成比例的,打印如下
=================================================
task name        task state        priority        remain stack        task index
vTaskUserIF              X        1        3917        1
IDLE                       R        0        119        5
vTaskMsgPro              B        3        489        3
vTaskLED                 B        2        489        2
vTaskStart                 B        4        489        4
Tmr Svc                    B        2        233        6


task name        run cnt                use rate
vTaskUserIF              26801                <1%
IDLE                       5172747                99%
vTaskLED                 7824                <1%
vTaskStart                 1957                <1%
vTaskMsgPro              3912                <1%
Tmr Svc                    0                <1%

eric2013 发表于 2021-9-18 17:27:10

KaiGe 发表于 2021-9-18 14:56
代码如上,目前除了vTaskUserIF次数稍微多点,其他次数都差不多成比例的,打印如下
========= ...

这已将没毛病了。

vTaskStart               1957                <1%   ---------------2000
vTaskMsgPro                3912            <1%---------------4000
vTaskLED                   7824               <1%--------------- 8000

这几个的时间已将是差不多是2倍递增了,不用追求极致的倍数关系,因为统计本身也是有误差的。

这个问题就交流这么多吧,结贴。
页: [1]
查看完整版本: FreeRTOS教程第8章的调试方法:运行计数为什么为0?