FreeRTOS教程第8章的调试方法:运行计数为什么为0?
下图红色区域的几个任务,按理说每隔几百ms就运行一次,为啥计数没增加,而只有vTaskUserIF和IDLE任务持续有计数?我按照例程实现也是这个样子,如下第二张图:
这是什么原理呢?谢谢你!
统计的时间单位是50us,如果任务的执行时间低于50us,是统计不到的。 eric2013 发表于 2021-9-16 08:28
统计的时间单位是50us,如果任务的执行时间低于50us,是统计不到的。
您好,意思是其他的闪灯任务运行一次时间小于50us,所以没统计到?谢谢你,我去验证一下,加一句打印。 我的四个任务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);
}
} KaiGe 发表于 2021-9-16 15:41
我的四个任务vTaskUserIF,vTaskLED,vTaskMsgPro,vTaskStart分别主动延时100ms,200ms,400ms,800ms,之前 ...
函数的执行时间主要是你程序里面的代码影响的。你贴的代码里面延迟100还是200影响不大。
vTaskUserIF任务里面的ucKeyCode=STM_EVAL_PBGetState(BUTTON_WAKEUP);在未执行打印功能时,执行时间非常短。
你可以在你的程序里面泡个阻塞的while死循环几万次就有效果了。
/*
*********************************************************************************************************
* 函 数 名: 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% KaiGe 发表于 2021-9-18 14:56
代码如上,目前除了vTaskUserIF次数稍微多点,其他次数都差不多成比例的,打印如下
========= ...
这已将没毛病了。
vTaskStart 1957 <1% ---------------2000
vTaskMsgPro 3912 <1%---------------4000
vTaskLED 7824 <1%--------------- 8000
这几个的时间已将是差不多是2倍递增了,不用追求极致的倍数关系,因为统计本身也是有误差的。
这个问题就交流这么多吧,结贴。
页:
[1]