零基础制作两轮自平衡小车


layout: wiki

title: Small RTOS51简介

作者:Songyimiao

Small RTOS51是陈明计先生参考uC/OSII和RTX51-tiny所写的。uC/OSII不适合在小RAM单片机上运行,RTX51 tiny都是用汇编写的,实在难以理解。而Small RTOS51则是糅合了两者优点,其整体架构和uC/OSII类似,而和CPU相关的处理方式参考了RTX51-tiny,比如任务切换、堆栈搬移等,使得这个系统适合在小RAM单片机上运行。

Small RTOS51的特点:

  1. 公开的源代码:只要遵循许可协议,任何人可以免费获得源代码。
  2. 可移植性:作者尽量把与CPU相关部分压缩到最小,与CPU无关的代码部分用ASICC编写。
  3. 可固化:SmallRTOS51为嵌入式系统设计,如有固化手段,可以嵌入到产品中成为产品的一部分。
  4. 占先式:SmallRTOS51可以管理16个用户任务,每个任务优先级不同。SmallRTOS51总是运行就绪条件下优先级最高的任务。
  5. 中断管理:中断可以使正在执行的任务挂起。如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行。中断嵌套层数可达255层。如果需要,可以禁止中断嵌套管理。
  6. RAM要求小:SmallRTOS51为小RAM系统设计,因而RAM需求小,相应的系统服务也少。

以下引用陈明计先生的《嵌入式实时操作系统Small RTOS51原理及应用》一书中前言部分内容:

Small RTOS51是为51系列单片机而编写的。它是完全免费的、源代码公开的多任务实时操作系统。它可在无任何外部数据存储器的单片80C51系统上运行,并且是可移植的。全书分两部分。第一部分为基础篇,介绍Small RTOS51和一些基本概念,并详细分析Small RTOS51的工作原理。第二部分为应用篇,给出部分常用硬件在Small RTOS51下驱动程序的源代码。这些源代码在DP51单片机仿真实验仪上全部调试通过,且只要经过很少的改动,或是不改动,就可以在其他环境下使用。应用篇还通过对这些源代码的分析,让读者理解基于RTOS的编程方法,并给出完整的例子让读者全面掌握基于RTOS的编程方法。

在激烈的竞争下,公司(特别是小公司)往往因为市场的压力,要求开发人员在较短的时间内把产品开发出来,从而导致产品不稳定和维护困难。我使用8051系列单片机,在当时是用汇编语言编写程序。我于1998年开始接触C51高级语言,从1999年开始直到现在,一直使用C语言编写8051的程序。在此期间,我经常思考如何在保证性能的前提下提高开发效率,并降低程序的维护难度。根据我的经验,使用C语言的确会提高开发效率,也能提高软件的可维护性;但仅仅依靠编程语言还远远不够,应该要建立自己的开发平台。在平台上开发,才能事半功倍。嵌入式实时操作系统(RTOS)就是一个很好的嵌入式软件的开发平台。近年来,随着半导体工业的发展,32位单片机的价格持续降低。在某些应用中,使用32位单片机的总体成本更低,而在32位单片机中不使用RTOS几乎是不可能的。因而,在嵌入式系统中使用RTOS是大势所趋。

到2001年,我下决心学习RTOS。当时我仍旧是用8051系列单片机开发产品,于是想通过一个基于51单片机的RTOS来学习它。当时基于51单片机的RTOS中比较有名气的有Keil C51所带的RTX Full和RTX Tiny及网友移植的μC/OSII。以下对这几个RTOS进行简单的介绍。

RTX51是一个用于8051系列单片机的多任务实时操作系统。有两个不同的RTX51版本可以利用。其中RTX51 Full使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换。RTX51工作在与中断功能相似的状态下,信号和信息可以通过邮箱系统在任务之间互相传递。您可以从一存储池中分配和释放内存;可以强迫一个任务等待中断、超时,或者是从另一个任务或中断发出信号、信息。而RTX51 Tiny是一个 RTX51的子集,可以很容易地在没有任何外部存储器的单片8051系统上运转;但它仅支持时间片轮转任务切换和使用信号进行任务切换(即非抢占式的),不支持抢占式的任务切换,不包括消息队列,没有存储器池分配程序。

μC/OSII是著名的、源码公开的实时内核,可用于各类8位、16位和32位单片机或DSP。从μC/OS算起,该内核已有10余年应用史,并在诸多领域得到广泛应用。μC/OSII是一个完整、可移植、可固化和可剪裁的占先式实时多任务内核。μC/OSII是用ANSI的C语言编写的,包含一小部分汇编代码,使之可以供不同架构的微处理器使用。至今,从8位到64位,μC/OSII已在超过40种不同架构的微处理器上运行。

8051系列单片机一般只有很少的ROM和RAM资源,如P89C51只有4 KB Flash和128字节RAM。但RTX51 Full自身代码有6 K多字节,且需要大量外部RAM,又无源代码,很多时候不实用,不利于学习。RTX Tiny虽然小(自身占用900多字节ROM),但是任务没有优先级和中断管理,也无源代码,也不太实用(目前Keil已经把RTX Tiny的源码提供给其正版用户,全部是汇编代码),也不利于学习。而μC/OSII有源代码,也有配套图书,比较利于学习。但是它规模太大,又需要大量外部RAM,而且所有函数都必须是可重入函数,用在8051这类小片内RAM的单片机上有点勉强,在8051系列单片机上不太实用。

于是为了学习RTOS,也为了建立自己的开发平台,到2002年春节,我下决心自己编写一个基于8051系列单片机的RTOS,这就是Small RTOS51 V 0.50版。它使用了RTX51 Tiny的堆栈管理机制,并像μC/OSII一样是抢占式的。虽然它为51系列单片机编写,但比较容易移植到其他CPU上。

到2002年6月,经过一些实践的检验,Small RTOS51升级到 V 1.00版,这也是公开发布的第一个版本。目前Small RTOS51最新版本为V 1.12.1版,V 120.0版本也已基本完成,在本书发售时应该已经发布,读者可以到http://www.zlgmcu.com/philips/philipsembedsys.asp下载最新版。目前Small RTOS51的所有版本均可以免费在任何领域使用,详细情况请参考使用许可证(见附录A)。V 1.20.0版与V 1.12.1版相比,主要有以下改变:

支持任务动态建立与删除,函数功能向一般的RTOS靠拢;支持C51的重入函数(用关键字reentrant定义的函数);支持动态内存分配(使用动态内存分配的任务必须使用重入栈),并增加一个对PHILIPS公司的ARM(LPC2106/LPC2105/LPC2104)的移植。