RTOS 介绍

实时操作系统:在mcu 资源有限的情况下(flash,ram 只有kb级), 提供多任务操作的可能。相比裸机程序编程,极大地降低嵌入式应用逻辑开发难度。

  • 多数rtos 主要提供任务调试、内存管理、锁机制、信号等功能。有的也提供常用服务组件,比如网络协议栈支持,modbus支持。
  • 抢占式调度:高优先级任务可以抢占低优先级任务,不管低优先级任务是否让出CPU。
  • freeRTOS,uC/OS-II在消费电子市场占有率极高,国产RT-Thread发展也很不错。

点击查看更多RTOS

以下内容采用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;
}