Stm32CubeMx +FreeRtos 添加系统任务状态及任务运行显示(vTaskList +vTaskGetRunTimeStats)(纯应用)

时间:2024-04-10 08:17:10

实现效果

 

Stm32CubeMx +FreeRtos 添加系统任务状态及任务运行显示(vTaskList +vTaskGetRunTimeStats)(纯应用)

(一)添加任务状态及占用时间显示, 需要设置基本定时器计数使用用于FreeRtos系统调用

配置Time6定时器(开启中断周期至少为100us)

Stm32CubeMx +FreeRtos 添加系统任务状态及任务运行显示(vTaskList +vTaskGetRunTimeStats)(纯应用)

开启中断

Stm32CubeMx +FreeRtos 添加系统任务状态及任务运行显示(vTaskList +vTaskGetRunTimeStats)(纯应用)

(二)打开系统调用任务查看宏定义Stm32CubeMx +FreeRtos 添加系统任务状态及任务运行显示(vTaskList +vTaskGetRunTimeStats)(纯应用)

 

(三)在main中添加全局系统时间计数统计变量

3.1 定时时间计数全局变量

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

uint32_t g_osRuntimeCounter = 0;

char g_tasks_buf[512]; //用于存放显示数据

/* USER CODE END PV */

3.2打开定时器

/* USER CODE BEGIN 2 */

HAL_TIM_Base_Start_IT(&htim6); //开启freeRtos系统计数定时器,要求中断时间至少为100us

STM32F1XXAInit();

controlInit( );

STM32USARTInit();

/* USER CODE END 2 */

3.3在main.c中定时器中断中添加Tim6中断处理函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

/* USER CODE BEGIN Callback 0 */

/* USER CODE END Callback 0 */

if (htim->Instance == TIM4) {

HAL_IncTick();

}

/* USER CODE BEGIN Callback 1 */

if (htim->Instance == TIM6) {

g_osRuntimeCounter ++;

}

/* USER CODE END Callback 1 */

}

(四) 在freertos中添加对全局变量的处理

/* USER CODE BEGIN Variables */

extern uint32_t g_osRuntimeCounter ;

/* USER CODE END Variables */

/* USER CODE BEGIN 1 */

/* Functions needed when configGENERATE_RUN_TIME_STATS is on */

__weak void configureTimerForRunTimeStats(void)

{

g_osRuntimeCounter = 0;

}

 

__weak unsigned long getRunTimeCounterValue(void)

{

return g_osRuntimeCounter;

}

/* USER CODE END 1 */

(5)添加对运行状态及运行时间的处理函数,并在合适的地点调用

void debugShowOSTasksLists(void);

void debugShowOSTasksRunTimeStats(void);

 

void debugShowOSTasksLists(void)

{

#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )

memset(g_tasks_buf, 0, 512);

strcat((char *)g_tasks_buf, "\r\n任务名称 运行状态 优先级 剩余堆栈 任务序号\r\n" );

strcat((char *)g_tasks_buf, "---------------------------------------------\r\n");

/* The list of tasks and their status */

//osThreadList ((char *)(g_tasks_buf + strlen(g_tasks_buf)));

vTaskList((char *)(g_tasks_buf + strlen(g_tasks_buf)));

strcat((char *)g_tasks_buf, "---------------------------------------------\r\n");

//strcat((char *)g_tasks_buf, "B : Blocked, R : Ready, D : Deleted, S : Suspended\r\n");

strcat((char *)g_tasks_buf, "B : 阻塞, R : 就绪, D : 删除, S : 暂停\r\n");

UART1SendLen( (uint8_t *)g_tasks_buf, strlen(g_tasks_buf));

#endif

}

void debugShowOSTasksRunTimeStats(void)

{

#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )

memset(g_tasks_buf, 0, 512);

strcat((char *)g_tasks_buf, "\r\n任务名称\t运行计数\t使用率\r\n" );

strcat((char *)g_tasks_buf, "---------------------------------------------\r\n");

/* displays the amount of time each task has spent in the Running state

* in both absolute and percentage terms. */

vTaskGetRunTimeStats((char *)(g_tasks_buf + strlen(g_tasks_buf)));

strcat((char *)g_tasks_buf, "---------------------------------------------\r\n");

UART1SendLen( (uint8_t *)g_tasks_buf, strlen(g_tasks_buf));

#endif

}

注意:如果不能正常获取运行数据,可能原因 如下

1)调用(四)中两个函数的任务,其堆栈设置太小

2)调用(四)中两个函数的任务,其任务优先级设置太低