这个页面的 最新开发版本 可能比这个发布的 2.3-beta.2 版本新。

FreeRTOS

概述

FreeRTOS 是一个开源的 RTOS(实时操作系统),它以组件的形式集成到 WM IoT SDK 中,当前 WM IoT SDK 中所有的程序都是基于该系统运行的。

配置

内核配置

原生 FreeRTOS 要求移植工具和应用程序通过在 FreeRTOSConfig.h 头文件中添加各种 #define config... 宏定义来配置内核。 原生 FreeRTOS 支持一系列内核配置选项,允许启用或禁用各种内核的功能。

  • 常用的内核配置选项:

    • CONFIG_FREERTOS_HZ:FreeRTOS 的时钟 TICK 频率。

    • CONFIG_FREERTOS_TIMER_TASK_PRIORITY:FreeRTOS 的定时器任务优先级。

    • CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH:FreeRTOS 的定时器任务栈大小。

使用 FreeRTOS

应用程序入口点

在 WM IoT SDK 中使用 FreeRTOS 时用户无需考虑在哪调用 vTaskStartScheduler()vTaskEndScheduler(), WM IoT SDK 会自动在系统初始化流程中调用它们启动 FreeRTOS, 但用户需要定义一个 main 函数作为用户应用程序的入口点,main 函数在 WM IoT SDK 启动时被自动调用。

  • 一般而言,用户程序都是从 main 函数开始编写,当前提供的示例也都如此设计。

  • main 函数可以在任何时候返回,也可以创建和启动其它任务,使用时不存在任何限制。

后台任务

在启动过程中,WM IoT SDK 和 FreeRTOS 会自动创建多个在后台运行的任务,必定会创建的任务下表所示。

任务名称

描述

任务栈大小

优先级

FreeRTOS 空闲任务 (IDLE)

FreeRTOS 自动创建的空闲任务。

CONFIG_FREERTOS_IDLE_TASK_STACKSIZE,默认 256

0

FreeRTOS 定时器任务 (Tmr Svc)

FreeRTOS 自动创建的定时器服务任务

CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH,默认 512

CONFIG_FREERTOS_TIMER_TASK_PRIORITY,默认 15

系统启动初始化任务 (main)

WM IoT SDK 创建系统启动初始化任务,在 main 返回时会自我删除

4096

1

注意

  • 如果应用程序使用了其他 WM IoT SDK 功能(如 Wi-Fi 或蓝牙),那么这些功能可能会在上表的任务之外创建自己的任务。

  • WM IoT SDK 组件中创建的任务可以在 components\wm_system\include\wm_task_config.h 中查看其定义的任务优先级和任务栈大小,不建议用户修改和直接使用该文件里的配置。

附加功能

WM IoT SDK 还为 FreeRTOS 提供了一些补充功能,如 TICKLESS 和 IDLE 钩子。

FreeRTOS 堆

WM IoT SDK 并没有直接使用 FreeRTOS 自带的堆实现,而是根据 heap4 的机制实现了自己的堆内存分配算法。 WM IoT SDK 中将 FreeRTOS 内存分配或释放函数(如 pvPortMalloc()pvPortFree())映射到 WM IoT SDK 堆 API(即 wm_heap_caps_alloc()wm_heap_caps_free())。

WM IoT SDK 中 FreeRTOS 所使用的内存为片上高速内存,不支持片外内存,可参考 堆内存管理