[野火]RT-Thread
内核实现与应用开发实战
——基于
STM32
EmbedFire
野火电子
2021
年
01
月
22
日
[野火]RT-Thread
内核实现与应用开发实战
Contents
关于本项目.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
关于野火
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
开源共享,共同进步
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
联系方式
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
第
1
章
第
2
章
2.1
2.2
2.3
2.4
2.5
2.6
第
3
章
3.1
3.2
3.3
第
4
章
4.1
推荐序.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
前言
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
关于本书
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
如½学习本书
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
本书的参考资料
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
本书的编写风格
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
本书的配套硬件
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
本书的技术论坛
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
2
2
2
3
7
7
8
8
9
9
19
TODO
和悬赏任务
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
如½学习
RTOS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
为什么要学习
RTOS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
如½学习
RTOS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
选择什么
RTOS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RT-Thread
简介
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.1
4.1.2
4.2
第
5
章
第
6
章
6.1
6.2
版权
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
收费问题
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
22
22
23
23
23
23
初识
RT-Thread.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
RT-Thread
的意义
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
第一部分:从
0
到
1
教½写
RT-Thread
内核
. . . . . . . . . . . . . . . . . . . . . . . . . 25
新建
RT-Thread
工程—½件仿真
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
新建本地工程文件夹
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
½用
KEIL
新建工程
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2.1
New Progect
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
i
26
28
28
论坛:https://www.firebbs.cn
天猫:https://yehuosm.tmall.com
[野火]RT-Thread
内核实现与应用开发实战
6.2.2
6.2.3
6.2.4
6.2.5
6.3
6.4
Select Device For Target
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Manage Run-Time Environment
. . . . . . . . . . . . . . . . . . . . . . . . .
在
KEIL
工程里面新建文件组
. . . . . . . . . . . . . . . . . . . . . . . . .
在
KEIL
工程里面添加文件
. . . . . . . . . . . . . . . . . . . . . . . . . . .
28
31
33
34
35
36
36
37
39
41
41
42
44
48
50
51
51
54
56
57
73
73
75
78
78
81
83
94
98
编写
main
½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
调试配½
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.4.1
6.4.2
6.4.3
设½½件仿真
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
修改时钟大小
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
添加头文件路径
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
第
7
章
7.1
裸机系统与多线程系统
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
裸机系统
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.1.1
7.1.2
½询系统
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
前后台系统
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2
第
8
章
8.1
8.2
8.3
多线程系统
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
本章目标
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
什么是线程
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
创建线程
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3.1
8.3.2
8.3.3
8.3.4
定义线程栈
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
定义线程½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
定义线程控制块
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
实现线程创建½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
定义就绪列表
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
将线程插入到就绪列表
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
调度器初始化
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
启动调度器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
第一次线程切换
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
系统调度
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
线程的定义与线程切换的实现.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
8.4
实现就绪列表
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.4.1
8.4.2
8.5
实现调度器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.5.1
8.5.2
8.5.3
8.5.4
8.6
main
½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
论坛:https://www.firebbs.cn
ii
天猫:https://yehuosm.tmall.com
[野火]RT-Thread
内核实现与应用开发实战
8.7
第
9
章
9.1
9.2
9.3
9.4
9.5
9.6
实验现象
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
临界段的保护
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
什么是临界段
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Cortex-M
内核快速关中断指令
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
关中断
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
开中断
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
临界段代码的应用
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
实验现象
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
第
10
章 对象容器的实现
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
10.1
什么是对象
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
10.1.1
对象枚举定义
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
10.1.2
对象数据类型定义
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
10.1.3
在线程控制块中添加对象成员
. . . . . . . . . . . . . . . . . . . . . . . . . 121
10.2
什么是容器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
10.2.1
容器的定义
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
10.3
容器的接口实现
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
10.3.1
获取指定类型的对象信息
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
10.3.2
对象初始化
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
10.3.3
调用对象初始化½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
10.4
实验现象
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
第
11
章 空闲线程与阻塞延时的实现
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
11.1
实现空闲线程
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
11.1.1
定义空闲线程的栈
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
11.1.2
定义空闲线程的线程控制块
. . . . . . . . . . . . . . . . . . . . . . . . . . 138
11.1.3
定义空闲线程½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
11.1.4
空闲线程初始化
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
11.2
实现阻塞延时
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
11.3 SysTick_Handler
中断服务½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
11.3.1
系统时基更新½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
11.4 main
½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
11.5
实验现象
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
论坛:https://www.firebbs.cn
iii
天猫:https://yehuosm.tmall.com
[野火]RT-Thread
内核实现与应用开发实战
第
12
章 支持多优先级
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
12.1
就绪列表
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
12.1.1
线程就绪优先级组
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
12.1.2
线程优先级表
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
12.2
修改代码,支持多优先级
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
12.2.1
修改线程控制块
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
12.2.2
修改调度器初始化½数
rt_system_scheduler_init()
. . . . . . . . . . . . . . . 172
12.2.3
修改线程初始化½数
rt_thread_init()
. . . . . . . . . . . . . . . . . . . . . . 173
12.2.4
添加线程启动½数
rt_thread_startup()
. . . . . . . . . . . . . . . . . . . . . . 175
12.2.5
修改空闲线程初始化½数
rt_thread_idle_init()
. . . . . . . . . . . . . . . . . 178
12.2.6
修改启动系统调度器½数
rt_system_scheduler_start()
. . . . . . . . . . . . . 179
12.2.7
修改系统调度½数
rt_schedule ()
. . . . . . . . . . . . . . . . . . . . . . . . 180
12.2.8
修改阻塞延时½数
rt_thread_delay()
. . . . . . . . . . . . . . . . . . . . . . 184
12.2.9
修改时基更新½数
rt_tick_increase()
. . . . . . . . . . . . . . . . . . . . . . 186
12.3 main
½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
12.4
实验现象
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
第
13
章 定时器的实现
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
13.1
实现定时器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
13.1.1
系统定时器列表
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
13.1.2
系统定时器列表初始化
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
13.1.3
定义定时器结构½
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
13.1.4
在线程控制块中内½定时器
. . . . . . . . . . . . . . . . . . . . . . . . . . 196
13.1.5
定时器初始化½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
13.1.6
定时器删除½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
13.1.7
定时器停止½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
13.1.8
定时器控制½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
13.1.9
定时器启动½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
13.1.10
定时器扫描½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
13.2
修改代码,支持定时器
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
13.2.1
修改线程初始化½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
13.2.2
修改线程延时½数
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
论坛:https://www.firebbs.cn
iv
天猫:https://yehuosm.tmall.com
评论