| 作者 |
| 刘火良 杨森 |
| 丛书名 |
| 电子与嵌入式系统设计丛书 |
| 出版社 |
| 机械工业出版社 |
| 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 动态内存空间堆的来源 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 |