STM32F407 FreeRTOS 开发手册 
ALIENTEK  探索者 FreeRTOS 开发教程 
  STM32F407 
FreeRTOS 开发手册
V1.0 
−ALIENTEK STM32F407 FreeRTOS 开发教程 
 
 
 
 
 
 
 
 
 
左忠凯  著 
 
1 
 
STM32F407 FreeRTOS 开发手册 
ALIENTEK  探索者 FreeRTOS 开发教程 
文档更新说明 
版本 
版本更新说明 
负责人  校审  发布日期 
初稿: 
第一章  FreeRTOS 简介 
第二章  FreeRTOS 移植 
第三章  FreeRTOS 系统配置 
第四章  FreeRTOS 中断配置和临界段 
第五章  FreeRTOS 任务基础知识 
第六章  FreeRTOS 任务相关 API 函数 
第七章  FreeRTOS 列表和列表项 
第八章  FreeRTOS 任务创建和调度器开启 
V1.0 
第九章  FreeRTOS 任务切换 
左忠凯  刘军 
2016.11.26 
第十章  FreeRTOS 系统内核控制函数 
第十一章  FreeRTOS 其他任务 API 函数 
第十二章  FreeRTOS 时间管理 
第十三章  FreeRTOS 队列 
第十四章  FreeRTOS 信号量 
第十五章  FreeRTOS 软件定时器 
第十六章  FreeRTOS 事件标志组 
第十七章  FreeRTOS 内存管理 
第十八章  FreeRTOS 任务通知 
 
 
 
 
 
2 
 
目录 
STM32F407 FreeRTOS 开发手册 
ALIENTEK  探索者 FreeRTOS 开发教程 
STM32F407 FreeRTOS 开发手册 V1.0 ............................................................................................ 1 
声明 ................................................................................................................................................. 11 
第一章 ..................................................................................................................... FreeRTOS 简介 . 12 
1.1  初识 FreeRTOS .................................................................................................. 13 
1.1.1  什么是 FreeRTOS? ................................................................................... 13 
1.1.2  为什么选择 FreeRTOS? ........................................................................ 13 
1.1.3 FreeRTOS 特点 ......................................................................................... 14 
1.1.4  商业许可 .................................................................................................. 14 
1.2  磨刀不误砍柴工 ................................................................................................ 15 
1.2.1  资料查找 .................................................................................................. 15 
1.2.2 FreeRTOS 官方文档 ................................................................................. 17 
1.2.3 Cortex-M 架构资料 ................................................................................... 19 
1.3 FreeRTOS 源码初探 ........................................................................................... 19 
1.3.1 FreeRTOS 源码下载 ................................................................................. 19 
1.3.2 FreeRTOS 文件预览 ................................................................................. 21 
第二章  FreeRTOS 移植 ............................................................................................................... 26 
2.1  准备工作 ............................................................................................................ 27 
2.1.1  准备基础工程 .......................................................................................... 27 
2.1.2 FreeRTOS 系统源码 ................................................................................. 27 
2.2 FreeRTOS 移植 ................................................................................................... 27 
2.2.1  向工程中添加相应文件 .......................................................................... 27 
2.2.2  修改 SYSTEM 文件 ................................................................................. 31 
2.3  移植验证实验 .................................................................................................... 35 
2.3.1  实验程序设计 .......................................................................................... 35 
2.3.2  实验程序运行结果分析 .......................................................................... 38 
第三章  FreeRTOS 系统配置 ....................................................................................................... 40 
3.1 FreeRTOSConfig.h 文件 ..................................................................................... 41 
3.1 “INCLUDE_”开始的宏 ...................................................................................... 41 
 
3 
 
STM32F407 FreeRTOS 开发手册 
ALIENTEK  探索者 FreeRTOS 开发教程 
3.2 “config”开始的宏 ............................................................................................... 42 
第四章  FreeRTOS 中断配置和临界段 ....................................................................................... 50 
4.1 Cortex-M 中断 .................................................................................................... 51 
4.1.1  中断简介 .................................................................................................. 51 
4.1.2  中断管理简介 .......................................................................................... 51 
4.1.3  优先级分组定义 ...................................................................................... 52 
4.1.4  优先级设置 .............................................................................................. 54 
4.1.5  用于中断屏蔽的特殊寄存器 .................................................................. 55 
4.2 FreeRTOS 中断配置宏 ....................................................................................... 56 
4.2.1 configPRIO_BITS ..................................................................................... 56 
4.2.2 configLIBRARY_LOWEST_INTERRUPT_PRIORITY ......................... 56 
4.2.3 configKERNEL_INTERRUPT_PRIORITY ............................................. 56 
4.2.4 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ............ 58 
4.2.5 configMAX_SYSCALL_INTERRUPT_PRIORITY ................................ 58 
4.3 FreeRTOS 开关中断 ........................................................................................... 59 
4.4  临界段代码 ........................................................................................................ 59 
4.4.1  任务级临界段代码保护 .......................................................................... 60 
4.4.2  中断级临界段代码保护 .......................................................................... 61 
4.5 FreeRTOS 中断测试实验 ................................................................................... 62 
4.5.1  实验程序设计 .......................................................................................... 62 
4.5.2  实验程序运行结果 .................................................................................. 66 
第五章  FreeRTOS 任务基础知识 ............................................................................................... 68 
5.1  什么是多任务系统? ........................................................................................ 69 
5.2 FreeRTOS 任务与协程 ....................................................................................... 70 
5.2.1  任务(Task)的特性 .................................................................................... 70 
5.2.2  协程(Co-routine)的特性 .......................................................................... 71 
5.3  任务状态 ............................................................................................................ 71 
5.4  任务优先级 ........................................................................................................ 72 
5.5  任务实现 ............................................................................................................ 72 
5.6  任务控制块 ........................................................................................................ 73 
5.7  任务堆栈 ............................................................................................................ 75 
 
4 
 
STM32F407 FreeRTOS 开发手册 
ALIENTEK  探索者 FreeRTOS 开发教程 
第六章  FreeRTOS 任务相关 API 函数 ...................................................................................... 77 
6.1  任务创建和删除 API 函数 ................................................................................ 78 
6.2  任务创建和删除实验(动态方法) ..................................................................... 80 
6.2.1  实验程序设计 .......................................................................................... 80 
6.2.2  程序运行结果分析 .................................................................................. 84 
6.3  任务创建和删除实验(静态方法) ..................................................................... 85 
6.3.1  实验程序设计 .......................................................................................... 85 
6.3.2  程序运行结果分析 .................................................................................. 90 
6.4  任务挂起和恢复 API 函数 ................................................................................ 90 
6.5  任务挂起和恢复实验 ........................................................................................ 91 
6.5.1  实验程序设计 .......................................................................................... 91 
6.5.2  程序运行结果分析 .................................................................................. 97 
第七章  FreeRTOS 列表和列表项 ............................................................................................... 98 
7.1  什么是列表和列表项? .................................................................................... 99 
7.1.1  列表 .......................................................................................................... 99 
7.1.2  列表项 ...................................................................................................... 99 
7.1.3  迷你列表项 ............................................................................................ 100 
7.2  列表和列表项初始化 ...................................................................................... 101 
7.2.1  列表初始化 ............................................................................................ 101 
7.2.2  列表项初始化 ........................................................................................ 102 
7.3  列表项插入 ...................................................................................................... 102 
7.3.1  列表项插入函数分析 ............................................................................ 102 
7.3.2  列表项插入过程图示 ............................................................................ 104 
7.4  列表项末尾插入 .............................................................................................. 105 
7.4.1  列表项末尾插入函数分析 .................................................................... 105 
7.4.2  列表项末尾插入图示 ............................................................................ 106 
7.5  列表项的删除 .................................................................................................. 107 
7.6  列表的遍历 ...................................................................................................... 108 
7.7  列表项的插入和删除实验 .............................................................................. 109 
7.7.1  实验程序设计 ........................................................................................ 109 
7.7.2  程序运行结果分析 ................................................................................ 113 
第八章  FreeRTOS 任务创建和调度器开启 ............................................................................. 117 
 
5 
 
STM32F407 FreeRTOS 开发手册 
ALIENTEK  探索者 FreeRTOS 开发教程 
8.1  阅读本章所必备的知识 .................................................................................. 118 
8.2  任务创建过程分析 .......................................................................................... 118 
8.2.1  任务创建函数分析 ................................................................................ 118 
8.2.2  任务初始化函数分析 ............................................................................ 120 
8.2.3  任务堆栈初始化函数分析 .................................................................... 123 
8.2.4  添加任务到就绪列表 ............................................................................ 125 
8.3  调度器开启过程分析 ...................................................................................... 127 
8.3.1  任务调度器开启函数分析 .................................................................... 127 
8.3.2  内核相关硬件初始化函数分析 ............................................................ 129 
8.3.3  使能 FPU 函数分析 ............................................................................... 129 
8.3.4  启动第一个任务 .................................................................................... 130 
8.3.5 SVC 中断服务函数 ................................................................................. 131 
8.3.6  空闲任务 ................................................................................................ 135 
第九章  FreeRTOS 任务切换 ..................................................................................................... 136 
9.1 PendSV 异常 ..................................................................................................... 137 
9.2 FreeRTOS 任务切换场合 ................................................................................. 138 
9.2.1  执行系统调用 ........................................................................................ 138 
9.2.2  系统滴答定时器(SysTick)中断 ............................................................. 139 
9.3 PendSV 中断服务函数 ..................................................................................... 140 
9.4  查找下一个要运行的任务 .............................................................................. 141 
9.6 FreeRTOS 时间片调度 ..................................................................................... 143 
9.6  时间片调度实验 .............................................................................................. 146 
9.6.1  实验程序设计 ........................................................................................ 146 
9.6.2  程序运行结果分析 ................................................................................ 149 
第十章  FreeRTOS 系统内核控制函数 ..................................................................................... 150 
10.1  内核控制函数预览 ........................................................................................ 151 
10.2  内核控制函数详解 ........................................................................................ 151 
第十一章  FreeRTOS 其他任务 API 函数 ................................................................................ 156 
11.1  任务相关 API 函数预览 ................................................................................ 157 
11.2  任务相关 API 函数详解 ................................................................................ 158 
11.3  任务壮态查询 API 函数实验 ........................................................................ 165 
 
6 
 
STM32F407 FreeRTOS 开发手册 
ALIENTEK  探索者 FreeRTOS 开发教程 
11.3.1  实验程序设计 ....................................................................................... 165 
11.3.2  程序运行结果分析 ............................................................................... 170 
11.4  任务运行时间信息统计实验 ........................................................................ 171 
11.4.1  相关宏的设置 ....................................................................................... 171 
11.4.2  实验程序设计 ....................................................................................... 173 
11.4.3  程序运行结果分析 ............................................................................... 177 
第十二章  FreeRTOS 时间管理 ................................................................................................. 178 
12.1 FreeRTOS 延时函数 ....................................................................................... 179 
12.1  函数 vTaskDelay() ................................................................................... 179 
12.2  函数 prvAddCurrentTaskToDelayedList() .............................................. 180 
12.3  函数 vTaskDelayUntil() .......................................................................... 182 
12.2 FreeRTOS 系统时钟节拍 ............................................................................... 186 
第十三章  FreeRTOS 队列 ......................................................................................................... 192 
13.1  队列简介 ........................................................................................................ 193 
13.2  队列结构体 .................................................................................................... 195 
13.3  队列创建 ........................................................................................................ 196 
13.3.1  函数原型 .............................................................................................. 196 
13.3.2  队列创建函数详解 .............................................................................. 198 
13.3.3  队列初始化函数 .................................................................................. 199 
13.3.4  队列复位函数 ...................................................................................... 200 
13.4  向队列发送消息 ............................................................................................ 202 
13.4.1  函数原型 .............................................................................................. 202 
13.4.2  任务级通用入队函数 .......................................................................... 206 
13.4.3  中断级通用入队函数 .......................................................................... 210 
13.5  队列上锁和解锁 ............................................................................................ 212 
13.6  从队列读取消息 ............................................................................................ 214 
13.7  队列操作实验 ................................................................................................ 218 
13.7.1  实验程序设计 ...................................................................................... 218 
13.7.2  程序运行结果分析 .............................................................................. 226 
第十四章  FreeRTOS 信号量 ..................................................................................................... 228 
14.1  信号量简介 .................................................................................................... 229 
 
7 
 
STM32F407 FreeRTOS 开发手册 
ALIENTEK  探索者 FreeRTOS 开发教程 
14.2  二值信号量 .................................................................................................... 229 
14.2.1  二值信号量简介 .................................................................................. 229 
14.2.2  创建二值信号量 .................................................................................. 231 
14.2.3  二值信号量创建过程分析 .................................................................. 232 
14.2.4  释放信号量 .......................................................................................... 233 
14.2.5  获取信号量 .......................................................................................... 234 
14.3  二值信号量操作实验 .................................................................................... 236 
14.3.1  实验程序设计 ...................................................................................... 236 
14.3.2  程序运行结果分析 .............................................................................. 242 
14.4  计数型信号量 ................................................................................................ 243 
14.4.1  计数型信号量简介 .............................................................................. 243 
14.4.2  创建计数型信号量 .............................................................................. 243 
14.4.3  计数型信号量创建过程分析 .............................................................. 244 
14.4.4  释放和获取计数信号量 ...................................................................... 245 
14.5  计数型信号量操作实验 ................................................................................ 245 
14.5.1  实验程序设计 ...................................................................................... 245 
14.5.2  程序运行结果分析 .............................................................................. 249 
14.6  优先级翻转 .................................................................................................... 250 
14.7  优先级翻转实验 ............................................................................................ 251 
14.7.1  实验程序设计 ...................................................................................... 251 
14.7.2  程序运行结果分析 .............................................................................. 256 
14.8  互斥信号量 .................................................................................................... 258 
14.8.1  互斥信号量简介 .................................................................................. 258 
14.8.2  创建互斥信号量 .................................................................................. 258 
14.8.3  互斥信号量创建过程分析 .................................................................. 259 
14.8.4  释放互斥信号量 .................................................................................. 261 
14.8.5  获取互斥信号量 .................................................................................. 264 
14.9  互斥信号量操作实验 .................................................................................... 269 
14.9.1  实验程序设计 ...................................................................................... 269 
14.9.2  程序运行结果分析 .............................................................................. 272 
14.10  递归互斥信号量 .......................................................................................... 273 
14.10.1  递归互斥信号量简介 ........................................................................ 273 
14.10.2  创建互斥信号量 ................................................................................ 273 
14.10.3  递归信号量创建过程分析 ................................................................ 274 
 
8