网站受到攻击 怎么做,做网页要多少钱,如何更换网站域名,模板规格文章目录 前言一、Freertos可视化配置二、生成代码三、实验现象总结 前言
FreeRTOS#xff08;Real-Time Operating System#xff09;是一个开源的实时操作系统内核#xff0c;专注于嵌入式系统。它提供了一套用于管理任务、调度器、内存管理等的实时操作系统功能#xf… 文章目录 前言一、Freertos可视化配置二、生成代码三、实验现象总结 前言
FreeRTOSReal-Time Operating System是一个开源的实时操作系统内核专注于嵌入式系统。它提供了一套用于管理任务、调度器、内存管理等的实时操作系统功能为嵌入式应用程序提供了强大的任务管理和资源管理能力。 CubeMX集成了许多中间件和库包括FreeRTOS。通过简单的选择用户可以轻松地启用和配置FreeRTOS而不需要手动整合和调整。 一、Freertos可视化配置 配置外部高速时钟 根据芯片手册配置外部晶振使用外部晶振作为系统时钟源频率更准确 配置FreeRTOS
生成.c和.h文件对
生成代码时出现警告原因是FreeRTOS将systick作为时钟源因此需要设置另外一个定时器作为HAL库的时钟源 动态创建两个任务
一些基本参数的设置
二、生成代码
项目代码框架介绍
生成的创建进程的代码
const osThreadAttr_t Task_LED0_attributes {.name Task_LED0,.priority (osPriority_t) osPriorityNormal,.stack_size 128 * 4
};
/* Definitions for Task_LED1 */
osThreadId_t Task_LED1Handle;
const osThreadAttr_t Task_LED1_attributes {.name Task_LED1,.priority (osPriority_t) osPriorityNormal,.stack_size 128 * 4
};void MX_FREERTOS_Init(void) {/* creation of Task_LED0 */Task_LED0Handle osThreadNew(AppTask_LED0, NULL, Task_LED0_attributes);/* creation of Task_LED1 */Task_LED1Handle osThreadNew(AppTask_LED1, NULL, Task_LED1_attributes);}在任务函数中实现让两个LED灯分别每隔500ms和1s进行亮灭的反转
/* USER CODE END Header_AppTask_LED0 */
void AppTask_LED0(void *argument)
{/* USER CODE BEGIN AppTask_LED0 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);HAL_Delay(500);}/* USER CODE END AppTask_LED0 */
}/* USER CODE BEGIN Header_AppTask_LED1 */
/**
* brief Function implementing the Task_LED1 thread.
* param argument: Not used
* retval None
*/
/* USER CODE END Header_AppTask_LED1 */
void AppTask_LED1(void *argument)
{/* USER CODE BEGIN AppTask_LED1 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);HAL_Delay(1000);}/* USER CODE END AppTask_LED1 */
}三、实验现象
具有相同优先级时利用时间片调度算法每个任务都能得到CPU的使用权。LED0和LED1轮流执行LED0和LED1实现不同频率的闪烁。 当设置LED1任务优先级降低时由于Task_LED0任务优先级大于Task_LED1HAL_Delay(500)是执行空语句实现的因此不会实现任务的切换。Task_LED0一直占用CPU的使用权。现象如下图所示。 当代码HAL_Delay(1000)改为osDelay(1000);两个小灯又可以同时执行任务因为osDelay(1000)会将任务变为阻塞状态交出CPU的使用权。
void AppTask_LED0(void *argument)
{/* USER CODE BEGIN AppTask_LED0 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);osDelay(1000);}/* USER CODE END AppTask_LED0 */
}总结
本文介绍了如何利用CUBEMX快速开发FreeRTOS。本文介绍了如何创建任务并通过实验说明了HAL_Delay()函数和osDelay()函数的区别。如果你在一个裸机环境中没有使用RTOS那么使用 HAL_Delay 是合适的。如果你在使用RTOS那么应该使用RTOS提供的 osDelay 来确保任务调度器正常工作而不会因为延时而阻塞其他任务。