什么是实时操作系统(RTOS)

描述

什么是实时操作系统(RTOS)

实时操作系统(RTOS)是一种专为实时应用程序设计的操作系统。实时应用程序需要在特定时间内做出预测的响应,因此 RTOS 专注于提供对时间约束的强调,以确保系统能够满足实时性能要求。

1. 实时性能:

  • 硬实时和软实时: RTOS 可以根据实时性能的要求分为硬实时和软实时。硬实时系统对任务的响应时间有极严格的要求,任何未能在规定时间内完成的任务都会被认为是失败。软实时系统也有时间要求,但相对灵活,任务未能在规定时间内完成并不会导致系统失败。

2. 任务调度:

  • 实时调度算法: RTOS 使用实时调度算法来确定哪个任务将在处理器上运行。这些算法考虑任务的优先级、截止期限和其他实时要求。
  • 时间片轮转: 在一些情况下,RTOS 可能使用时间片轮转调度,确保每个任务都有机会运行,以防止某个任务长时间独占处理器。

3. 任务管理:

  • 任务创建与删除: RTOS 允许创建和删除任务。任务可以是独立运行的单元,执行特定的功能。
  • 任务同步和通信: 提供机制使任务能够同步和通信,如信号量、互斥锁、消息队列等。

4. 内存管理:

  • 动态内存分配: 一些 RTOS 支持动态内存分配,允许在运行时分配和释放内存。
  • 静态内存分配: 为了提高可预测性,一些 RTOS 可能支持静态内存分配,即在编译时为任务分配内存。

5. 中断处理:

  • 中断服务例程(ISR): RTOS 允许开发人员编写中断服务例程,以处理硬件中断事件。
  • 中断优先级: 中断服务例程可以具有不同的优先级,RTOS 确保高优先级的中断可以中断低优先级的中断或任务。

6. 实时时钟和定时器:

  • 实时时钟: 提供对实时时钟的支持,以便任务能够基于实际时间进行调度和同步。
  • 定时器: 允许设置和管理定时器,以在指定时间触发任务或事件。

7. 错误处理:

  • 错误检测与处理: RTOS 通常提供错误检测和处理机制,以确保系统在出现错误时能够采取适当的措施。

8. RTOS 应用领域:

  • 嵌入式系统: RTOS 广泛应用于嵌入式系统,如汽车控制单元、医疗设备、工业自动化等。
  • 通信系统: 在通信系统中,RTOS 用于管理网络设备、路由器和交换机等。

9. 示例 RTOS:

  • FreeRTOS: 一个开源的实时操作系统,广泛用于嵌入式系统。
  • VxWorks: 用于嵌入式实时系统的商业 RTOS。
  • RTOS-32: 针对 Windows 平台的实时操作系统。

10. RTOS 与通用操作系统的区别:

  • 实时性能: RTOS 关注实时性能,而通用操作系统通常更注重吞吐量和响应时间。
  • 内核大小: RTOS 通常具有更小、更精简的内核,以确保快速启动和响应。
  • 任务调度: RTOS 使用实时调度算法,以确保任务在规定时间内完成。

实时操作系统在对实时性能有严格要求的应用中发挥着关键作用。通过提供对任务调度、同步、通信和实时时钟的支持,RTOS 使得开发者能够设计和实现对时间要求极高的系统。在嵌入式系统和实时控制领域,RTOS 成为了不可或缺的工具。

FreeRTOS

FreeRTOS 是一个开源的实时操作系统,广泛用于嵌入式系统。FreeRTOS 提供了对任务调度、同步、通信和实时时钟的支持,使得开发者能够设计和实现对时间要求极高的系统。FreeRTOS 通过 MIT 开源许可免费分发,包括一个内核和一组不断丰富的 IoT 库,适用于所有行业领域。FreeRTOS 的构建突出可靠性和易用性。

FreeRTOS 的开发活动已从 SVN 迁移到 GitHub,现在可以直接在 FreeRTOS 的 Github页面上找到。从 GitHub 下载 FreeRTOS 早期版本 的标准 zip (.zip) 文件或自解压 zip 文件 (.exe) 。解压缩 源代码,同时确保不改动文件夹结构。

FreeRTOS 官方下载页有两个版本的下载包,一个是最新版,一个是长期支持(LTS)版。最新版下载包包含最新 FreeRTOS 内核 、 FreeRTOS-Plus 库 和 AWS IoT 库,以及示例项目。长期支持版下载包则包含 FreeRTOS LTS 库,其中包括 FreeRTOS 内核和 IoT 库,但没有示例项目。可以根据自己需要选择下载。

因为手上正好有 ESP32-C3 小飞控板,所以接下来的 playground 就以这个小板子为例了。而 ESP-IDF 中已经集成了 FreeRTOS,所以我们可以直接使用 ESP-IDF 来开发 FreeRTOS 应用。

Hello World

配置好 ESP-IDF 开发环境后,按照以下步骤配置实现本示例项目:

步骤 1: 安装 ESP-IDF

确保你已经安装了 ESP-IDF。你可以按照 Espressif 的官方文档 ESP-IDF 安装指南进行安装。

步骤 2: 创建新项目

  1. 打开终端或命令提示符窗口,切换到你希望创建项目的目录。
  2. 运行以下命令来创建一个新的 ESP-IDF 项目:
idf.py create-project hello_world

这将创建一个包含默认项目结构的新目录。

步骤 3: 进入项目目录

cd < project-name >

步骤 4: 配置项目

  1. 运行以下命令配置项目:
idf.py menuconfig

这将打开一个菜单配置界面,你可以在其中配置项目的各种选项,包括串口设置、Wi-Fi 配置、组件选项等。配置完成后,保存并退出。

  1. (可选) 如果你想使用 VSCode 或其他 IDE 进行开发,可以运行以下命令生成 IDE 项目文件:
idf.py vscode

这将生成与 Visual Studio Code 兼容的配置文件。

步骤 5: 编译和烧录

main目录下找到hello_world_main.c文件,写入以下内容:

#include < stdio.h >
#include < inttypes.h >
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"

void app_main(void)
{
    printf("Hello world!n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    uint32_t flash_size;
    esp_chip_info(&chip_info);
    printf("This is %s chip with %d CPU core(s), %s%s%s%s, ",
           CONFIG_IDF_TARGET,
           chip_info.cores,
           (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "",
           (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "",
           (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "",
           (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : "");

    unsigned major_rev = chip_info.revision / 100;
    unsigned minor_rev = chip_info.revision % 100;
    printf("silicon revision v%d.%d, ", major_rev, minor_rev);
    if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {
        printf("Get flash size failed");
        return;
    }

    printf("%" PRIu32 "MB %s flashn", flash_size / (uint32_t)(1024 * 1024),
           (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    printf("Minimum free heap size: %" PRIu32 " bytesn", esp_get_minimum_free_heap_size());

    for (int i = 10; i >= 0; i--) {
        printf("Restarting in %d seconds...n", i);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    printf("Restarting now.n");
    fflush(stdout);
    esp_restart();
}

这段代码将输出"Hello World!",并打印一些芯片基本信息。

  1. 使用以下命令编译项目:
idf.py build
  1. 使用以下命令烧录固件到 ESP32:
idf.py -p < PORT > flash

其中 是你的 ESP32 开发板连接到计算机的端口。你可以使用 ls /dev/tty*(在 Linux/macOS)或 mode 命令(在 Windows)来查找端口。

步骤 6: 监视串口输出

  1. 使用以下命令启动监视串口输出:
idf.py -p < PORT > monitor

这将打开一个窗口,显示 ESP32 的串口输出。你可以看到程序的调试信息和日志。

  1. 如果你修改了代码并重新编译,可以使用以下命令重新烧录并启动监视:
idf.py -p < PORT > flash monitor

运行成功的话,应该会在控制台输出类似以下内容:

Hello world!
This is esp32c3 chip with 1 CPU core(s), WiFi/BLE, silicon revision v0.4, 2MB external flash
Minimum free heap size: 330392 bytes
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分