首页>参考读物>电子电工>电子工程

μC/OS-III源码分析笔记
作者 : 李悦城 野火 编著
出版日期 : 2015-12-28
ISBN : 978-7-111-51967-6
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 328
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书是基于Cortex-M3内核,从源码解析和运用两个角度全面地解析了嵌入式实时操作系统μC/OS-III。本书为了让读者更好地理解,主要按照循环渐进的顺序对μC/OS-III中的函数逐一进行分析,中间还插入了多幅帮助读者进行理解的图片,编写的过程作者也尽量采用通俗易懂的例子对书中内容进行解析。

图书特色

国内首本由本土作者深度解读μC/OS-III源码的书籍。
从提高编程技巧和深入了解调度机制等角度解读μC/OS-III源码的每个细节。
配套基于μC/OS-III的开发实例、完整的项目文件和源代码,可操作性极强。

封底:
μC/OS-III是一个可以基于ROM运行的、可裁剪的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器。为了提供最好的移植性能,μC/OS-III最大限度使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖从8位到64位的各种CPU(包括DSP)。其主要特点有公开源代码、代码结构清晰明了、注释详尽、组织有条理、可移植性好、可裁剪、可固化。本书基于μC/OS-III的全部源码深入剖析了μC/OS-III的工作原理,并且结合Cortex-M3内核进行实践操作,旨在让想深入理解嵌入式系统工作原理的读者更加容易、清晰地理解嵌入式系统的工作原理。
本书特色
源码丰富,以大量丰富的源码分析作为讲解的基础,让讲解不再是纸上谈兵。
实例驱动,丰富的实例引导读者快速理解嵌入式实时操作系统μC/OS-III。
图例丰富,丰富的图例让读者对μC/OS-III的数据结构等一目了然。


μC/OS-III是嵌入式工程师在掌握基础的MCU外设编程之后最容易掌握的一个操作系统之一。μC/OS-III不但有软件定时器、信号量、消息队列、内存管理等资源,更重要的是它能提供多个线程灵活的调度,这可以让初学者更加灵活、方便、高效地实现程序的功能。μC/OS-III早在2009年就已推出,但是直到现在市面上μC/OS-III的资料和书籍依然很少,介绍源码的资料更是少之又少,即使官方手册也没有将使用方法和原理介绍有机结合。本书详细地阐述了μC/OS-III的原理,辅以简单入门的例程,能为读者快速找到上手的法门。

李悦城 资深STM32开发者,野火初学者社区最活跃的版主之一,在社区撰写了大量的教程,曾荣获多项电子设计大赛奖项。目前主要从事可穿戴设备的研发和STM32嵌入式系统开发工作,拥有非常丰富的嵌入式实时操作系统开发经验。

图书前言

不少学习μC/OS的读者都会面临一种尴尬,就是想阅读μC/OS-III的源码却因为资料过少而转去阅读μC/OS-II的源码。如果拿着μC/OS-II的书来理解μC/OS-III的源码,多半也会感到淡淡的忧伤,因为两者的源码相差实在太大。为了更加规范,μC/OS-III不仅对很多变量进行了修改,而且在很多处理问题的机制上也有很大的突破,比如引入时间片、取消任务数量限制等,如下表所示。实际上,2009年就已推出μC/OS-III,但是直到现在市面上μC/OS-III的资料依然很少,介绍源码的资料更是少之又少,即使官方手册也只是介绍使用方法而不是介绍原理。笔者在阅读源码的过程中也遇到了一些问题,要是有足够的资料,很多疑惑就能够比较快地得到解答。所以,笔者在阅读源码时将μC/OS-III的原理、应用等记录下来,希望能为对μC/OS-III或者嵌入式实时操作系统有兴趣的读者提供帮助。
各版本μC/OS的主要区别
特征 μC/OS μC/OS-II μC/OS-III
推出年份 1992 1998 2009
书籍 有 有 有
是否开放源码 是 是 是
抢占式多任务处理 是 是 是
支持最多的任务数量 64 255 无限
每个优先级的任务数 1 1 无限
是否支持时间片轮转调度 否 否 是
信号量 有 有 有
互斥信号量 没有 有 有(可嵌套)
时间标志 没有 有 有
邮箱 有 有 没有(不需要)
队列 有 有 有
固定大小的内存管理 没有 有 有
给任务发送消息不需消息队列 否 否 是
软件定时器 否 是 是
任务挂起/恢复 否 是 是(可嵌套)
死锁预防 是 是 是
可裁剪 是 是 是
ROM空间大小 3K~8K 6K~26K 6K~24K
RAM空间大小 1K+ 1K+ 1K+
可固化 是 是 是
运行时间配置 是 是 是
编译时间配置 是 是 是
为每个内核对象分配名字 否 是 是
等待多个内核对象 否 是 是
任务寄存器 否 是 是
内嵌的性能测试 否 有限的 大量的
用户定义钩子函数 否 是 是
捕获任务返回 否 否 是
在任务中处理心跳 否 是 是
服务数目 大约20 大约90 大约70

笔者认为,阅读μC/OS-III源码的主要理由如下。
1)查看优秀的源码可以让自己的编程技巧更完善,μC/OS-III源码的风格比较好,有借鉴意义。
2)了解嵌入式内核的一些“内幕”,如在多个任务中从一个任务向另一个任务发送消息的机制,这让我很好奇!
3)学习μC/OS-III源码的过程也可以作为一个学习数据结构的机会。μC/OS-III涉及的数据结构主要是线性表,源码中的很多数据结构都设计得非常好。
4)更好地利用μC/OS-III做开发工作。μC/OS官方有这么一句话:“熟悉了μC/OS-III
这样的实时系统多任务内核后,读者将不会再回到传统的前后台系统的设计方法中去。”笔者觉得这必须建立在你真正懂μC/OS的基础上。μC/OS有时会出现莫名的问题,这时就会令人感到很头痛。当然,这主要跟使用者配置μC/OS出错或者错误使用某些系统函数有关,这也是强调要在会用的基础上学习μC/OS的原因。另外,网络协议LwIP、蓝牙协议等应用也都结合了嵌入式实时操作系统。如果已经学习过嵌入式操作系统,则会对这些知识有更好的掌握。也许在查找问题的过程中,你还能帮μC/OS找到几个bug,欢迎大家一起来
“找茬”。
本书与其他书籍的编排方式不一样:其他书籍是按照官方文件的框架或者组件的方式编排的;本书更强调循序渐进,并结合了笔者在阅读μC/OS-III源码过程中的一些想法。比如一个结构体变量可能会有多个元素,工具书一般会把它们放在一起讲解,而本书为了易于读者更好地理解,只在某些源码涉及这个元素时才会介绍其作用和含义。如果你有时要将本书当作工具书来查询,则可结合这些相关内容涉及的源码进行查找。
在数据结构方面,笔者会通过很多自己制作的图片来介绍数据结构之间的关系,以便大家更好地理解μC/OS-III中的数据结构。事实上,这是一种非常好的理解方式。
本书是基于μC/OS的V3.02.00版本的源码编写而成的。另外,为了让大家更好地理解μC/OS-III,本书基于市面上流行的STM32野火开发板ISO-V2编写例程,该开发板使用的芯片是STM32F103ZET6,该芯片是基于Cortex-M3内核的。本书例程使用的IDE是4.72.10.0版本的MDK。
本书的读者定位是那些不满足于停留在使用嵌入式系统层面上,而是想深入理解嵌入式系统工作原理的学生、老师或者技术人员。因此,对读者的要求主要是有使用μC/OS-III的经验,这样会对μC/OS-III有所把握;当然,也可以边阅读本书边使用μC/OS-III,这样看书就不会被动。另外,要对嵌入式系统的具体工作原理有比较浓厚的兴趣,就像笔者使用μC/OS-III一样,一直想研究清楚它内部的原理,于是浓厚的兴趣帮笔者在阅读
μC/OS-III源码的路上克服了很多困难。据说μC/OS-III代码量有三四万行(网上流传,未经考证),要想真正了解μC/OS-III的运行机制,就更需要兴趣。当然,对数据结构和Cortex-M3内核比较熟悉的读者也会更好地理解本书。建议读者在阅读本书的时候对上述的数据结构和Cortex-M3内核进行一定的了解,或者边读本书边学习这两方面的内容。
希望读者先看书中给出的程序,加些自己的注解,如果不懂再看书中讲解源码的文字,这样可以做到独立思考。本书比较适合采用这种阅读方式,因为本书在解析某个函数源码时会将相关知识糅合起来,而不是从头到尾逐行讲解。本书也用了一定的篇幅收纳介绍到的大部分代码,目的是让读者真正结合源码进行理解,而不是纸上谈兵。然而,这对读者提出了更高的要求。与阅读那些纯粹讲解嵌入式操作系统原理的书相比,阅读本书或许有些困难,但是如果坚持下来,相信收获也会更多。理解源码时要抓住其本质。希望本书让你学到的不只是μC/OS-III,而是嵌入式实时操作系统。
致谢
首先感谢野火科技有限公司的创始人刘火良,笔者在他的鼓励和指导下编写了本书。
其次感谢审阅本书的张浩和Ifreecoding,他们不仅对本书进行了详细的审阅,还提出了很多修改意见。
接着感谢我的父母及我的好朋友。请允许我逐一道出这些好朋友的名字:林灿杰、庄培钊、陈佳鹏、潘炜键、杨崇新、陈德兴、邹秋云、陈映鹏、郑春升、李健雄、郭心如、吴思洁等,谢谢你们让我的生命更加丰富多彩。
感谢本书的策划编辑张国强先生,是他促成了本书的出版,同时提出了宝贵的写作建议,并对书稿进行了仔细审阅。
感谢《Cortex-M3权威指南》的译者宋岩和《大话数据结构》的作者程杰,他们给我提供了学习Cortex-M3内核和数据结构的非常好的资料。
由于本书涉及的知识面广,加上时间仓促,以及笔者的水平有限,所以疏漏之处在所难免,在此恳请专家和读者批评指正,可以发送邮件到 ucos-iii@qq.com与我进行交流,或者到骁龙BBS(www.bbsxiaolong.com)发帖交流。本书所有例程及相关资料都可以在论坛的μC/OS-III版块中下载,还可加入QQ群(223501362)进行交流。
感谢购买本书的你们,让我有机会认真地做好一件事情,也愿此书能在你解读μC/OS-III源码的路上带来帮助。

李悦城  野 火

上架指导

嵌入式

封底文字

μC/OS-III是一个可以基于ROM运行的、可裁剪的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器。为了提供最好的移植性能,μC/OS II最大限度使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖从8位到64位的各种CPU(包括DSP)。其主要特点有公开源代码、代码结构清晰明了、注释详尽、组织有条理、可移植性好、可裁剪、可固化。本书基于μC/OS-III的全部源码深入剖析了μC/OS-III的工作原理,并且结合Cortex-M3内核进行实践操作,旨在让想深入理解嵌入式系统工作原理的读者更加容易、清晰地理解嵌入式系统的工作原理。

本书特色:
●源码丰富,以大量丰富的源码作为讲解的基础,让讲解不再是纸上谈兵。
●实例驱动,丰富的实例引导读者快速理解嵌入式实时操作系统μC/OS-III。
●图例丰富,丰富的图例让读者对μC/OS-III的数据结构等一目了然。

作者简介

李悦城 野火 编著:李悦城,专注于STM32、嵌入式的野火团队成员,为野火团队贡献多篇教程。目前主要专注于基于嵌入式实时操作系统的可穿戴设备的研发。

图书目录

前 言
第1章 实时操作系统及μC/OS-III简介 / 1
1.1 单片机应用程序框架 / 1
1.1.1 前后台系统 / 1
1.1.2 嵌入式实时操作系统 / 4
1.2 如何使用和学习μC/OS-III源码 / 5
1.3 μC/OS-III文件结构简介 / 7
1.4 μC/OS-III数据结构简介 / 8
1.5 任务 / 10
1.6 内核对象简介 / 11
1.6.1 信号量 / 11
1.6.2 事件标志组 / 12
1.6.3 消息队列 / 12
1.6.4 互斥信号量 / 12
1.6.5 内存分区 / 13
1.6.6 软件定时器 / 13
1.7 μC/OS-III常见的程序段 / 13
1.7.1 中断嵌套层数统计 / 13
1.7.2 开中断和关中断 / 14
1.7.3 使能中断延迟的锁住和开启调度器 / 14
1.7.4 没有使能中断延迟的锁住和开启调度器 / 15
1.7.5 中断嵌套检测 / 15
1.7.6 调度器嵌套检测 / 16
1.7.7 时间戳 / 16
1.7.8 错误类型 / 17
1.7.9 参数检测 / 17
1.7.10 内核对象类型检测 / 17
1.7.11 安全检测 / 18
1.7.12 安全关键IEC61508 / 18
1.8 总结 / 19
第2章 时钟节拍 / 20
2.1 系统节拍中断服务程序 / 20
2.2 节拍任务处理时间相关事务 / 23
2.2.1 节拍列表更新 / 24
2.2.2 节拍列表 / 27
2.2.3 哈希算法检测到期任务 / 29
2.3 总结 / 30
第3章 时间管理 / 31
3.1 实例演示 / 31
3.2 任务开始延时 / 34
3.3 任务插入节拍列表 / 40
3.4 任务取消延时 / 49
3.5 任务脱离节拍列表 / 51
3.6 获取和设置时钟节拍 / 55
3.7 μC/OS-III全局变量的定义
和声明 / 56
3.8 总结 / 57
第4章 软件定时器 / 58
4.1 实例演示 / 58
4.2 插入定时器列表 / 65
4.3 删除定时器 / 68
4.4 脱离定时器列表 / 70
4.5 停止定时器 / 71
4.6 定时器内部运行机制 / 74
4.6.1 定时器初始化 / 74
4.6.2 定时器任务 / 76
4.6.3 回调函数 / 78
4.7 定时器剩余定时时间获取 / 79
4.8 定时器状态获取 / 81
4.9 总结 / 82
第5章 多值信号量 / 83
5.1 实例演示 / 83
5.2 信号量的创建 / 85
5.3 信号量等待队列 / 86
5.4 内核对象添加到调试双向链表 / 89
5.5 内核对象从调试双向链表中
删除 / 90
5.6 部分内核对象数据结构的
特点 / 93
5.7 发布信号量 / 95
5.7.1 开始发布信号量 / 95
5.7.2 结构体指针强制类型转换 / 101
5.7.3 无确切类型指针 / 101
5.7.4 单一任务提交处理 / 102
5.7.5 标记某一内核对象被提交 / 104
5.7.6 将任务从多个等待列表中移除 / 106
5.7.7 将任务从一个等待列表中删除 / 107
5.7.8 信号量提交过程涉及的时间戳 / 108
5.8 等待信号量 / 108
5.9 等待信号量过程的解析 / 109
5.9.1 函数解析 / 110
5.9.2 阻塞准备等待内核对象的任务 / 114
5.9.3 阻塞任务 / 115
5.9.4 初始化OS_PEND_DATA类型变量 / 116
5.9.5 根据任务优先级将OS_PEND_DATA变量插入双向链表 / 116
5.10 强制解除等待状态 / 118
5.10.1 强制解除内核对象上的一个任务 / 121
5.10.2 标记某一内核对象上的任务被强制解除等待状态 / 122
5.11 删除信号量 / 123
5.12 设置信号量计数值 / 128
5.13 总结 / 130
第6章 互斥信号量mutex / 131
6.1 mutex变量的数据结构 / 131
6.2 创建mutex / 132
6.3 提交mutex / 133
6.4 等待/获取mutex / 136
6.5 获取mutex过程解析 / 137
6.5.1 开始获取mutex / 137
6.5.2 优先级继承过程 / 141
6.5.3 改变任务优先级并调整任务在各种列表中的位置 / 141
6.6 删除mutex / 142
6.7 强制解除等待mutex / 146
6.8 总结 / 148
第7章 消息队列 / 149
7.1 实例演示 / 149
7.2 消息的数据结构 / 150
7.3 消息池 / 151
7.4 消息队列解析 / 153
7.5 创建消息队列 / 155
7.6 提交消息 / 157
7.7 提交消息过程解析 / 157
7.8 等待消息过程解析 / 164
7.9 总结 / 164
第8章 事件标志 / 165
8.1 实例演示 / 165
8.2 事件标志组数据结构解析 / 167
8.3 创建事件标志组 / 167
8.4 等待事件标志组 / 169
8.5 提交事件标志组 / 177
8.6 总结 / 180
第9章 等待多个内核对象 / 181
9.1 实例演示 / 181
9.2 等待多个内核对象过程解析 / 182
9.2.1 检查多个内核对象是否被提交过 / 186
9.2.2 任务等待多个内核对象 / 188
9.3 总结 / 189
第10章 任务消息队列和任务信号量 / 190
10.1 实例演示 / 190
10.2 任务消息队列 / 191
10.2.1 任务消息队列相关数据结构解析 / 191
10.2.2 等待任务消息队列 / 192
10.2.3 任务消息队列的提交 / 196
10.2.4 强制解除等待任务消息队列 / 200
10.2.5 小结 / 201
10.3 任务信号量 / 202
10.3.1 任务信号量相关数据结构 / 202
10.3.2 等待任务信号量 / 202
10.3.3 提交任务信号量 / 205
10.3.4 强制解除等待任务信号量 / 209
10.3.5 小结 / 210
第11章 内存管理 / 211
11.1 内存碎片是怎么形成的 / 211
11.2 实例说明 / 211
11.3 内存分区控制块数据结构 / 212
11.4 创建内存分区 / 212
11.5 获取内存块 / 216
11.6 将内存块放回内存分区 / 217
11.7 总结 / 218
第12章 就绪优先级位映像表 / 219
12.1 就绪优先级位映像表数据结构 / 219
12.2 初始化就绪优先级位映像表 / 220
12.3 查找就绪优先级位映像表中最高的优先级 / 220
12.4 置就绪优先级位映像表中某个优先级处于就绪状态 / 225
12.5 将就绪优先级位映像表相应位清0 / 226
12.6 总结 / 226
第13章  就绪列表 / 227
13.1 就绪列表数据结构解析 / 227
13.2 初始化就绪列表 / 229
13.3 使任务就绪 / 229
13.4 将任务从就绪列表对应的双向链表的前面转移到后面 / 231
13.5 总结 / 232
第14章 任务切换 / 233
14.1 堆栈的基本概念 / 233
14.2 Cortex-M3堆栈 / 234
14.3 任务切换 / 235
14.4 PendSV服务程序解析 / 238
14.5 首次任务调度 / 242
14.6 任务堆栈初始化函数OSTaskStkInit解析 / 243
14.7 验证初始化堆栈弹栈结果 / 246
14.8 中断级任务切换的宏OSIntCtxSw()解析 / 248
14.9 任务切换过程中出现中断的处理 / 249
14.10 总结 / 249
第15章 任务管理 / 250
15.1 任务创建 / 250
15.2 挂起任务 / 256
15.3 恢复挂起任务 / 259
15.4 时间片轮转调度 / 262
15.4.1 时间片轮转调度初始化 / 262
15.4.2 时间片轮转调度核心算法 / 264
15.4.3 放弃时间片 / 266
15.4.4 设置任务时间片个数 / 267
15.5 任务寄存器 / 269
15.5.1 设置寄存器的内容 / 269
15.5.2 访问任务寄存器 / 271
15.6 总结 / 272
第16章 中断管理 / 273
16.1 中断延迟提交 / 273
16.1.1 延迟提交信息记录块 / 274
16.1.2 初始化延迟提交 / 274
16.1.3 中断延迟提交内核对象 / 276
16.1.4 延迟提交任务OS_IntQTask / 279
16.2 中断嵌套管理 / 282
16.3 开中断和关中断解析 / 284
16.4 进入和退出临界段代码解析 / 287
16.4.1 OS_CRITICAL_ENTER解析 / 288
16.4.2 OS_CRITICAL_ENTER_CPU_CRITICAL_EXIT解析 / 288
16.4.3 OS_CRITICAL_EXIT_NO_SCHED解析 / 288
16.4.4 OS_CRITICAL_EXIT解析 / 288
16.5 测量关中断时间 / 289
16.5.1 测量关中断的初始化 / 289
16.5.2 测量最大关中断时间 / 290
16.5.3 获取最大关中断的时间 / 292
16.6 总结 / 293
第17章 各类统计信息 / 295
17.1 实例演示 / 295
17.2 CPU使用率计算 / 296
17.3 CPU使用率测量的初始化 / 296
17.4 堆栈检测过程简介 / 298
17.5 堆栈检测 / 299
17.6 实例解读堆栈溢出 / 301
17.7 统计任务OS_StatTask / 305
17.8 总结 / 307
第18章 μC/OS-III在不同CPU上的移植 / 308
18.1 移植接口主要文件编写 / 308
18.1.1 os_cpu_c.c文件 / 308
18.1.2 os_cpu_a.asm文件 / 309
18.1.3 os_cpu.h文件 / 310
18.2 编写CPU相关文件 / 310
18.2.1 cpu_c.c文件和cpu_a.asm文件 / 310
18.2.2 cpu.h文件 / 310
18.2.3 cpu_def.h文件 / 315
18.2.4 cpu_core.c文件和cpu_core.h文件 / 316
18.2.5 cpu_cfg.h文件 / 316
18.3 编写配置文件 / 317
18.3.1 os_app_app.h文件 / 317
18.3.2 os_cfg.h文件 / 317
18.4 总结 / 317

教学资源推荐
作者: (美)Michael J. Roberts 著 田纳西大学
作者: [土耳其]A.缪拉·泰卡尔普(A. Murat Tekalp) 著
作者: 吴建华 李华 等编著
作者: [美]纽伯尔德·理查德(Newbold Richard) 著
参考读物推荐
作者: 邓仰东 朱茂华 刘春峰 编著
作者: 白海潮 编著
作者: 任文平 梁竹关 李鹏 申东娅 编著