为了保证程序运行的实时性和响应的快速性,最近在项目上面使用到RTOS的代码移植。
一:RTOS的介绍
RTOS 全称是 RealTime OperatingSystem,中文名就是实时操作系统。可以看出 FreeROTS 就是一个免费的 RTOS 类系统。这里要注意,RTOS 不是指某一个确定的系统,而是指一类系统。、操作系统允许多个任务同时运行,这个叫做多任务,实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务,任务调度在各个任务之间的切换非常快!这就给人们造成了同一时刻有多个任务同时运行的错觉。、
RTOS 的任务调度器被设计为可预测的,而这正是嵌入式实时操作系统所需要的,实时环境中要求操作系统必须对某一个事件做出实时的响应,因此系统任务调度器的行为必须是可预测的。像 FreeRTOS 这种传统的 RTOS 类操作系统是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。
二:STMcube MX 软件配置过程
2.1 安装包的准备
这里我们需要添加RTOS的软件支持包,同事配置好core与heap(具体的以后在做讨论),下载好支持包之后,直接在代码工程中添加 RTOS即可。
2.2 添加RTOS 支持包
其中,RTOS的配置参数信息如下:
主要是配置一下时钟频率和栈的大小。如果不熟悉的话,使用的默认的参数即可。
2.3 添加LED灯闪烁的任务
这里用户代码,使用的时候需要注意下,命名为自己熟悉的函数名。
2.4 添加串口输出的任务
这里为了简单的讲解,没有使能队列的知识。
三:软件代码编写
cube MX 软件自动生成底层驱动代码如下所示、
const osThreadAttr_t defaultTask_attributes = { .name = "defaultTask", .priority = (osPriority_t) osPriorityNormal, .stack_size = 128 * 4 }; /* Definitions for LEDTask */ osThreadId_t LEDTaskHandle; const osThreadAttr_t LEDTask_attributes = { .name = "LEDTask", .priority = (osPriority_t) osPriorityLow1, .stack_size = 128 * 4 }; /* Definitions for USARTask0 */ osThreadId_t USARTask0Handle; const osThreadAttr_t USARTask0_attributes = { .name = "USARTask0", .priority = (osPriority_t) osPriorityLow1, .stack_size = 128 * 4 };
3.1 LED 任务:
void StartTask02(void *argument) { /* USER CODE BEGIN LEDTask */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); osDelay(100); } /* USER CODE END LEDTask */ }
3.2 串口任务
const uint8_t OUTPUT_str[] = "Hello EEPW! Hello STM32U083RC! autor by keyboard007 \r\n";
void StartTask03(void *argument) { /* USER CODE BEGIN USARTask0 */ /* Infinite loop */ for(;;) { HAL_UART_Transmit(&huart2,OUTPUT_str,sizeof(OUTPUT_str),100); osDelay(1000); } /* USER CODE END USARTask0 */ }
四:实物测试图片
程序下载之后,可见两个任务可以正常运行,程序运行正常。