本帖最后由 聪聪哥哥 于 2025-8-12 14:34 编辑
之前写代码时候,移植RTOS时候,尝试过在移植RTOS,不过移植的过程还是很繁琐,没有一些软件的开发经验来说,还是比较麻烦的。偶然间发现STM32cube MX软件可以直接生成rtos的底层驱动,借着本次机会创建一个RTOS的底层驱动函数,为自己开发以后的项目做准备。
一:RTOS的介绍
RTOS 全称是 RealTime OperatingSystem,中文名就是实时操作系统。可以看出 FreeROTS 就是一个免费的 RTOS 类系统。这里要注意,RTOS 不是指某一个确定的系统,而是指一类系统。、操作系统允许多个任务同时运行,这个叫做多任务,实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务,任务调度在各个任务之间的切换非常快!这就给人们造成了同一时刻有多个任务同时运行的错觉。、
RTOS 的任务调度器被设计为可预测的,而这正是嵌入式实时操作系统所需要的,实时环境中要求操作系统必须对某一个事件做出实时的响应,因此系统任务调度器的行为必须是可预测的。像 FreeRTOS 这种传统的 RTOS 类操作系统是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。
二:STM32 cube MX软件配置过程
2.1 打开RTOS的软件支持包,这里我选中开发板的模式,串口,LED的引脚会自动配置好
2.2 有关于RTOS的一些配置信息,这里我们选择默认参数就好,
2.3 新建LED的闪烁任务
2.4 新建串口的输出任务
三:软件编写:
3.1 新建两个任务的句柄
- osThreadId_t LEDTaskHandle;
- const osThreadAttr_t LEDTask_attributes = {
- .name = "LEDTask",
- .priority = (osPriority_t) osPriorityLow,
- .stack_size = 128 * 4
- };
- /* Definitions for USARTTask */
- osThreadId_t USARTTaskHandle;
- const osThreadAttr_t USARTTask_attributes = {
- .name = "USARTTask",
- .priority = (osPriority_t) osPriorityLow,
- .stack_size = 128 * 4
- };
3.2 在主程序中创建任务:
- /* creation of LEDTask */
- LEDTaskHandle = osThreadNew(StartTask02, NULL, &LEDTask_attributes);
- /* creation of USARTTask */
- USARTTaskHandle = osThreadNew(StartTask03, NULL, &USARTTask_attributes);
3.3 LED灯闪烁任务:
- void StartTask02(void *argument)
- {
- /* USER CODE BEGIN LEDTask */
- /* Infinite loop */
- for(;;)
- {
- BSP_LED_Toggle(LED_GREEN);
- osDelay(1000);
- }
- /* USER CODE END LEDTask */
- }
3.4 串口输出任务:
定义串口输出的字符串数组:
- uint8_t outbuffer[]={"STM32u385! 21IIC luntan by;clever !"} ;
- void StartTask03(void *argument)
- {
- /* USER CODE BEGIN USARTTask */
- /* Infinite loop */
- for(;;)
- {
- HAL_UART_Transmit(&huart1,outbuffer,33,100);
- osDelay(500);
- }
- /* USER CODE END USARTTask */
- }
四:实物验证如下:
程序下载之后,可以看到LED任务和串口任务,可以正常运行。
|