RTOS 介绍
实时操作系统:在mcu 资源有限的情况下(flash,ram 只有kb级), 提供多任务操作的可能。相比裸机程序编程,极大地降低嵌入式应用逻辑开发难度。
- 多数rtos 主要提供任务调试、内存管理、锁机制、信号等功能。有的也提供常用服务组件,比如网络协议栈支持,modbus支持。
- 抢占式调度:高优先级任务可以抢占低优先级任务,不管低优先级任务是否让出CPU。
- freeRTOS,uC/OS-II在消费电子市场占有率极高,国产RT-Thread发展也很不错。
以下内容采用FreeRTOS
freertos 配制
配置文件FreeRTOSConfig.h 中定义了功能宏,系统参数宏:
系统时钟,定义tick的时间 1/configTICK_RATE_HZ(ms)
#define configTICK_RATE_HZ ( ( portTickType ) 100 )系统调度是否支持抢占
#define configUSE_PREEMPTION 1
任务调度
调度类型
- RR: 顺序执行模式,每个任务顺序执行完成或主动放弃cpu,执行下一下任务。
- Time slice [TS]: 时间片模式,将cpu时间等额分割,比如ts = 10ms, 每个任务时间即为ts,不管当前task有没有执行完,ts 时间一到,都会执行下一个任务。
- Priority [PRI]: 优先级抢占模式,高优先级的task 会优先执行,并且可以抢点低优先级任务。(常用模式,实时性高)
抢占式多任务调度举例说明
优先级说明: ISR > task1 > task2 = task3, ISR 为中断服务,比如GPIO 中断。
ISR 可以抢占task任务,优先执行(task 未设置临界区)。
高优先级task1 抢点 低优先级task2任务。

内存管理
系统时钟
中断
栈结构
程序结构
以freertos 为例,main函数中创建两个任务并开始调度,两个任务分别有自己的优先级,操作系统按优先级执行,MCU 作为单核CPU,一次只能执行一个任务,两个任务交交替执行,CPU 执行频率极高,所以看起来像是并行执行。
与裸机程序相比,任务之间可以独立编写,互不干扰,逻辑清晰。
void sensor_task( void *pvParameters )
{
do_something();
while(1) {
/* 读取传感器数据*/
sensor_read();
/* tick 是10ms ,任务休眠1s */
vTaskDelay(100);
}
}
void led_task( void *pvParameters )
{
do_something();
while(1) {
/* LED 闪烁 */
led_toggle();
/* tick 是10ms ,任务休眠1s */
vTaskDelay(100);
}
}
int main(void)
{
//硬件初使化
hardware_init();
/* 创建led 灯闪烁任务,1s 闪一次. */
xTaskCreate(led_task, "LED Flash", 512, NULL, 5, NULL);
/* 创建传感器信息收集任务 */
xTaskCreate(sensor_task, "sensor", 512, NULL, 10, NULL);
/* 任务开始运行*/
vTaskStartScheduler();
/* 此处永远不会执行 */
return 0;
}