μC/OS-III内核实现与应用开发实战指南:基于STM32
从0到1教你写μC/OS-III内核,详解各个内核组件如何使用。
由浅入深,结合野火STM32全系列开发板,提供完整源代码,极具可操作性。
商品已成功飞到您的手机啦!快登录手机站看看吧!
> 扫一扫 下载客户端
> 微信关注“互动出版网”,便捷查询订单,更多惊喜天天有
编辑推荐
从0到1教你写μC/OS-III内核,详解各个内核组件如何使用。
由浅入深,结合野火STM32全系列开发板,提供完整源代码,极具可操作性。
内容简介
书籍 计算机书籍
本书基于野火STM32全系列开发板介绍uC/OS-III内核实现与应用开发,全书分为两部分,第一部分先教你如何从0到1把uC/OS-III内核写出来,从底层的汇编开始讲解任务如何定义、如何切换,还讲解了阻塞延时如何实现、如何支持多优先级、如何实现任务延时列表以及时间片等uC/OS的核心知识点;第二部分讲解uC/OS-III内核组件的应用以及使用uC/OS-III进行多任务编程。
本书内容翔实,案例丰富,配有大量示例代码,适合作为嵌入式领域科技工作者的参考书,也适合相关专业的学生学习参考。
目录
前言
引言
第一部分 从0到1教你写
C/OS内核
第1章 新建工程—软件仿真 2
1.1 新建本地工程文件夹 2
1.2 使用KEIL新建工程 2
1.2.1 New Project 2
1.2.2 Select Device For Target 3
1.2.3 Manage Run-Time Environment 3
1.3 在KEIL工程中新建文件组 4
1.4 在KEIL工程中添加文件 4
1.5 调试配置 6
1.5.1 设置软件仿真 6
1.5.2 修改时钟大小 6
1.5.3 添加头文件路径 7
第2章 裸机系统与多任务系统 8
2.1 裸机系统 8
2.1.1 轮询系统 8
2.1.2 前后台系统 9
2.2 多任务系统 10
第3章 任务的定义与任务切换 13
3.1 多任务系统中任务的概念 14
3.2 创建任务 15
3.2.1 定义任务栈 15
3.2.2 定义任务函数 16
3.2.3 定义任务控制块 17
3.2.4 实现任务创建函数 18
3.3 操作系统初始化 22
3.4 启动系统 24
3.5 任务切换 27
3.6 main()函数 33
3.7 实验现象 37
第4章 任务时间片运行 39
4.1 SysTick简介 39
4.2 初始化SysTick 40
4.3 编写SysTick中断服务函数 41
4.4 main()函数 42
4.5 实验现象 44
第5章 空闲任务与阻塞延时 45
5.1 实现空闲任务 45
5.1.1 定义空闲任务栈 45
5.1.2 定义空闲任务的任务控制块 46
5.1.3 定义空闲任务函数 47
5.1.4 空闲任务初始化 47
5.2 实现阻塞延时 48
5.3 main()函数 50
5.4 实验现象 52
第6章 时间戳 53
6.1 时间戳简介 53
6.2 时间戳的实现 53
6.3 时间戳代码 54
6.3.1 CPU_Init()函数 54
6.3.2 CPU_TS_Init()函数 55
6.3.3 CPU_TS_TmrInit()函数 56
6.3.4 BSP_CPU_ClkFreq()函数 57
6.3.5 CPU_TS_TmrFreqSet()函数 58
6.3.6 CPU_TS_TmrRd()函数 58
6.3.7 OS_TS_GET()函数 59
6.4 main()函数 59
6.5 实验现象 61
第7章 临界段 62
7.1 临界段简介 62
7.2 Cortex-M内核快速关中断指令 62
7.3 关中断 63
7.4 开中断 63
7.5 临界段代码的应用 64
7.6 测量关中断时间 68
7.6.1 测量关中断时间初始化 68
7.6.2 测量最大关中断时间 69
7.6.3 获取最大关中断时间 70
7.7 main()函数 71
7.8 实验现象 71
第8章 就绪列表 72
8.1 优先级表的定义及函数 72
8.2 就绪列表的定义及函数 80
8.3 main()函数 88
8.4 实验现象 88
第9章 多优先级 89
9.1 定义优先级相关全局变量 89
9.2 修改OSInit()函数 89
9.3 修改任务控制块 90
9.4 修改OSTaskCreate()函数 90
9.5 修改OS_IdleTaskInit()函数 92
9.6 修改OSStart()函数 93
9.7 修改PendSV_Handler()函数 93
9.8 修改OSTimeDly()函数 94
9.9 修改OSSched()函数 95
9.10 修改OSTimeTick()函数 97
9.11 main()函数 98
9.12 实验现象 101
第10章 时基列表 103
10.1 实现时基列表 103
10.1.1 定义时基列表变量 103
10.1.2 修改任务控制块 104
10.1.3 实现时基列表相关函数 106
10.2 修改OSTimeDly()函数 113
10.3 修改OSTimeTick()函数 114
10.4 main()函数 114
10.5 实验现象 114
第11章 时间片 115
11.1 实现时间片 115
11.1.1 修改任务控制块 115
11.1.2 实现时间片调度函数 116
11.2 修改OSTimeTick()函数 118
11.3 修改OSTaskCreate()函数 118
11.4 修改OS_IdleTaskInit()函数 120
11.5 main()函数 120
11.6 实验现象 122
第12章 任务的挂起和恢复 124
12.1 实现任务的挂起和恢复 124
12.1.1 定义任务的状态 124
12.1.2 修改任务控制块 125
12.1.3 编写任务挂起和恢复函数 126
12.2 main()函数 131
12.3 实验现象 133
第13章 任务的删除 134
13.1 实现任务删除 134
13.2 main()函数 136
13.3 实验现象 136
第二部分 C/OS-III内核
应用开发
第14章 移植C/OS-III到STM32 138
14.1 获取STM32的裸机工程模板 138
14.2 下载C/OS-III源码 138
14.3 C/OS-III源码文件介绍 141
14.3.1 EvalBoards 141
14.3.2 C-CPU 141
14.3.3 C-LIB 143
14.3.4 C/OS-III 143
14.4 移植到STM32工程 145
14.4.1 在工程中添加文件分组 145
14.4.2 添加文件到对应分组 145
14.4.3 添加头文件路径到工程中 146
14.4.4 具体的工程文件修改 147
14.4.5 修改源码中的bsp.c与bsp.h文件 149
14.5 按需配置最适合的工程 151
14.5.1 os_cfg.h 151
14.5.2 cpu_cfg.h 153
14.5.3 os_cfg_app.h 154
14.6 修改app.c 155
14.7 下载验证 157
第15章 创建任务 158
15.1 硬件初始化 158
15.2 创建单任务 160
15.2.1 定义任务栈 160
15.2.2 定义任务控制块 160
15.2.3 定义任务主体函数 160
15.2.4 创建任务 161
15.2.5 启动任务 163
15.2.6 app.c 163
15.3 下载验证单任务 166
15.4 创建多任务 166
15.5 下载验证多任务 171
第16章 C/OS-III的启动流程 172
16.1 “万事俱备,只欠东风”法 172
16.2 “小心翼翼,十分谨慎”法 173
16.3 两种方法的适用情况 175
16.4 系统的启动 175
16.4.1 系统初始化 175
16.4.2 CPU初始化 179
16.4.3 SysTick初始化 182
16.4.4 内存初始化 183
16.4.5 OSStart()函数 183
16.4.6 app.c 184
第17章 任务管理 187
17.1 任务的基本概念 187
17.2 任务调度器的基本概念 188
17.3 任务状态迁移 188
17.4 C/OS的任务状态 190
17.5 常用的任务函数 190
17.5.1 任务挂起函数OS_TaskSuspend() 191
17.5.2 任务恢复函数 OSTaskResume() 194
17.5.3 任务删除函数OSTaskDel() 198
17.5.4 任务延时函数 201
17.6 任务的设计要点 212
17.7 任务管理实验 213
17.8 实验现象 222
第18章 消息队列 223
18.1 消息队列的基本概念 223
18.2 消息队列的工作过程 224
18.2.1 消息池初始化 224
18.2.2 消息队列的运作机制 226
18.3 消息队列的阻塞机制 227
18.4 消息队列的应用场景 227
18.5 消息队列的结构 228
18.6 消息队列常用函数 230
18.6.1 消息队列创建函数OSQCreate() 230
18.6.2 消息队列删除函数OSQDel() 233
18.6.3 消息队列发送函数OSQPost() 239
18.6.4 消息队列获取函数OSQPend() 249
18.7 使用消息队列的注意事项 256
18.8 消息队列实验 257
18.9 实验现象 263
第19章 信号量 264
19.1 信号量的基本概念 264
19.1.1 二值信号量 264
19.1.2 计数信号量 265
19.2 信号量的应用场景 265
19.3 二值信号量的运作机制 266
19.4 计数信号量的运作机制 267
19.5 信号量控制块 267
19.6 信号量函数 268
19.6.1 信号量创建函数 OSSemCreate() 268
19.6.2 信号量删除函数OSSemDel() 271
19.6.3 信号量释放函数OSSemPost() 275
19.6.4 信号量获取函数OSSemPend() 280
19.7 使用信号量的注意事项 285
19.8 信号量实验 286
19.8.1 二值信号量同步实验 286
19.8.2 计数信号量实验 292
19.9 实验现象 298
19.9.1 二值信号量同步实验现象 298
19.9.2 计数信号量实验现象 299
第20章 互斥量 300
20.1 互斥量的基本概念 300
20.2 互斥量的优先级继承机制 300
20.3 互斥量的应用场景 303
20.4 互斥量的运作机制 303
20.5 互斥量控制块 304
20.6 互斥量函数 306
20.6.1 创建互斥量函数OSMutexCreate() 306
20.6.2 删除互斥量函数OSMutexDel() 308
20.6.3 获取互斥量函数OSMutexPend() 314
20.6.4 释放互斥量函数OSMutexPost() 320
20.7 互斥量相关实验 324
20.7.1 模拟优先级翻转实验 324
20.7.2 互斥量实验 330
20.8 实验现象 336
20.8.1 模拟优先级翻转实验现象 336
20.8.2 互斥量实验现象 336
第21章 事件 338
21.1 事件的基本概念 338
21.2 事件的应用场景 339
21.3 事件的运作机制 339
21.4 事件控制块 341
21.5 事件函数 342
21.5.1 事件创建函数OSFlagCreate() 342
21.5.2 事件删除函数OSFlagDel() 344
21.5.3 事件设置函数OSFlagPost() 348
21.5.4 事件等待函数OSFlagPend() 355
21.6 事件实验 366
21.7 实验现象 371
第22章 软件定时器 372
22.1 软件定时器的基本概念 372
22.2 软件定时器的应用场景 374
22.3 软件定时器的精度 374
22.4 软件定时器控制块 375
22.5 软件定时器函数 376
22.5.1 软件定时器创建函数 OSTmrCreate() 376
22.5.2 软件定时器启动函数OSTmrStart() 379
22.5.3 软件定时器列表管理 384
22.5.4 软件定时器停止函数OSTmrStop() 387
22.5.5 软件定时器删除函数OSTmrDel() 391
22.6 软件定时器任务 393
22.7 软件定时器实验 398
22.8 实验现象 403
第23章 任务信号量 405
23.1 任务信号量的基本概念 405
23.2 任务信号量函数 406
23.2.1 任务信号量释放函数OSTaskSemPost() 406
23.2.2 任务信号量获取函数OSTaskSemPend() 410
23.3 任务信号量实验 414
23.3.1 任务信号量代替二值信号量实验 414
23.3.2 任务信号量代替计数信号量实验 419
23.4 实验现象 424
23.4.1 任务信号量代替二值信号量实验现象 424
23.4.2 任务信号量代替计数信号量实验现象 425
第24章 任务消息队列 426
24.1 任务消息队列的基本概念 426
24.2 任务消息队列函数 427
24.2.1 任务消息队列发送函数OSTaskQPost() 427
24.2.2 任务消息队列获取函数OSTaskQPend() 431
24.3 任务消息队列实验 435
24.4 实验现象 439
第25章 内存管理 440
25.1 内存管理的基本概念 440
25.2 内存管理的运作机制 441
25.3 内存管理的应用场景 443
25.4 内存管理函数 443
25.4.1 内存池创建函数OSMemCreate() 443
25.4.2 内存申请函数OSMemGet() 447
25.4.3 内存释放函数OSMemPut() 449
25.5 内存管理实验 451
25.6 实验现象 456
第26章 中断管理 457
26.1 异常与中断的基本概念 457
26.1.1 与中断相关的硬件 458
26.1.2 与中断相关的术语 458
26.2 中断的运作机制 459
26.3 中断延迟的概念 460
26.4 中断的应用场景 461
26.5 ARM Cortex-M的中断管理 461
26.6 中断延迟发布 463
26.6.1 中断延迟发布的概念 463
26.6.2 中断队列控制块 465
26.6.3 中断延迟发布任务初始化函数OS_IntQTaskInit() 466
26.6.4 中断延迟发布过程函数OS_IntQPost() 468
26.6.5 中断延迟发布任务函数OS_IntQTask() 471
26.7 中断管理实验 475
26.8 实验现象 481
第27章 CPU利用率及栈检测统计 482
27.1 CPU利用率的基本概念及作用 482
27.2 CPU利用率统计初始化 483
27.3 栈溢出检测概念及作用 485
27.4 栈溢出检测过程 487
27.5 统计任务函数OS_StatTask() 487
27.6 栈检测函数OSTaskStkChk() 493
27.7 任务栈大小的确定 496
27.8 CPU利用率及栈检测统计实验 496
27.9 实验现象 502
附录 503
前言
如何学习本书
本书从0开始教你如何把C/OS-III写出来,既讲解源码实现,也讲解API如何使用。当你拿到本书开始学习时一定会惊讶,原来RTOS(Real Time Operation System,实时操作系统)的学习并没有那么复杂,原来自己也可以写操作系统,成就感立马爆棚。
全书内容循序渐进,不断迭代,前一章都是后一章的基础,因此最好从头开始阅读,不要跳跃。在学习时务必做到两点:一是不能一味地看书,要把代码和书本结合起来学习,一边看书,一边调试代码。如何调试代码呢?即单步执行每一条程序,看程序的执行流程和执行效果与自己所想的是否一致;二是在每学完一章之后,必须将配套的例程重写一遍(切记不要复制,哪怕是一个分号,但可以照书录入),以做到举一反三,确保真正理解。在自己写的时候肯定会错漏百出,这个时候要认真纠错,好好调试,这是你提高编程能力的最好机会。记住,编写程序不是一气呵成的,而是要一步一步地调试。
本书的编写风格
本书以C/OS-III官方源码为蓝本,抽丝剥茧,不断迭代,教你逐步写出C/OS-III。书中涉及的数据类型、变量名称、函数名称、文件名称、文件存放的位置都完全按照C/OS-III官方的方式来实现。学完本书之后,可以无缝地切换到原版的C/OS-III中使用。要注意的是,在实现的过程中某些函数中会去掉一些形参和冗余的代码,只保留核心的功能,但这并不会影响学习。注意,本书的目的并不是让你自己写一个操作系统,而是让你了解C/OS-III是如何写出来的,着重讲解原理实现,当你学完这本书之后,再学习其他RTOS将会事半功倍。
本书的技术论坛
如果在学习过程中遇到问题,可以到野火电子论坛www.firebbs.cn发帖交流,开源共享,共同进步。
鉴于水平有限,本书难免有错漏之处,热心的读者也可把勘误发送到论坛上以便改进。祝你学习愉快,C/OS-III的世界,野火与你同行。
媒体评论
本书基于野火STM32全系列开发板介绍μC/OS-III内核实现与应用开发,全书分为两部分:第一部分先教你如何从0到1把μC/OS-III内核写出来,从底层的汇编开始讲解任务如何定义、如何切换,还讲解了阻塞延时如何实现、如何支持多优先级、如何实现时基列表以及时间片等μC/OS的核心知识点;第二部分讲解μC/OS-III内核组件的应用以及使用μC/OS-III进行多任务编程。
本书内容翔实,案例丰富,配有大量示例代码,适合作为嵌入式领域科技工作者的参考书,也适合相关专业的学生学习参考。