实现效果
(一)添加任务状态及占用时间显示, 需要设置基本定时器计数使用用于FreeRtos系统调用
配置Time6定时器(开启中断周期至少为100us)
开启中断
(二)打开系统调用任务查看宏定义
(三)在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)调用(四)中两个函数的任务,其任务优先级设置太低