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
    评论
FreeRTOS中的任务栈是指用于保存任务执行上下文信息的内存区域。任务栈通常位于芯片的RAM中。在FreeRTOS中,任务栈的大小可以通过配置文件或任务创建函数来确定任务栈的大小要足够容纳任务执行所需的变量和函数调用的栈帧信息。 在FreeRTOS中,任务创建函数中的参数值是以字为单位的。而uxTaskGetStackHighWaterMark()函数返回的值也是以字为单位的。因此,需要将这些字节大小的值转换为实际的字节大小任务栈的大小应该根据任务的需求和RAM的可用空间来确定。 需要注意的是,在uC/OS-II中,没有类似FreeRTOS中的configTOTAL_HEAP_SIZE这样的大堆需要配置。在uC/OS-II中,任务栈是静态分配的,没有动态的内存管理,也没有类似malloc()和free()这样的内存管理函数。因此,在uC/OS-II中不存在由于频繁的内存管理导致的内存碎片问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [freertos与STM32分析栈、堆、全局区、常量区、代码区、RAM、ROM,及如何分配堆栈空间](https://blog.csdn.net/qq6738966/article/details/118441134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [FreeRTOS任务栈内存分配](https://blog.csdn.net/weixin_47321452/article/details/121691339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值