STMCubeMX+Freertos+打印内存占用率

本文介绍了如何使用STM32CubeMX配置FreeRTOS,结合定时器中断来统计任务运行时间和CPU使用率。通过开启特定选项并设置定时器,可以在运行时获取系统负载信息,并通过串口打印任务状态、优先级、剩余栈空间等详细信息,帮助进行系统性能分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STMCubeMX+Freertos+打印内存占用率

CubeMX配置

在这里插入图片描述
开启红框中3个选项,都设置为Enable.

在这里插入图片描述
设置一个定时器,定时时间10us~50us,freertos一个时间片为1ms, 定时中断计数用于统计当前运行哪个任务。

代码

/* USER CODE BEGIN 1 */
/* Functions needed when configGENERATE_RUN_TIME_STATS is on */
__weak void configureTimerForRunTimeStats(void)
{
  ulHighFrequencyTimerTicks = 0ul;
}

__weak unsigned long getRunTimeCounterValue(void)
{
  return ulHighFrequencyTimerTicks;
}
/* USER CODE END 1 */

在FreeRTOSConfig.h声明变量

#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
    #include <stdint.h>
    extern uint32_t SystemCoreClock;
/* USER CODE BEGIN 0 */   	      
    extern volatile uint32_t ulHighFrequencyTimerTicks;    
    extern void configureTimerForRunTimeStats(void);
    extern unsigned long getRunTimeCounterValue(void);  
/* USER CODE END 0 */       
#endif
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM7) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */
#ifdef  REPORT_MSG    //报告系统负载信息
    else if(htim->Instance == TIM6)
        ulHighFrequencyTimerTicks++;
#endif
  /* USER CODE END Callback 1 */
}

打印任务:

#ifdef  REPORT_MSG    //报告系统负载信息
uint8_t pcWriteBuffer[500];
const uint8_t TaskShow1[34]="\r\n任务\t\t状态\t优先级\t剩余栈\t序号\r\n",TaskShow2[30]="\r\n任务\t\t运行计数\tCPU 使用率\r\n";
#endif
/* USER CODE END Header_StartTaskMSG */
void StartTaskMSG(void const * argument)
{
  /* USER CODE BEGIN StartTaskMSG */
#ifdef  REPORT_MSG    //报告系统负载信息
    HAL_TIM_Base_Start_IT(&htim6);
  /* Infinite loop */
  for(;;)
  {
	vTaskList((char *)&pcWriteBuffer);
	osMutexWait(myMutexPrintMsgHandle, portMAX_DELAY);
	printf("%s\r\n",TaskShow1);
	printf("%s\r\n",pcWriteBuffer);
	osMutexRelease(myMutexPrintMsgHandle);
	memset(pcWriteBuffer,' ',sizeof(pcWriteBuffer));
	vTaskGetRunTimeStats((char *)&pcWriteBuffer);
	osMutexWait(myMutexPrintMsgHandle, portMAX_DELAY);
	printf("%s\r\n",TaskShow2);
	printf("%s\r\n",pcWriteBuffer);
	osMutexRelease(myMutexPrintMsgHandle);
	memset(pcWriteBuffer,' ',sizeof(pcWriteBuffer));
	osDelay(1000);
  }
#endif
  /* USER CODE END StartTaskMSG */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值