实时操作系统

embedded
RTOS(Real-Time Operating System,实时操作系统)是专为实时应用设计的操作系统,能够在确定的时间内响应外部事件。与通用操作系统(如Windows/Linux)不同,RTOS强调响应时间的可预测性而非吞吐量。FreeRTOS是最流行的开源RTOS,被广泛应用于STM32、ESP32等微控制器。RTOS的核心机制包括任务调度、信号量、消息队列、中断管理等。

// 详细解释

实时操作系统(RTOS)

RTOS(Real-Time Operating System) 是专为实时应用设计的操作系统,能够在确定的时间内响应外部事件。

核心特性

特性RTOS通用 OS(Linux)
响应时间确定性(可预测)不确定(尽力而为)
调度策略优先级抢占式CFS 公平调度
任务切换微秒级毫秒级
内存管理静态分配为主动态分配
内核大小KB 级MB 级

FreeRTOS 基础

任务创建

c27 lines
#include "FreeRTOS.h" #include "task.h" // 任务函数 void vTaskFunction(void *pvParameters) { for (;;) { // 任务逻辑 vTaskDelay(pdMS_TO_TICKS(1000)); // 延时 1 秒 } } int main(void) { // 创建任务 xTaskCreate( vTaskFunction, // 任务函数 "Task1", // 任务名称 128, // 堆栈大小(words) NULL, // 参数 1, // 优先级 NULL // 任务句柄 ); // 启动调度器 vTaskStartScheduler(); return 0; }

任务间通信

c33 lines
// 1. 消息队列 QueueHandle_t xQueue; xQueue = xQueueCreate(10, sizeof(int)); // 发送 int data = 42; xQueueSend(xQueue, &data, portMAX_DELAY); // 接收 int received; xQueueReceive(xQueue, &received, portMAX_DELAY); // 2. 信号量 SemaphoreHandle_t xSemaphore; xSemaphore = xSemaphoreCreateBinary(); // 获取 if (xSemaphoreTake(xSemaphore, pdMS_TO_TICKS(100)) == pdTRUE) { // 临界区操作 } // 释放 xSemaphoreGive(xSemaphore); // 3. 事件组 EventGroupHandle_t xEventGroup; xEventGroup = xEventGroupCreate(); // 设置事件 xEventGroupSetBits(xEventGroup, 0x01); // 等待事件 EventBits_t bits = xEventGroupWaitBits(xEventGroup, 0x03, pdTRUE, pdFALSE, portMAX_DELAY);

ESP32 + FreeRTOS 示例

c45 lines
#include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "driver/gpio.h" #define LED_PIN GPIO_NUM_2 #define BUTTON_PIN GPIO_NUM_0 QueueHandle_t buttonQueue; // 按钮中断处理 void IRAM_ATTR button_isr_handler(void *arg) { int button_state = gpio_get_level(BUTTON_PIN); xQueueSendFromISR(buttonQueue, &button_state, NULL); } // LED 控制任务 void led_task(void *pvParameters) { int state = 0; while (1) { int button_state; if (xQueueReceive(buttonQueue, &button_state, portMAX_DELAY)) { if (button_state == 0) { // 按下 state = !state; gpio_set_level(LED_PIN, state); } } } } void app_main(void) { // 初始化 GPIO gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(BUTTON_PIN, GPIO_MODE_INPUT); // 创建队列 buttonQueue = xQueueCreate(10, sizeof(int)); // 安装中断 gpio_install_isr_service(0); gpio_isr_handler_add(BUTTON_PIN, button_isr_handler, NULL); // 创建任务 xTaskCreate(led_task, "LED Task", 2048, NULL, 5, NULL); }

调度策略

code7 lines
优先级抢占式调度: 任务 A (优先级 3):████████████████████ 任务 B (优先级 2): ████████ 任务 C (优先级 1): ████████████████ ↑ 高优先级任务可以随时抢占低优先级任务

常见 RTOS 对比

RTOS特点适用场景
FreeRTOS最流行,AWS 维护通用嵌入式
RT-Thread国产,组件丰富IoT、网关
ZephyrLinux 基金会,模块化物联网
VxWorks商业级,高可靠航空航天
μC/OS教学经典学习RTOS

应用场景

  • 机器人控制:电机控制、传感器融合(实时性要求 < 1ms)
  • 汽车电子:发动机控制、刹车系统(ISO 26262 认证)
  • 工业控制:PLC、运动控制器(EtherCAT 实时通信)
  • 消费电子:智能手表、无人机飞控
  • 医疗设备:心脏起搏器、输液泵(高可靠性要求)

相关概念

操作系统嵌入式系统中断处理任务调度

// 关联术语