基于CUBEMX的FREERTOS 调试函数记录
参考了以下帖子,介绍部分我不再赘述,参考帖子中有介绍。
https://www.pianshen.com/article/2233283539/
https://blog.csdn.net/weixin_39270987/article/details/113523534
https://blog.csdn.net/ba_wang_mao/article/details/107644953
一、使用函数
- 使用了 以下函数:
vTaskList()
、vTaskGetRunTimeStats()
、xPortGetFreeHeapSize()
、xPortGetMinimumEverFreeHeapSize()
。
二、CubeMX配置
- 打开FreeRTOS相关的宏,分别是
vTaskList()
、`vTaskGetRunTimeStats()两个函数所需要的。
- 开启定时器(定时100us、开启全局中断)
三、代码配置
- 定义全局变量
uint64_t g_osRuntimeCounter = 0;
- 在
main.c
中:
extern uint64_t g_osRuntimeCounter;
- 在
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
函数中加入
if (htim->Instance == TIM6)
{
g_osRuntimeCounter++;
}
- 开启定时器中断
HAL_TIM_Base_Start_IT(&htim6);
- 将
debugTask.c
加入工程
```c
#include "FreeRTOS.h"
#include "task.h"
#include <stdio.h>
#include <string.h>
#include <usart.h>
#include <tim.h>
void DebugTask_Init(void)
{
void DebugTask(void *argument);
xTaskCreate(DebugTask,"DebugTask",512,NULL,1,NULL);
}
//调试任务
void DebugTask(void *argument)
{
//调试
HAL_TIM_Base_Start_IT(&htim6);
void PrintSysInfo(void);
void debugShowOSTasksRunTimeStats(void);
void PrintFreeHeap(void);
for(;;)
{
PrintSysInfo();
debugShowOSTasksRunTimeStats();
PrintFreeHeap();
vTaskDelay(5000);
}
}
/*
函数原型:void vTaskList( char * pcWriteBuffer );
函数功能:获取系统中所有任务的任务名、任务状态、优先级、最小剩余堆栈、创建序号相关信息;
*/
void PrintSysInfo(void)
{
char *buf = NULL;
char *fmt = "\r\n=============================================================\r\nname\t\tstatus\tpri\tmin-stack\tnum\r\n=============================================================\r\n";
buf = pvPortMalloc(512);
if(NULL == buf)return;
sprintf(buf,"%s",fmt);
vTaskList(buf+strlen(fmt));
//我个人的串口发送函数,自行替换
HAL_GPIO_WritePin(USART3_DE_GPIO_Port,USART3_DE_Pin,GPIO_PIN_SET);
HAL_UART_Transmit(&huart3,(uint8_t*)buf,strlen(buf),1000);
HAL_GPIO_WritePin(USART3_DE_GPIO_Port,USART3_DE_Pin,GPIO_PIN_RESET);
vPortFree(buf);
}
//定义用于时间片统计的变量
uint64_t g_osRuntimeCounter = 0;
/*
在cubeMX 开启以下
#define configGENERATE_RUN_TIME_STATS 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
HAL_TIM_Base_Start_IT(&htim6); //开启freeRtos系统计数定时器,要求中断时间至少为100us
main.c 中添加
extern uint64_t g_osRuntimeCounter;
if (htim->Instance == TIM6) {
g_osRuntimeCounter++;
}
*/
void configureTimerForRunTimeStats(void)
{
g_osRuntimeCounter = 0;
}
unsigned long getRunTimeCounterValue(void)
{
return g_osRuntimeCounter;
}
//打印程序占用率
void debugShowOSTasksRunTimeStats(void)
{
#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
char *g_tasks_buf = NULL;
g_tasks_buf = pvPortMalloc(512);
memset(g_tasks_buf, 0, 512);
strcat((char *)g_tasks_buf, "\r\nname\t\tcount\t\trate\r\n" );
strcat((char *)g_tasks_buf, "-------------------------------------------------\r\n");
vTaskGetRunTimeStats((char *)(g_tasks_buf + strlen(g_tasks_buf)));
strcat((char *)g_tasks_buf, "-------------------------------------------------\r\n");
//我个人的串口发送函数,自行替换
HAL_GPIO_WritePin(USART3_DE_GPIO_Port,USART3_DE_Pin,GPIO_PIN_SET);
HAL_UART_Transmit(&huart3,(uint8_t*)g_tasks_buf,strlen(g_tasks_buf),1000);
HAL_GPIO_WritePin(USART3_DE_GPIO_Port,USART3_DE_Pin,GPIO_PIN_RESET);
vPortFree(g_tasks_buf);
#endif
}
//打印系统剩余总Heap
void PrintFreeHeap(void)
{
char *buf = NULL;
buf = pvPortMalloc(512);
memset(buf, 0, 512);
sprintf(buf,"FreeHeap\t%d\tMinHeap\t%d\r\n",xPortGetFreeHeapSize(),xPortGetMinimumEverFreeHeapSize());
strcat((char *)buf, "-------------------------------------------------\r\n");
//我个人的串口发送函数,自行替换
HAL_GPIO_WritePin(USART3_DE_GPIO_Port,USART3_DE_Pin,GPIO_PIN_SET);
HAL_UART_Transmit(&huart3,(uint8_t*)buf,strlen(buf),1000);
HAL_GPIO_WritePin(USART3_DE_GPIO_Port,USART3_DE_Pin,GPIO_PIN_RESET);
vPortFree(buf);
}
- 在程序中调用
debugTask.c
的三个函数:
void PrintSysInfo(void)
void debugShowOSTasksRunTimeStats(void)
void PrintFreeHeap(void)
或在初始化中调用
void DebugTask_Init(void)
四、效果显示
最终三个函数打印效果:
建议调试完毕关闭这部分功能!不然占用资源