描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111613664
内容简介
本书基于野火STM32全系列开发板介绍RT-Thread内核实现与应用开发,全书分为两部分:*部分教你如何从0到1把RT-Thread内核写出来,从底层的汇编开始讲解线程如何定义、如何切换,还讲解了阻塞延时如何实现、如何支持多优先级、如何实现定时器以及时间片等RT-Thread的核心知识点;第二部分则讲解RT-Thread内核组件的应用以及如何使用RT-Thread进行多线程编程。
本书内容翔实,案例丰富,配有大量示例代码,适合作为嵌入式领域科技工作者的参考书,也适合相关专业学生学习参考。
本书内容翔实,案例丰富,配有大量示例代码,适合作为嵌入式领域科技工作者的参考书,也适合相关专业学生学习参考。
目 录
推荐序
前言
引言
部分 从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 动态内存空间堆的来源
前言
引言
部分 从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 动态内存空间堆的来源
前 言
如何学习本书
本书是首本系统讲解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在理论层基本都是相通的,但在具体的代码实现上各有特点,所以可以用这两本书进行互补学习,掌握了其中一本书的知识,再学习另外一本书定会得心应手,事半功倍。
本书的参考资料和配套硬件
关于本书的参考资料和配套硬件的信息,请参考本书附录部分。
本书的技术论坛
如果在学习过程中遇到问题,可以到野火电子论坛www.firebbs.cn发帖交流,开源共享,共同进步。
鉴于水平有限,书中难免有错漏之处,热心的读者也可把勘误发送到论坛上以便改进。祝你学习愉快,RT-Thread的世界,野火与你同行。
本书是首本系统讲解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在理论层基本都是相通的,但在具体的代码实现上各有特点,所以可以用这两本书进行互补学习,掌握了其中一本书的知识,再学习另外一本书定会得心应手,事半功倍。
本书的参考资料和配套硬件
关于本书的参考资料和配套硬件的信息,请参考本书附录部分。
本书的技术论坛
如果在学习过程中遇到问题,可以到野火电子论坛www.firebbs.cn发帖交流,开源共享,共同进步。
鉴于水平有限,书中难免有错漏之处,热心的读者也可把勘误发送到论坛上以便改进。祝你学习愉快,RT-Thread的世界,野火与你同行。
评论
还没有评论。