1. 引 言

1.1. 为什么学习RTOS

当我们进入嵌入式这个领域时,首先接触的往往是单片机编程,单片机编程又首选51单片机来入门。这里面说的单片机编程通 常都是指裸机编程,即不加入任何RTOS(Real Time OperationSystem,实时操作系统)的编程。常用的RTOS有国外的 FreeRTOS、μC/OS、RTX和国内的Huawei LiteOS、和RT-Thread等,其中开源且免费的FreeRTOS的市场占有率最高,历史悠 久的μC/OS位居第二。

在裸机系统中,所有的程序基本都是自己写的,所有的操作都是在一个无限的大循环里面实现。现实生活中的很多中小型电子 产品中用的都是裸机系统,而且能够满足需求。但是为什么还要学习RTOS编程,要涉及一个操作系统呢?一是基于项目需求, 随着产品要实现的功能越来越多,单纯的裸机系统已经不能完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的 难度,可以考虑引入RTOS实现多任务管理,这是使用RTOS的最大优势。二是出于学习的需要,必须学习更高级的技术,实现更 好的职业规划,为将来能有更好的职业发展做准备,而不是拘泥于裸机编程。作为一个合格的嵌入式软件工程师,学习是永远 不能停止的,时刻都要为将来做准备。书到用时方恨少,希望当机会来临时,你不要有这种感觉。

为了帮大家厘清RTOS编程的思路,本书将简单分析这两种编程方式的区别,我们称之为“为学习RTOS的命门”,只要掌握这一关 键内容,以后的RTOS学习可以说是易如反掌。在讲解这两种编程方式的区别时,我们主要讲解方法论,不会涉及具体的代码, 即主要还是通过伪代码来讲解。

1.2. 如何学习RTOS

裸机编程和RTOS编程的风格有些不一样,而且有很多人说学习RTOS很难,这就导致想要学习的人一听到RTOS编程就会忌惮三 分,结果就是“出师未捷身先死”。

那么到底如何学习一个RTOS?最简单的方法就是在别人移植好的系统上先看一看RTOS中的API使用说明,然后调用这些API实 现自己想要的功能,完全不用关心底层的移植,这是最简单、快速的入门方法。这种方法有利有弊。如果是做产品,好处是可 以快速实现功能,将产品推向市场,赢得先机,弊端是当程序出现问题时,因对RTOS不够了解,会导致调试困难。如果想系 统地学习RTOS,那么只会简单地调用API是不可取的,我们应该深入学习其中一款RTOS。

目前市场上的RTOS,其内核实现方式差异不大,我们只需要深入学习其中一款即可。万变不离其宗,只要掌握了一款RTOS, 以后换到其他型号的RTOS,使用起来自然也得心应手。那么如何深入地学习一款RTOS呢?这里有一个非常有效但也十分难 的方法,就是阅读RTOS的源码,深入研究内核和每个组件的实现方式。这个过程枯燥且痛苦。但为了能够学到RTOS的精华, 还是很值得一试的。

市面上虽然有一些讲解相关RTOS源码的书,但如果基础知识掌握得不够,且先前没有使用过该款RTOS,那么只看源码还是会 非常枯燥,并且不能从全局掌握整个RTOS的构成和实现。

现在,我们采用一种全新的方法来教大家学习一款RTOS,既不是单纯地介绍其中的API如何使用,也不是单纯地拿里面的源 码一句句地讲解,而是从0开始,层层叠加,不断完善,教大家如何把一个RTOS写0到1写出来,让你在每一个阶段都能享受 到成功的喜悦。在这个RTOS实现的过程中,只需要具备C语言基础即可,然后就是跟着本书笃定前行,最后定有所成。

这个用来教学的RTOS,我们不会完全自己写一个,不会再重复的造轮子,而是选取年龄最大(26岁)、商业化最成功、安全 验证最多的μC/OS-III为蓝本,将其抽丝剥茧,层层叠加,从0到1写出来。在实现的过程中,数据类型、变量名、函数名称、 文件类型等都完全按照μC/OS-III里面的写法,不会自己再重新命名。这样学完我们这个课程之后,就可以无缝地过渡 到μC/OS-III的使用。

1.3. 如何选择RTOS

选择一个RTOS要看下你是学习还是做产品,如果是学习则选择一个年龄最大,商业化最成功,安全验证最多的来学习,而且 是深入学习。那么符合前面这几个标准的只有μC/OS,所以,学一个RTOS,首选μC/OS,而且μC/OS的资料是最多的。当然, 选择其他的RTOS来学习也是可以的。学完之后就是要用了,如果是产品中使用μC/OS就要面临授权的问题,就是要给版权费。 一听到要给钱,大家肯定是不乐意了,所以开源免费的FreeRTOS就受到各个半导体厂商和开发者的青睐。目前,FreeRTOS 是市场占有率最高的RTOS,非常适合用来做产品。另外,国内的RT-Thread也在迅速的崛起,同样是开源免费。