为了查看freertos的各个任务对堆栈的消耗等情况,我们往往需要一个Debug任务,在正式使用时可以注释掉这个任务。开发过程中可以按下按键就进行Debug。
效果有点像我们Windows的任务管理器。
请确保你已经完成了FreeRtos队列的初始化等工作。
步骤如下:
(1)声明
/* 调试任务优先级 */
#define Debug_TASK_PRIO 2
/* 调试任务堆栈大小 */
#define Debug_STK_SIZE 256
/* 调试任务句柄 */
TaskHandle_t DebugTask_Handler;
/* 调试任务入口函数 */
void debug_task(void *pvParameters);
(2)在main函数中创建
/* 创建调试任务
xTaskCreate((TaskFunction_t )debug_task,
(const char* )"Debug_task",
(uint16_t )Debug_STK_SIZE,
(void* )NULL,
(UBaseType_t )Debug_TASK_PRIO,
(TaskHandle_t* )&DebugTask_Handler);
(3)编写任务函数内容
注意这里如果没有KEY按下,永远不会print后面的内容,也不会去判断。这和一直扫描按键有所区别。
/* 调试任务函数 */
void debug_task(void *pvParameters)
{
u8 buff[500];
uint8_t key_value;
while(1)
{
xQueueReceive(xQueue2,&key_value,portMAX_DELAY);
/* 按下按键打印一次调试信息 */
if(key_value == KEY_3_DOWN)
{
BEEP_Start(5,1,1);
key_value = KEY_NONE;
printf("/*-----------------------------------------------------------------------------*/\r\n");
printf("Task Status priority Remaining_Stack Num\r\n");
vTaskList((char *)&buff);
printf("%s\r\n",buff);
printf("/*----------------------------------------------------------------------------*/\r\n");
printf("Task Runing_Num Usage_Rate\r\n");
vTaskGetRunTimeStats((char *)&buff);
printf("%s\r\n",buff);
}
vTaskDelay(10);
}
}
(4)在定时器中扫描按键,按键按下就发
//20ms定时器
{
key_value = bsp_GetKey();
switch(key_value)
{
//Debug
case KEY_3_DOWN:
{
xQueueSend(xQueue2,&key_value,portMAX_DELAY);
break;
}
default: break;
}
}
在串口调试助手中可以很方便地查看了