硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1807|回复: 6
收起左侧

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

[复制链接]

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2021-9-15 19:13:24 | 显示全部楼层 |阅读模式
下图红色区域的几个任务,按理说每隔几百ms就运行一次,为啥计数没增加,而只有vTaskUserIF和IDLE任务持续有计数
我按照例程实现也是这个样子,如下第二张图:
这是什么原理呢?谢谢你!

这是什么原理呢?

这是什么原理呢?

上述红色区域的几个任务,按理说每隔几百ms就运行一次,为啥计数没增加,而只有vTaskUserIF和IDLE任务持续 ...

上述红色区域的几个任务,按理说每隔几百ms就运行一次,为啥计数没增加,而只有vTaskUserIF和IDLE任务持续  ...
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106405
QQ
发表于 2021-9-16 08:28:54 | 显示全部楼层

回帖奖励 +1 个金币

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

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2021-9-16 09:45:31 | 显示全部楼层
eric2013 发表于 2021-9-16 08:28
统计的时间单位是50us,如果任务的执行时间低于50us,是统计不到的。

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

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 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,????
  1. /*
  2. *********************************************************************************************************
  3. * 函 数 名: vTaskTaskUserIF
  4. * 功能说明: 接口消息处理,这里用作 LED 闪烁
  5. * 形 参: pvParameters 是在创建该任务时传递的形参
  6. * 返 回 值: 无
  7. * 优 先 级: 1 (数值越小优先级越低,这个跟 uCOS 相反)
  8. *********************************************************************************************************
  9. */
  10. static void vTaskTaskUserIF(void *pvParameters)
  11. {
  12.         uint32_t ucKeyCode;
  13.         uint8_t pcWriteBuffer[500];
  14.        
  15.         while(1)
  16.         {
  17.                 ucKeyCode=STM_EVAL_PBGetState(BUTTON_WAKEUP);
  18.                 if(ucKeyCode == 1)
  19.                 {
  20.                         printf("=================================================\r\n");
  21.                         printf("task name        task state        priority        remain stack        task index\r\n");
  22.                         vTaskList((char *)&pcWriteBuffer[0]);
  23.                         printf("%s\r\n", pcWriteBuffer);
  24.                
  25.                         printf("\r\ntask name        run cnt                use rate\r\n");
  26.                         vTaskGetRunTimeStats((char *)&pcWriteBuffer[0]);
  27.                         printf("%s\r\n", pcWriteBuffer);
  28.                 }

  29.                 vTaskDelay(100);
  30.         }
  31. }

  32. /*
  33. *********************************************************************************************************
  34. * 函 数 名: vTaskMsgPro
  35. * 功能说明: 信息处理,这里是用作 LED 闪烁
  36. * 形 参: pvParameters 是在创建该任务时传递的形参
  37. * 返 回 值: 无
  38. * 优 先 级: 3
  39. *********************************************************************************************************
  40. */
  41. static void vTaskLED(void *pvParameters)
  42. {
  43.         while(1)
  44.         {
  45.                 STM_EVAL_LEDToggle(LED2);
  46.                 printf("aa");
  47.                 vTaskDelay(200);
  48.         }
  49. }
  50. /*
  51. *********************************************************************************************************
  52. * 函 数 名: vTaskMsgPro
  53. * 功能说明: 信息处理,这里是用作 LED 闪烁
  54. * 形 参: pvParameters 是在创建该任务时传递的形参
  55. * 返 回 值: 无
  56. * 优 先 级: 3
  57. *********************************************************************************************************
  58. */
  59. static void vTaskMsgPro(void *pvParameters)
  60. {
  61.         while(1)
  62.         {
  63.                 STM_EVAL_LEDToggle(LED3);
  64.                 printf("bb");
  65.                 vTaskDelay(400);
  66.         }
  67. }

  68. /*
  69. *********************************************************************************************************
  70. * 函 数 名: vTaskStart
  71. * 功能说明: 启动任务,也就是最高优先级任务,这里用作 LED 闪烁
  72. * 形 参: pvParameters 是在创建该任务时传递的形参
  73. * 返 回 值: 无
  74. * 优 先 级: 4
  75. *********************************************************************************************************
  76. */
  77. static void vTaskStart(void *pvParameters)
  78. {
  79.         while(1)
  80.         {
  81.                 STM_EVAL_LEDToggle(LED4);
  82.                 printf("cc");
  83.                 vTaskDelay(800);
  84.         }
  85. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106405
QQ
发表于 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死循环几万次就有效果了。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2021-9-18 14:56:04 | 显示全部楼层





  1. /*
  2. *********************************************************************************************************
  3. * 函 数 名: vTaskTaskUserIF
  4. * 功能说明: 接口消息处理,这里用作 LED 闪烁
  5. * 形 参: pvParameters 是在创建该任务时传递的形参
  6. * 返 回 值: 无
  7. * 优 先 级: 1 (数值越小优先级越低,这个跟 uCOS 相反)
  8. *********************************************************************************************************
  9. */
  10. static void vTaskTaskUserIF(void *pvParameters)
  11. {
  12.         uint32_t ucKeyCode,i;
  13.         uint8_t pcWriteBuffer[500];
  14.        
  15.         while(1)
  16.         {
  17.                 ucKeyCode=STM_EVAL_PBGetState(BUTTON_WAKEUP);
  18.                 if(ucKeyCode == 1)
  19.                 {
  20.                         printf("=================================================\r\n");
  21.                         printf("task name        task state        priority        remain stack        task index\r\n");
  22.                         vTaskList((char *)&pcWriteBuffer[0]);
  23.                         printf("%s\r\n", pcWriteBuffer);
  24.                
  25.                         printf("\r\ntask name        run cnt                use rate\r\n");
  26.                         vTaskGetRunTimeStats((char *)&pcWriteBuffer[0]);
  27.                         printf("%s\r\n", pcWriteBuffer);
  28.                 }
  29.                
  30.                 for(i=0;i<10000;i++)
  31.                 {
  32.                
  33.                 }
  34.                
  35.                 vTaskDelay(100);
  36.         }
  37. }

  38. /*
  39. *********************************************************************************************************
  40. * 函 数 名: vTaskMsgPro
  41. * 功能说明: 信息处理,这里是用作 LED 闪烁
  42. * 形 参: pvParameters 是在创建该任务时传递的形参
  43. * 返 回 值: 无
  44. * 优 先 级: 3
  45. *********************************************************************************************************
  46. */
  47. static void vTaskLED(void *pvParameters)
  48. {
  49.         uint32_t i;
  50.        
  51.         while(1)
  52.         {
  53.                 STM_EVAL_LEDToggle(LED2);
  54.                 for(i=0;i< 10000;i++)
  55.                 {
  56.                
  57.                 }
  58.                 vTaskDelay(200);
  59.         }
  60. }
  61. /*
  62. *********************************************************************************************************
  63. * 函 数 名: vTaskMsgPro
  64. * 功能说明: 信息处理,这里是用作 LED 闪烁
  65. * 形 参: pvParameters 是在创建该任务时传递的形参
  66. * 返 回 值: 无
  67. * 优 先 级: 3
  68. *********************************************************************************************************
  69. */
  70. static void vTaskMsgPro(void *pvParameters)
  71. {
  72.         uint32_t i;
  73.        
  74.         while(1)
  75.         {
  76.                 STM_EVAL_LEDToggle(LED3);
  77.                 for(i=0;i< 10000;i++)
  78.                 {
  79.                
  80.                 }
  81.                 vTaskDelay(400);
  82.         }
  83. }

  84. /*
  85. *********************************************************************************************************
  86. * 函 数 名: vTaskStart
  87. * 功能说明: 启动任务,也就是最高优先级任务,这里用作 LED 闪烁
  88. * 形 参: pvParameters 是在创建该任务时传递的形参
  89. * 返 回 值: 无
  90. * 优 先 级: 4
  91. *********************************************************************************************************
  92. */
  93. static void vTaskStart(void *pvParameters)
  94. {
  95.         uint32_t i;
  96.        
  97.         while(1)
  98.         {
  99.                 STM_EVAL_LEDToggle(LED4);
  100.                 for(i=0;i< 10000;i++)
  101.                 {
  102.                
  103.                 }
  104.                
  105.                 vTaskDelay(800);
  106.         }
  107. }
复制代码

代码如上,目前除了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%
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106405
QQ
发表于 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倍递增了,不用追求极致的倍数关系,因为统计本身也是有误差的。

这个问题就交流这么多吧,结贴。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-19 13:31 , Processed in 0.240558 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表