目录
1、Cube配置
①配置SYS
②配置TIM3
③配置USART2
④配置FreeRTOS
⑤配置中断优先级
2、代码添加改动
①在main函数合适位置开启TIM3中断
②修改HAL_TIM_PeriodElapsedCallback函数
③完善两个相关函数
④vTaskList与vTaskGetRunTimeStats的使用
vTaskList:获取系统中所有任务的任务名、任务状态、优先级、最小剩余堆栈、创建序号相关信息
vTaskGetRunTimeStats:获取每个任务的运行时间,并统计每个任务占用CPU的时间;
1、Cube配置
①配置SYS
sysTick被FreeRTOS强行占用,设置另外的时钟给HAL延时使用
②配置TIM3
配置TIM3频率为20KHz,用来作为vTaskGetRunTimeStats的计数时钟,不要忘记使能TIM3中断
③配置USART2
用于发送获取到的任务信息
④配置FreeRTOS
CMSIS_V1:支持M0/M0+/M3/M4/M7
CMSIS_V2:支持所有Cortex-M系列,A5/A7/A9
设置堆栈大小为10K,并启用人物计时相关宏
创建任务
⑤配置中断优先级
2、代码添加改动
①在main函数合适位置开启TIM3中断
/* USER CODE BEGIN 2 */
HAL_UART_Transmit(&huart2,(uint8_t*)"HAL_TIM_Base_Start_IT \r\n", 20, HAL_MAX_DELAY);
HAL_TIM_Base_Start_IT(&htim3);
/* USER CODE END 2 */
②修改HAL_TIM_PeriodElapsedCallback函数
if (htim->Instance == TIM3) {
CPU_RunTime++;
}
③完善两个相关函数
__weak void configureTimerForRunTimeStats(void)
{
CPU_RunTime=0;
}
__weak unsigned long getRunTimeCounterValue(void)
{
return CPU_RunTime;
}
④vTaskList与vTaskGetRunTimeStats的使用
void Print_CPURunInfo_Task(void const * argument)
{
/* USER CODE BEGIN Print_CPURunInfo_Task */
char CPU_RunInfo[200];
char buffer0[100]=" Name State Priority LeftStack Number\r\n";
char buffer1[100]=" Name RunCount UtilizeRatio \r\n";
/* Infinite loop */
for(;;)
{
vTaskList(CPU_RunInfo);
HAL_UART_Transmit(&huart2,(uint8_t*)buffer0, strlen(buffer0), HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2,(uint8_t*)CPU_RunInfo, strlen(CPU_RunInfo), HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2,(uint8_t*)"\r\n", 2, HAL_MAX_DELAY);
vTaskGetRunTimeStats(CPU_RunInfo);
HAL_UART_Transmit(&huart2,(uint8_t*)buffer1, strlen(buffer1), HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2,(uint8_t*)CPU_RunInfo, strlen(CPU_RunInfo), HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2,(uint8_t*)"\r\n", 2, HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2,(uint8_t*)"------------------\r\n", 25, HAL_MAX_DELAY);
osDelay(1000);
}
/* USER CODE END Print_CPURunInfo_Task */
}