RT-Thread内核实现与应用开发实战指南:基于STM32

    • 首本系统讲解RT-Thread的中文书籍
    • 带你从0到1写RT-Thread的核心代码
    • 介绍RT-Thread的移植和内核组件的使用
    • 配套野火全系列STM32开发板

点击购买

 

描述


如何学习本书

本书是首本系统讲解RT-Thread的中文书籍,共分为两个部分。第一部分重点讲解RT-Thread的原理实现,从0开始,不断迭代,教你把RT-Thread的内核写出来,让你彻底学会线程是如何定义的、系统是如何调度的(包括底层的汇编代码讲解)、多优先级是如何实现的等操作系统的最深层次的知识。当你拿到本书开始学习的时候,你一定会惊讶,原来RTOS的学习并没有那么复杂,反而是那么有趣;原来自己也可以写RTOS,成就感立马爆棚。
当彻底掌握第一部分的知识之后,再学习其他RTOS,可以说十分轻松。纵观现在市面上流行的几种RTOS,它们的内核实现差异不大,只需要深入研究其中一种即可,没有必要对每一种RTOS都深入地研究源码,但如果时间允许,看一看也并无坏处。第二部分重点讲解RT-Thread的移植、内核中每个组件的应用,比起第一部分,这部分内容掌握起来应该比较容易。
全书内容循序渐进,不断迭代,尤其在第一部分,前一章是后一章的基础,必须从头开始阅读,不能进行跳跃式的阅读。在学习时务必做到两点:一是不能一味地看书,要把代码和书本结合起来学习,一边看书,一边调试代码。如何调试代码呢?即单步执行每一条程序,看程序的执行流程和执行的效果与自己所想的是否一致。二是在每学完一章之后,必须将配套的例程重写一遍(切记不要复制,即使是一个分号,但可以照书录入),做到举一反三,确保真正理解。在自己写的时候难免错误百出,要珍惜这些错误,好好调试,这是你提高编程能力的最好机会。记住,程序不是一气呵成写出来的,而是一步一步调试出来的。


本书的编写风格

本书第一部分主要以RT-Thread Nano 3.0.3官方源码为蓝本,抽丝剥茧,不断迭代,教你如何从0开始把RT-Thread内核写出来。书中涉及的数据类型、变量名称、函数名称、文件名称、文件存放的位置都完全按照RT-Thread官方的方式来实现。学完这本书之后,你可以无缝地切换到原版的RT-Thread中使用。要注意的是,在实现的过程中,某些函数中会去掉一些形参和冗余的代码,只保留核心的功能,但这并不会影响我们学习。
本书第二部分主要介绍RT-Thread的移植和内核组件的使用,不会再去深入讲解源码,而是着重讲解如何应用,如果对第一部分不感兴趣,也可以跳过第一部分,直接进入第二部分的学习。
本书还有姊妹篇——《FreeRTOS内核实现与应用开发实战指南:基于STM32》,两本书的编写风格、内容框架和章节命名与排序基本一致,语言阐述类似,且涉及RTOS抽象层的理论部分也相同,不同之处在于RTOS的实现原理、内核源码的讲解和上层API的使用,这些内容才是重点部分,是读者学习的核心。例如,虽然两本书的第一部分的章节名称基本类似,但内容不同,因为针对的RTOS不一样。其中,关于新建RT-Thread工程和裸机系统与多线程(任务)系统的描述属于RTOS抽象层的理论部分,不具体针对某个RTOS,所以基本一样。第二部分中,对于什么是线程(任务)、阻塞延时和信号量的应用等RTOS抽象层的理论讲解也基本类似,但是具体涉及这两个RTOS的原理实现和代码讲解时则完全不同。
如果读者已经学习了其中一本书,再学习另外一本的话,那么涉及RTOS抽象层的理论部分可跳过,只需要把精力放在RTOS内核的实现和源码API的应用方面。因为现有的RTOS在理论层基本都是相通的,但在具体的代码实现上各有特点,所以可以用这两本书进行互补学习,掌握了其中一本书的知识,再学习另外一本书定会得心应手,事半功倍。


本书的参考资料和配套硬件

本书支持野火STM32开发板全套系列,学习的时候如果配套这些硬件平台做实验,学习必会达到事半功倍的效果,可以省去中间硬件不一样时移植遇到的各种问题。


本书的技术论坛

如果在学习过程中遇到问题,可以到野火电子论坛www.firebbs.cn发帖交流,开源共享,共同进步。
鉴于水平有限,书中难免有错漏之处,热心的读者也可把勘误发送到论坛上以便改进。祝你学习愉快,RT-Thread的世界,野火与你同行。

其他信息

配套硬件

野火STM32全系列开发板

出版社

机械工业出版社

页数

416

ISBN

9787111613664

出版时间

2018-12-01

版次

1

目录

推荐序
前言
引言
第一部分 从0到1教你写RT-Thread内核
第1章 新建RT-Thread工程——软件仿真 2
1.1 新建本地工程文件夹 2
1.2 使用KEIL新建工程 3
1.2.1 New Project 3
1.2.2 Select Device for Target 3
1.2.3 Manage Run-Time Environment 4
1.3 在KEIL工程中新建文件组 5
1.4 在KEIL工程中添加文件 6
1.5 调试配置 7
1.5.1 设置软件仿真 7
1.5.2 修改时钟大小 8
1.5.3 添加头文件路径 9
第2章 裸机系统与多线程系统 10
2.1 裸机系统 10
2.1.1 轮询系统 10
2.1.2 前后台系统 11
2.2 多线程系统 12
第3章 线程的定义与线程切换的实现 15
3.1 什么是线程 16
3.2 创建线程 17
3.2.1 定义线程栈 17
3.2.2 定义线程函数 19
3.2.3 定义线程控制块 20
3.2.4 实现线程创建函数 20
3.3 实现就绪列表 30
3.3.1 定义就绪列表 30
3.3.2 将线程插入就绪列表 30
3.4 实现调度器 31
3.4.1 调度器初始化 32
3.4.2 启动调度器 33
3.4.3 第一次线程切换 34
3.4.4 系统调度 41
3.5 main()函数 44
3.6 实验现象 47
第4章 临界段的保护 50
4.1 什么是临界段 50
4.2 Cortex-M内核快速关中断指令 50
4.3 关中断 51
4.4 开中断 51
4.5 临界段代码的应用 52
4.6 实验现象 56
第5章 对象容器 57
5.1 什么是对象 57
5.1.1 对象枚举的定义 57
5.1.2 对象数据类型的定义 57
5.1.3 在线程控制块中添加对象成员 58
5.2 什么是容器 59
5.3 容器的接口实现 63
5.3.1 获取指定类型的对象信息 64
5.3.2 对象初始化 64
5.3.3 调用对象初始化函数 67
5.4 实验现象 67
第6章 空闲线程与阻塞延时 68
6.1 实现空闲线程 68
6.1.1 定义空闲线程的栈 68
6.1.2 定义空闲线程的线程控制块 69
6.1.3 定义空闲线程函数 69
6.1.4 空闲线程初始化 69
6.2 实现阻塞延时 70
6.3 SysTick_Handler()中断服务函数 73
6.4 main()函数 77
6.5 实验现象 80
第7章 多优先级 82
7.1 就绪列表 82
7.1.1 线程就绪优先级组 82
7.1.2 线程优先级表 86
7.2 修改代码以支持多优先级 88
7.2.1 修改线程控制块 88
7.2.2 修改调度器初始化函数rt_system_scheduler_init() 90
7.2.3 修改线程初始化函数rt_thread_init() 91
7.2.4 添加线程启动函数rt_thread_startup() 92
7.2.5 修改空闲线程初始化函数rt_thread_idle_init() 93
7.2.6 修改启动系统调度器函数rt_system_scheduler_start() 94
7.2.7 修改系统调度函数rt_schedule() 95
7.2.8 修改阻塞延时函数rt_thread_delay() 98
7.2.9 修改时基更新函数rt_tick_increase() 98
7.3 main()函数 99
7.4 实验现象 102
第8章 定时器 103
8.1 实现定时器 103
8.1.1 系统定时器列表 103
8.1.2 系统定时器列表初始化 104
8.1.3 定义定时器结构体 104
8.1.4 在线程控制块中内置定时器 105
8.1.5 定时器初始化函数 106
8.1.6 定时器删除函数 108
8.1.7 定时器停止函数 108
8.1.8 定时器控制函数 109
8.1.9 定时器启动函数 110
8.1.10 定时器扫描函数 115
8.2 修改代码以支持定时器 118
8.2.1 修改线程初始化函数 118
8.2.2 修改线程延时函数 119
8.2.3 修改系统时基更新函数 121
8.2.4 修改main.c文件 122
8.3 实验现象 126
第9章 时间片 127
9.1 实现时间片 127
9.1.1 在线程控制块中添加时间片相关成员 127
9.1.2 修改线程初始化函数 128
9.1.3 修改空闲线程初始化函数 129
9.1.4 修改系统时基更新函数 129
9.2 修改main.c文件 131
9.3 实验现象 135
第二部分 RT-Thread 内核应用开发
第10章 移植RT-Thread到STM32 138
10.1 获取STM32的裸机工程模板 138
10.2 下载RT-Thread Nano源码 138
10.3 安装RT-Thread Package 139
10.4 向裸机工程中添加RT-Thread源码 140
10.4.1 复制RT-Thread Package到裸机工程根目录 140
10.4.2 复制rtconfig.h文件到User文件夹 141
10.4.3 复制board.c文件到User文件夹 141
10.4.4 rt-thread文件夹内容简介 141
10.4.5 添加RT-Thread源码到工程组文件夹 143
10.5 rtconfig.h文件 145
10.5.1 rtconfig.h文件内容讲解 145
10.5.2 rtconfig.h文件修改 152
10.6 board.c文件 156
10.6.1 board.c文件内容讲解 156
10.6.2 board.c文件修改 160
10.7 添加core_delay.c和core_delay.h文件 167
10.8 修改main.c 171
10.9 下载验证 172
第11章 线程 173
11.1 硬件初始化 173
11.2 创建单线程——SRAM静态内存 175
11.2.1 定义线程函数 175
11.2.2 定义线程栈 176
11.2.3 定义线程控制块 176
11.2.4 初始化线程 176
11.2.5 启动线程 177
11.2.6 main.c文件内容 177
11.3 下载验证SRAM静态内存单线程 179
11.4 创建单线程——SRAM动态内存 179
11.4.1 动态内存空间堆的来源 180
11.4.2 定义线程函数 181
11.4.3 定义线程栈 181
11.4.4 定义线程控制块指针 181
11.4.5 创建线程 181
11.4.6 启动线程 182
11.4.7 main.c文件内容 182
11.5 下载验证SRAM动态内存单线程 184
11.6 创建多线程——SRAM动态内存 185
11.7 下载验证SRAM动态内存多线程 187
第12章 重映射串口到rt_kprintf()函数 188
12.1 rt_kprintf()函数定义 188
12.2 自定义rt_hw_console_output()函数 189
12.3 测试rt_kprintf()函数 191
12.3.1 硬件初始化 191
12.3.2 编写rt_kprintf()测试代码 192
12.3.3 下载验证 192
第13章 RT-Thread的启动流程 194
13.1 “万事俱备,只欠东风”法 194
13.2 “小心翼翼,十分谨慎”法 195
13.3 两种方法的适用情况 197
13.4 RT-Thread的启动流程 197
13.4.1 $Sub$$main()函数 198
13.4.2 rtthread_startup()函数 199
13.4.3 rt_application_init()函数 201
13.4.4 $Super$$main()函数 202
13.4.5 main()函数 203
第14章 线程管理 205
14.1 线程的基本概念 205
14.2 线程调度器的基本概念 205
14.3 线程状态的概念 206
14.4 线程状态迁移 206
14.5 常用的线程函数 207
14.5.1 线程挂起函数rt_thread_suspend() 207
14.5.2 线程恢复函数rt_thread_resume() 209
14.6 线程的设计要点 210
14.7 线程管理实验 212
14.8 实验现象 215
第15章 消息队列 216
15.1 消息队列的基本概念 216
15.2 消息队列的运作机制 217
15.3 消息队列的阻塞机制 218
15.4 消息队列的应用场景 218
15.5 消息队列控制块 218
15.6 消息队列函数 219
15.6.1 消息队列创建函数rt_mq_create() 219
15.6.2 消息队列删除函数rt_mq_delete() 221
15.6.3 消息队列发送消息函数rt_mq_send() 223
15.6.4 消息队列接收消息函数rt_mq_recv() 226
15.7 消息队列使用注意事项 229
15.8 消息队列实验 230
15.9 实验现象 233
第16章 信号量 234
16.1 信号量的基本概念 234
16.2 二值信号量的应用场景 235
16.3 二值信号量的运作机制 236
16.4 计数型信号量的运作机制 236
16.5 信号量控制块 237
16.6 信号量函数 237
16.6.1 信号量创建函数rt_sem_create() 238
16.6.2 信号量删除函数rt_sem_delete() 239
16.6.3 信号量释放函数rt_sem_release() 240
16.6.4 信号量获取函数rt_sem_take() 242
16.7 信号量实验 245
16.7.1 二值信号量同步实验 245
16.7.2 计数型信号量实验 248
16.8 实验现象 251
16.8.1 二值信号量同步实验现象 251
16.8.2 计数型信号量实验现象 252
第17章 互斥量 253
17.1 互斥量的基本概念 253
17.2 互斥量的优先级继承机制 253
17.3 互斥量的应用场景 256
17.4 互斥量的运作机制 256
17.5 互斥量控制块 257
17.6 互斥量函数 258
17.6.1 互斥量创建函数rt_mutex_create() 258
17.6.2 互斥量删除函数rt_mutex_delete() 260
17.6.3 互斥量释放函数rt_mutex_release() 261
17.6.4 互斥量获取函数rt_mutex_take() 264
17.7 互斥量使用注意事项 268
17.8 互斥量实验 268
17.9 实验现象 271
第18章 事件 272
18.1 事件的基本概念 272
18.2 事件的应用场景 273
18.3 事件的运作机制 273
18.4 事件控制块 275
18.5 事件函数 275
18.5.1 事件创建函数rt_event_create() 275
18.5.2 事件删除函数rt_event_delete() 276
18.5.3 事件发送函数rt_event_send() 277
18.5.4 事件接收函数rt_event_recv() 281
18.6 事件实验 285
18.7 实验现象 288
第19章 软件定时器 289
19.1 软件定时器的基本概念 289
19.2 软件定时器的应用场景 290
19.3 软件定时器的精度 291
19.4 软件定时器的运作机制 291
19.5 定时器超时函数 293
19.6 软件定时器的使用 297
19.7 软件定时器实验 299
19.8 实验现象 302
第20章 邮箱 303
20.1 邮箱的基本概念 303
20.2 邮箱的运作机制 304
20.3 邮箱的应用场景 305
20.4 邮箱的应用技巧 305
20.5 邮箱控制块 306
20.6 邮箱函数 306
20.6.1 邮箱创建函数rt_mb_create() 306
20.6.2 邮箱删除函数rt_mb_delete() 308
20.6.3 邮箱邮件发送函数rt_mb_send_wait()(阻塞) 310
20.6.4 邮箱邮件发送函数rt_mb_send ()(非阻塞) 315
20.6.5 邮箱邮件接收函数rt_mb_recv() 316
20.7 邮箱实验 320
20.8 实验现象 324
第21章 内存管理 325
21.1 内存管理的基本概念 325
21.2 内存管理的运作机制 327
21.2.1 静态内存管理 327
21.2.2 动态内存管理 328
21.3 内存管理的应用场景 330
21.4 静态内存管理函数 331
21.4.1 静态内存控制块 331
21.4.2 静态内存创建函数rt_mp_create() 332
21.4.3 静态内存删除函数rt_mp_delete() 335
21.4.4 静态内存初始化函数rt_mp_init() 338
21.4.5 静态内存申请函数rt_mp_alloc() 340
21.4.6 静态内存释放函数rt_mp_free() 344
21.5 动态内存管理函数 346
21.5.1 系统堆内存初始化函数rt_system_heap_init() 346
21.5.2 系统堆内存申请函数rt_malloc() 350
21.5.3 系统堆内存释放函数rt_free() 354
21.6 内存管理实验 357
21.6.1 静态内存管理实验 357
21.6.2 动态内存管理实验 361
21.7 实验现象 364
21.7.1 静态内存管理实验现象 364
21.7.2 动态内存管理实验现象 364
第22章 中断管理 366
22.1 异常与中断的基本概念 366
22.1.1 中断 367
22.1.2 和中断相关的术语 367
22.2 中断管理的运作机制 368
22.3 中断延迟的概念 369
22.4 中断管理的应用场景 370
22.5 ARM Cortex-M的中断管理 370
22.6 中断管理实验 372
22.7 实验现象 377
第23章 双向链表 378
23.1 双向链表的基本概念 378
23.2 双向链表函数 378
23.2.1 链表初始化函数rt_list_init() 378
23.2.2 向链表中插入节点 379
23.2.3 从链表删除节点函数rt_list_remove() 381
23.3 双向链表实验 382
23.4 实验现象 385
第24章 CPU利用率统计 387
24.1 CPU利用率的基本概念 387
24.2 CPU利用率的作用 387
24.3 CPU利用率统计实现 388
24.4 CPU利用率实验 392
24.5 实验现象 394
附录 参考资料和配套硬件 396

推荐序

RT-Thread从2006年走来,已经经过了十多个年头。早年就和野火相识于网络,记得那个时候野火还没那么火(才开始做开发板),RT-Thread也还只是国内一个小众的RTOS。直至2018年年中,野火过来上海才有缘相见,互道年轻 。

在2017年底,欣闻野火有著RT-Thread书籍的计划,非常欣喜、感谢。这将是RT-Thread的首本书籍,在RT-Thread的基础生态推广上有着举足轻重的作用!不仅如此,作为RT-Thread的官方合作伙伴,野火也在其全系列的STM32开发板上适配了RT-Thread例程并配套了手把手的教程。

野火的这本书籍,第一部分先从0到1的方式,从最底层的汇编开始,一步一步构造出一个RT-Thread操作系统内核,向大家揭示了任务如何定义、任务如何切换,也讲解了任务的延时如何实现,讲解了如何支持多优先级,讲解了如何实现定时器和讲解如何实现时间片等RT-Thread操作系统的核心知识点;第二部分,则讲解RT-Thread内核设施的应用,使得大家学习RT-Thread不再困难,使用RT-Thread不再困难。

整本书由浅入深,层层叠加,与初学者的入门路径完全吻合,是学习RT-Thread物联网操作系统的不二之选书籍。同时整本书也兼顾深度,对于要了解操作系统内核原理的使用者,也非常值得一看。

RT-Thread 创始人:熊谱翔

资料下载

资料百度云下载链接:

 

密码:

在线阅读

在线阅读