FreeRTOS任务堆栈大小确定以及CPU利用率统计

任务堆栈大小确定

任务堆栈大小确定

任务堆栈大小确定方案

MDK-htm文件分析

堆栈检测API

栈溢出检测

任务状态信息打印

任务堆栈检测应用

栈溢出检测方案一

cubemx配置

使能下面的两个宏

代码
/* USER CODE BEGIN Header_Usart_Task */
void vStackOverFlowTest(void)
{
	uint8_t u8TestBuff[128];
	int16_t i;
	(void)u8TestBuff;
	for(i=360;i>=0;i--){
		u8TestBuff[i] = 0x88;
	}
	
}
/* USER CODE END Header_Usart_Task */
void Usart_Task(void const * argument)
{
  /* USER CODE BEGIN Usart_Task */
  /* Infinite loop */
  for(;;)
  {
		
		vStackOverFlowTest();
		osDelay(2);
  }
  /* USER CODE END Usart_Task */
}
/* USER CODE BEGIN 4 */
__weak void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)
{
   /* Run time stack overflow checking is performed if
   configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook function is
   called if a stack overflow is detected. */
	printf("%s is stack over flow\r\n",pcTaskName);
}
/* USER CODE END 4 */
实验现象

 

栈溢出检测方案二

其他操作以及代码和方案一相同

将这个宏修改为2

实验现象

 

获取任务状态方案

代码
/* USER CODE BEGIN Header_Key_Task */
uint8_t u8TaskListBuff[400];

/**
* @brief Function implementing the KeyTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Key_Task */
void Key_Task(void const * argument)
{
  /* USER CODE BEGIN Key_Task */
	
	KeyStatus = Key_RESET;
 
	/* Infinite loop */
  for(;;)
  {
		if(KeyStatus == Key_DOWN){
			//挂起LED任务
			memset(u8TaskListBuff, 0, 400);
			vTaskList((char *)u8TaskListBuff);
			printf("Name  Data  Priority  Stack  Num\r\n");
			printf("***************************************\r\n");
			printf("%s",u8TaskListBuff);
			printf("***************************************\r\n");
			KeyStatus = Key_RESET;
		}
		if(KeyStatus == Key_UP){
			//恢复LED任务
			
			KeyStatus = Key_RESET;
		}
    osDelay(10);
  }
  /* USER CODE END Key_Task */
}
实验现象

任务名称Name

任务状态Data

任务优先级Priority

任务剩余堆栈Stack

任务序号Num

CPU利用率统计应用

CPU利用率统计的作用

CPU利用率

CPU利用率统计API

CPU利用率统计实现

CPU利用率统计业务流程

cubemx配置

打开tim6并使能中断,计时50us

使能该宏定义

代码

在main函数中

/* USER CODE BEGIN Header_Key_Task */
uint8_t u8TaskListBuff[400];

/**
* @brief Function implementing the KeyTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Key_Task */
void Key_Task(void const * argument)
{
  /* USER CODE BEGIN Key_Task */
	
	KeyStatus = Key_RESET;
 
	/* Infinite loop */
  for(;;)
  {
		if(KeyStatus == Key_DOWN){
			//挂起LED任务
			memset(u8TaskListBuff, 0, 400);
			vTaskGetRunTimeStats((char *)u8TaskListBuff);
			printf("任务名         运行计数      使用率\r\n");
			printf("***************************************\r\n");
			printf("%s",u8TaskListBuff);
			printf("***************************************\r\n");
			KeyStatus = Key_RESET;
		}
		if(KeyStatus == Key_UP){
			//恢复LED任务
			
			KeyStatus = Key_RESET;
		}
    osDelay(10);
  }
  /* USER CODE END Key_Task */
}
实验现象

  • 26
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值