UM1722
用户手册
在具有 RTOS 的 STM32Cube 上开发应用
前言
STMCubeTM 计划源自意法半导体,旨在通过减少开发的工作量、时间与成本,使开发者受
益。 STM32Cube 涵盖 STM32 产品系列。
STM32Cube 1.x 版包括:
• 图形软件配置工具 STM32CubeMX,可通过图形化的生成初始化 C 代码。
• 针对每个系列提供综合的嵌入式软件平台 (即 STM32CubeF4 用于 STM32F4 系列)
STM32 抽象层嵌入式软件 STM32Cube HAL,确保在 STM32 各个产品之间实现
最大限度的可移植性
–
– 一套一致的中间件,比如 RTOS、 USB、 TCP/IP、图形
– 所有嵌入式软件实用工具均配备一套完整的示例。
实时操作系统是为在嵌入式 / 实时应用中使用而优化的操作系统。它们的主要目标是确保及
时、确定性地响应事件。使用实时操作系统,应用可写为一组独立的线程,线程间使用消息
队列和信号量通信。
本用户手册的目标读者为在 STM32 微控制器上使用 STM32Cube 固件的开发者。它完整描述
了如何使用具有实时操作系统 (RTOS)的 STM32Cube 固件组件;本用户手册还提供了一
组示例说明,它们基于 FreeRTOS,使用 CMSIS-OS 封装层提供的通用 API。
在 STM32Cube 固件中,通过 ARM 提供的通用 CMSIS-OS 封装层,将 FreeRTOS 用作实时
操作系统。使用 FreeRTOS 的样例和应用可直接移植到其它任何 RTOS 而不需要修改高层
API,在此情况下仅需更改 CMSIS-OS 封装。
请参考软件包的发布说明,以了解与 STM32CubeTM 共同使用的 FreeRTOS 和 CMSIS-RTOS
固件组件版本。
本文档适用于所有 STM32 器件;然而为了简洁起见,以 STM32F4xx 器件和 STM32CubeF4
作为参考平台。若需了解更多在 STM32 设备上样例实现的信息,请参考相关 STM32Cube 固
件包中提供的自述文件。
2014 年 8 月 6 日
DocID025801 Rev 2
1/26
www.st.com
目录
目录
1
2
3
4
5
6
UM1722
Free RTOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 授权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3
Free RTOS 源代码组织 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 将 FreeRTOS 移植到 STM32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
FreeRTOS API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5
FreeRTOS 存储器管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.6
1.7
FreeRTOS 低功耗 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
FreeRTOS 配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
1.8
CMSIS-RTOS 模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.1 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2
CMSIS-RTOS API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.1
3.2.2
FreeRTOS 应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.1 线程创建示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2 信号量示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
线程间信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
从 ISR 得到信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3 互斥量示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4 队列示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.5 定时器示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.6 低功耗示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
结论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
修订历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2/26
DocID025801 Rev 2
UM1722
表格索引
表格索引
表 1.
表 2.
表 3.
表 4.
表 5.
Free RTOS API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
CMSIS-RTOS API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Free RTOS 应用类别 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
功耗比较 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
文档修订历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
DocID025801 Rev 2
3/26
3
图片索引
图片索引
UM1722
图 1.
图 2.
图 3.
图 4.
图 5.
图 6.
图 7.
图 8.
图 9.
图 10.
FreeRTOS 许可 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Free RTOS 架构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Free RTOS 移植 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
FreeRTOS 配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
CMSIS-RTOS 架构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
线程示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
信号量示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
从 ISR 得到信号量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
队列过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
周期性定时器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4/26
DocID025801 Rev 2
UM1722
1
1.1
Free RTOS
Free RTOS
概述
FreeRTOS 是 RTOS 的一种,尺寸非常小,可运行于微控制器上,但其使用并不限于微控制
器应用。
微控制器是尺寸小、资源受限的处理器,它在单个芯片上包含了处理器本身、用于保存要执
行的程序的只读存储器 (ROM 或 Flash)、所执行程序需要的随机存取存储器 (RAM)。一
般情况下,程序直接从只读存储器执行。
微控制器用于深度嵌入式应用(对于那些应用,您永远不会看到处理器本身或运行的软件),
它们一般有非常明确、专门的工作。尺寸的限制以及专用的终端应用等性质,令其很少能使
用完整的 RTOS 实现 - 或者说不可能使用完整的 RTOS 实现。因此,FreeRTOS 仅为内核提
供了实时调度功能、任务间通信、时序和同步原语。这意味着更准确地说,它是一个实时内
核,或实时执行器。命令控制台界面、网络栈等额外的功能可作为附加组件。
FreeRTOS 为可调整的实时示例生成器内核,专为小型嵌入式系统设计。其特点包括
Free RTOS 示例生成器内核 —— 优先式、合作式及混合式配置选项。
•
• 官方支持 27 种架构 (ARM7 和 ARM Cortex M3 每个算一种架构)。
•
• 设计目标为小尺寸、简单和易用。一般来说,示例生成器内核二进制映像大约为 4K 到
FreeRTOS-MPU 支持 Cortex M3 存储器保护单元 (MPU)。
9K 字节。
• 代码结构极易移植,主要用 C 编写。
• 支持任务和协同例程。
• 可通过队列、二进制信号量、计数信号量、递归信号量、互斥量在任务间、任务与中断
间通信和同步。
• 互斥量有优先级继承。
• 支持高效的软件定时器。
• 强大的执行跟踪功能。
• 栈溢出检测选项。
• 预配置的示例应用,用于选定的单板电脑,可直接使用,加快学习曲线。
• 免费论坛支持,或可选择商业支持和授权。
• 可创建的任务数无软件限制。
• 可使用的优先级数无软件限制。
• 优先级指定无限制 - 可为多个任务指定同一优先级。
• 免费的开发工具可用于很多支持的架构。
• 免费的嵌入式软件源代码。
• 免版税。
• 可从标准的 Windows 主机交叉开发。
DocID025801 Rev 2
5/26
25
Free RTOS
UM1722
FreeRTOS 的 heap2 方案用于内存分配管理,此方案使用最佳适用算法释放之前分配的块。
然而,它不会将相邻的自由块合并为一个大块。可用的 RAM 总量通过定义
configTOTAL_HEAP_SIZE 设置 - 定义于 FreeRTOSConfig.h 中。
1.2
授权
FreeRTOS 源代码使用修正的 GNU 通用公开许可来授权。该修正使用了除外形式。 GNU 通
用公开许可全文如下:
图 1. FreeRTOS 许可
6/26
DocID025801 Rev 2
UM1722
1.3
Free RTOS 源代码组织
下载的 FreeRTOS 包括每个处理器移植及每个示例应用的源代码。将所有移植放置在一处下
载会极大简化发布,但文件数太多。然而,目录结构非常简单,而且 FreeRTOS 实时内核仅
包含在 4 个文件中 (若需软件定时器或协同例程功能,则需更多文件)。
Free RTOS
图 2. Free RTOS 架构
RTOS内核代码包含在三个文件中,名为tasks.c、queue.c和list.c,它们位于FreeRTOS/Source
目录中。该目录还包含两个可选文件,名为 timers.c 和 croutine.c,它们实现了软件定时器和
协同例程功能。每个所支持的处理器架构都需要一小部分专门针对该架构的 RTOS 代码。这就
是 RTOS 移植层,它位于 FreeRTOS/Source/Portable/[compiler]/[architecture] 子目录中,其
中 [compiler] 和 [architecture] 分别是创建移植所使用的编译器,以及移植所运行的架构。
样例堆分配方案也位于移植层中。不同的样例 heap_x.c 文件位于
FreeRTOS/Source/portable/MemMang 目录中。
1.4
将 FreeRTOS 移植到 STM32
FreeRTOS 支持下列 ST 处理器系列:STM32 (Cortex-M0、 Cortex-M3 和 Cortex-M4F)、
STR7 (ARM7)和 STR9 (ARM9) ,可与下列工具共同使用:IAR、 Atollic TrueStudio、
GCC、 Keil、 Rowley CrossWorks。
图 3. Free RTOS 移植
DocID025801 Rev 2
7/26
25
UM1722
Free RTOS
1.5
FreeRTOS API
API 类别
任务创建
任务控制
任务工具
内核控制
队列管理
信号量
表 1. Free RTOS API
API
– xTaskCreate
– vTaskDelete
– vTaskDelay
– vTaskDelayUntil
– uxTaskPriorityGet
– vTaskPrioritySet
– vTaskSuspend
– vTaskResume
– xTaskResumeFromISR
– vTaskSetApplicationTag
– xTaskCallApplicationTaskHook
– xTaskGetCurrentTaskHandle
– xTaskGetSchedulerState
– uxTaskGetNumberOfTasks
– vTaskList
– vTaskStartTrace
– ulTaskEndTrace
– vTaskGetRunTimeStats
– vTaskStartScheduler
– vTaskEndScheduler
– vTaskSuspendAll
– xTaskResumeAll
– xQueueCreate
– xQueueSend
– xQueueReceive
– xQueuePeek
– xQueueSendFromISR
– xQueueSendToBackFromISR
– xQueueSendToFrontFromISR
– xQueueReceiveFromISR
– vQueueAddToRegistry
– vQueueUnregisterQueue
– vSemaphoreCreateBinary
– vSemaphoreCreateCounting
– xSemaphoreCreateMutex
– xSemaphoreTake
– xSemaphoreGive
– xSemaphoreGiveFromISR
8/26
DocID025801 Rev 2