前言
不少学习μ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-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源码的路上带来帮助。
李悦城 野火