STM32 CubeMX
STM32 CubeMX (第四步Freertos内存管理和CPU使用率)
- STM32 CubeMX
- 一、STM32 CubeMX设置
- 时钟配置
- HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)
- 使用STM32 CubeMX 库,配置Freertos
- 使能定时器,计时0.1中断
- 使能宏定义
- 二、实验一,CPU使用率
- 配置代码
- 任务代码
- 实验现象
学习使用Freertos第四步
在 FreeRTOS 中,中断管理和软件定时:
- ·
taskENTER_CRITICAL()
·; 是一个函数在 FreeRTOS 中使用的,用于进入临界区(critical section)。在临界区内,中断会被禁用,这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用 · taskENTER_CRITICAL()
·; 来禁用中断,然后在临界区结束时使用 taskEXIT_CRITICAL();
来重新启用中断。这样可以防止多个任务同时访问共享资源而导致的竞态条件。
一、STM32 CubeMX设置
时钟配置
HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)
使用STM32 CubeMX 库,配置Freertos
选择CMISS_V1接口就可以满足Freertos接口;且代码量比CMISS_V2小(CMISS_V2支持更多的RTOS接口,所以代码量比CMISS_V1多)
使能定时器,计时0.1中断
使能宏定义
二、实验一,CPU使用率
设置时基
配置代码
__weak void configureTimerForRunTimeStats(void)
{
g_osRuntimeCounter=0;
}
__weak unsigned long getRunTimeCounterValue(void)
{
return g_osRuntimeCounter;
}
任务代码
void StartDefaultTask1(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask1 */
/* Infinite loop */
for(;;)
{
printf("Task01 \r\n"); // printf输出字符串
osDelay(1000);
}
/* USER CODE END StartDefaultTask1 */
}
/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the Task02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
printf("Task02 \r\n"); // printf输出字符串
osDelay(1000);
}
/* USER CODE END StartTask02 */
}
/* USER CODE BEGIN Header_CpuStartTask03 */
/**
* @brief Function implementing the CpuTask03 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_CpuStartTask03 */
uint8_t CPU_RunInfo[400]; //保存任务运行时间信息
void CpuStartTask03(void const * argument)
{
/* Infinite loop */
for(;;)
{
printf(" B:阻塞 R:就绪 D:删除 S:暂停 X:运行 \r\n");
memset(CPU_RunInfo,0,400); //信息缓冲区清零
osThreadList(CPU_RunInfo); //获取任务运行时间信息
printf("---------------------------------------------\r\n");
printf("Task Task_Status Priority Remaining_Stack Task_No\r\n");
printf("%s", CPU_RunInfo);
printf("---------------------------------------------\r\n");
// memset(CPU_RunInfo,0,400); //信息缓冲区清零
//
// vTaskGetRunTimeStats((char *)&CPU_RunInfo);
//
// printf("Task Running_Count Utilization\r\n");
// printf("%s", CPU_RunInfo);
// printf("---------------------------------------------\r\n\n");
osDelay(1000);
}
}