基于CUBEMX的FREERTOS 调试函数记录

基于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

一、使用函数

  1. 使用了 以下函数:vTaskList()vTaskGetRunTimeStats()xPortGetFreeHeapSize()xPortGetMinimumEverFreeHeapSize()

二、CubeMX配置

  1. 打开FreeRTOS相关的宏,分别是vTaskList()、`vTaskGetRunTimeStats()两个函数所需要的。
    在这里插入图片描述
  2. 开启定时器(定时100us、开启全局中断)
    在这里插入图片描述
    在这里插入图片描述

三、代码配置

  1. 定义全局变量 uint64_t g_osRuntimeCounter = 0;
  2. main.c中:
 extern uint64_t g_osRuntimeCounter;
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)函数中加入
 if (htim->Instance == TIM6)
  {
    g_osRuntimeCounter++;
  }
  1. 开启定时器中断
HAL_TIM_Base_Start_IT(&htim6); 
  1. 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);
}


  1. 在程序中调用debugTask.c的三个函数:
void PrintSysInfo(void)
void debugShowOSTasksRunTimeStats(void)
void  PrintFreeHeap(void)

或在初始化中调用

void DebugTask_Init(void)

四、效果显示

最终三个函数打印效果:
在这里插入图片描述

建议调试完毕关闭这部分功能!不然占用资源

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhuzhu、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值