【STM32 FreeRTOS】任务相关API

获取系统中任务的数量

c 复制代码
UBaseType_t uxTaskGetNumberOfTasks( void );

**返回:**RTOS 内核当前正在管理的任务数。这包括所有准备就绪、阻塞和 挂起的任务。已删除但尚未被空闲任务释放的任务也将包含 在计数中。还包括空闲任务和定时器任务(如果已开软件定时器)。

获取任务历史剩余最小堆栈位

c 复制代码
UBaseType_t uxTaskGetStackHighWaterMark
 ( TaskHandle_t xTask );

**返回:**返回的值是以字为单位的高水位标记(例如,在 32 位计算机上, 返回值为 1 表示有 4 个字节的堆栈未使用)。如果返回值为零, 则任务可能已溢出堆栈。如果返回值接近于零,则任务已接近堆栈溢出 。

这个函数主要用于调测任务堆栈大小的设置,建议该返回值与堆栈大小设置值差不多就行,也就是实际任务使用了一半的堆栈。

以表格的形式获取系统中任务的信息

c 复制代码
configUSE_TRACE_FACILITY
configUSE_STATS_FORMATTING_FUNCTIONS

必须在 FreeRTOSConfig.h 中定义为 1,才可使用此函数。

c 复制代码
void vTaskList( char *pcWriteBuffer );
  • pcWriteBuffer:上述详细信息将以 ASCII 形式写入的缓冲区。假设此缓冲区 的大小足以容纳生成的报告。大约为每个任务分配 40 字节的缓冲区就足够了。

pcWriteBuffer中内容为:

第一列:任务名称

第二列:任务状态信息。X:运行态,B:阻塞态,R:就绪态,S:挂起态,D:删除态

第三列:任务优先级

第四列:任务堆栈的高水位线,就是堆栈历史最小剩余值

第五列:任务编号,这个编号是唯一的,当任务名称相同的时候可以使用这个作区分

c 复制代码
	  UBaseType_t task_num = uxTaskGetNumberOfTasks();
	  printf("task_num = %ld\r\n",task_num);

	  UBaseType_t stack_high_water= uxTaskGetStackHighWaterMark(NULL);
	  printf("stack_high_water = %ld\r\n",stack_high_water);

	  char task_list_buffer[40*6];
	  vTaskList(task_list_buffer);
	  printf("%s\r\n",task_list_buffer);
task_num = 6
stack_high_water = 76
MyTask1        	X	31	76	2
defaultTask    	R	24	117	1
Tmr Svc        	R	2	246	6
IDLE           	R	0	117	5
MyTask2        	B	31	102	3
MyTask3        	B	31	102	4

任务运行时间统计

c 复制代码
void vTaskGetRunTimeStats( char *pcWriteBuffer );

pcWriteBuffer :执行时间将以 ASCII 形式写入的缓冲区。假设此缓冲区 的大小足以容纳生成的报告。大约为每个任务分配 40 字节的缓冲区就足够了。

c 复制代码
configGENERATE_RUN_TIME_STATS

configUSE_STATS_FORMATTING_FUNCTIONS
 
configSUPPORT_DYNAMIC_ALLOCATION

必须定义为 1,才可使用此函数。此外,应用程序还必须提供

c 复制代码
portCONFIGURE_TIMER_FOR_RUN_TIME_STATS
portGET_RUN_TIME_COUNTER_VALUE

的定义,分别用于配置外设 定时器/计数器和返回定时器的当前计数值。计数器的频率应该至少是 滴答计数的 10 倍。

c 复制代码
tim.c文件中

/* USER CODE BEGIN 0 */
unsigned long FreeRTOSRunTimeTicks;
/* USER CODE END 0 */

void MX_TIM7_Init(void)
{

  /* USER CODE BEGIN TIM7_Init 0 */

  /* USER CODE END TIM7_Init 0 */

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM7_Init 1 */
/*
 * TIM7的时钟源是84MHz
 * 分频比设置为84,则一个周期的频率是1MHz(1us)
 * 周期数设置为10,则10us才会产生一个中断
 * */
  /* USER CODE END TIM7_Init 1 */
  htim7.Instance = TIM7;
  htim7.Init.Prescaler = 84-1;
  htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim7.Init.Period = 10-1;
  htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim7) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM7_Init 2 */

  /* USER CODE END TIM7_Init 2 */

}


/* USER CODE BEGIN 1 */

void configureTimerForRunTimeStats()
{
	FreeRTOSRunTimeTicks=0;

	//我们FreeRTOS中的时基是1ms
	//任务运行时间统计API中的时基分辨率最少需要是10倍,我们采取100倍,也就是10us
	//所以配置的TIM7的中断周期是10us.
	HAL_TIM_Base_Start_IT(&htim7);
}


unsigned long getRunTimeCounterValue()
{
	return FreeRTOSRunTimeTicks;
}
/* USER CODE END 1 */
c 复制代码
tim.h文件中

/* USER CODE BEGIN Private defines */
extern unsigned long FreeRTOSRunTimeTicks;
/* USER CODE END Private defines */
c 复制代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM6) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */
  if(htim->Instance ==TIM7)
  {
	  FreeRTOSRunTimeTicks++;
  }
  /* USER CODE END Callback 1 */
}
FreeRTOSConfig.h文件中

/* USER CODE BEGIN 2 */
/* Definitions needed when configGENERATE_RUN_TIME_STATS is on */
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats
#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue
/* USER CODE END 2 */
c 复制代码
char task_list_buffer[40*6];
vTaskGetRunTimeStats(task_list_buffer);
printf("%s\r\n",task_list_buffer);
MyTask1        	2154		<1%
defaultTask    	1080		<1%
IDLE           	998846		99%
MyTask2        	10		<1%
MyTask3        	11		<1%
Tmr Svc        	1		<1%

第一列:任务名称

第二列:运行时间统计时钟的tick数,实际时间为 tick*10us(本例中运行时间统计时钟的频率为10us)

第三列:百分比值

相关推荐
启明云端wireless-tag13 分钟前
ESP32无线WiFi蓝牙SOC,设备物联网通信方案,启明云端乐鑫代理商
嵌入式硬件·物联网·wifi·esp32·乐鑫·wifi模组
爱吃涮毛肚的肥肥(暂时吃不了版)25 分钟前
计算机网络34——Windows内存管理
网络·计算机网络·udp
小狗爱吃黄桃罐头37 分钟前
江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)
stm32·江科大stm32
@@庆1 小时前
stm32 PWR电源控制(修改主频&睡眠模式&停机模式&待机模式)
stm32·单片机·嵌入式硬件
JT灬新一1 小时前
STM32巡回研讨会总结(2024)
stm32·单片机·嵌入式硬件
码哝小鱼1 小时前
firewalld封禁IP或IP段
linux·网络
sec0nd_2 小时前
1网络安全的基本概念
网络·安全·web安全
爱桥代码的程序媛2 小时前
鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之瑞芯微RK3568移植案例
嵌入式硬件·harmonyos·鸿蒙·鸿蒙系统·移植·openharmony·鸿蒙开发
Whappy0012 小时前
51单片机-DA(数字转模拟)
单片机·嵌入式硬件·51单片机
青柠视频云2 小时前
青柠视频云——视频丢包(卡顿、花屏、绿屏)排查
服务器·网络·音视频