转自:http://blog.sina.com.cn/s/blog_7faddd2d0100uu37.html

 本文是本人(陈眀计)很久以前撰写的,当前源码可在http://www.zlgmcu.com/philips/philips-embedsys.asp下载。因为种种原因,这两个操作系统均不再更新,读者可以自行修改和升级。

 

1 简介

在详细说明之前,我们先看图1、图2这两幅图。从两幅图中可以看出,图1是Small RTOS的一个例子的运行界面,而图1的最下方的“045.3%”为CPU的占有率。图2是STOS++的一个例子的运行界面,图2的最下方的“044.5%”也是CPU的占有率。这两幅图很相似,事实上这两个例子的代码也很相似只是图1所示的例子是用c语言编写,其基于的操作系统为Small RTOS V1.51,而图2所示的例子是用c++语言编写,其基于的操作系统为STOS++ V1.51。而Small RTOS使用标准c编写,而STOS++用c++编写,他们的代码也是极其相似的。 

RTOS姊妹花鈥斺擲mall <wbr>RTOS与STOS++简介

图1 Small RTOS 范例运行界面

大家仔细看一下两者的CPU占有率:基于Small RTOS是45.3%,而基于STOS++是44.5% !很意外吧,用c++语言编写的程序的执行效率居然更高!事实上,这个结果对于笔者来说也很意外,笔者本以为STOS++的效率会稍微低一点。笔者可以保证其应用程序对执行效率的影响很小(可以参考源代码),而两个RTOS的代码相似,又都是使用ADS1.2,编译参数也没有区别,唯一的解释是编译器对c++的this指针优化得很好。当然,换一个编译器其效果可能不一样。

至于占用存储的的比较,从编译结果来看,STOS++的代码会大一点,但则没有普遍意义:作例子的程序并没有发挥c++的优势。而STOS++的ram占用小一点,但这已没有意义:C++的对象会占用一些堆空间,在实际运行时其占用的空间可能不比Small RTOS小。
RTOS姊妹花鈥斺擲mall <wbr>RTOS与STOS++简介

图2 STOS++ 范例运行界面

Small RTOS v1.50在32位CPU上可以说支持无限的任务(仅受内存限制),任务优先级暂定为32级,任务切换基于优先级,同级任务基于轮询。同时,任务之间可以直接放送消息和回馈消息。而等待事件支持可以选择基于FIFO或基于优先级。

STOS++是Small RTOS对应版本的孪生姐妹。Small RTOS是用标准C语言实现的,而STOS++是用标准C++语言实现的。当然,STOS++也使用了少量的汇编语言(移植代码)。为了支持中断处理,一部分代码实际上是C语言代码。虽然STOS++使用C++编写而Small RTOS使用C编写,但两者的算法一致。事实上,STOS++是在同版本的Small RTOS编写完成后用C++改写的。因此她们的代码很相似,其功能也相似,性能也相近。与Small RTOS v1.50.0一样,STOS++支持无限的任务(仅受内存限制),任务优先级暂定为32级,任务切换基于优先级,同级任务基于轮询。同时,任务之间可以直接放送消息和回馈消息。而等待事件支持可以选择基于FIFO或基于优先级。

这个版本的Small RTOS和STOS++是不完善版本,很多事件如消息邮箱等还没有支持但事件公共部分代码已完成,其它事件代码如以添加。debug也还没有支持,目前仅支持ARM7。

2 特点

2.1 共同特点 

l公开源代码

对于当前版本,只要遵循许可协议,任何人可以免费获得源代码。 

l支持任务数“无限制”。

Small RTOS实际最大支持(2^32 – 1)个任务,一般的32位机只2^32字节存储空间,不可能有足够的存储空间让这么多任务运行。事实上,目前即使64位机也不需要这么多任务同时运行。而STOS++的支持的任务数仅受内存限制。

 

 

l任务支持优先级,暂定支持32个优先级。

l不同优先级的任务之间完全基于优先级调度。

高优先级的任务在运行则低优先级的任务不能得到运行。事实上,如果所有任务的优先级均不同,则可认为她们是完全基于优先级的。

l同优先级的任务之间基于时间片轮询调度。 

同优先级的任务之间基于时间片调度。目前分配给同一优先级的任务的时间片相同,但不同优先级可以由不同大小的时间片。

l任务之间可以直接发送消息。

不需要事件的支持,任务间可以直接发送消息,而收到消息的任务也可返回一个消息给发送者。一个任务同一个时刻只可以给一个任务发一个消息。如果接收消息的任务还没有把消息收走,又发消息则自身被挂起直至消息被收走。发给同一个任务的消息以FIFO或LIFO方式接收。

l事件(信号量、消息队列等)可基于FIFO方式调度也可基于优先级方式调度。

目前仅支持信号量和消息队列,但事件底层公共代码已完成,添加事件支持很容易。 

lmain()函数就是优先级最低的任务。

l可固化

她们为嵌入式系统设计,如果您有固化手段,它可以嵌入到您的产品中成为产品的一部分。

l中断管理

中断可以使正在执行的任务挂起。如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行。中断嵌套层数可达255层。

lRAM需求小

代码考虑了小RAM的应用,在RTOS中对RAM的需求是比较少的。

2.2 Small RTOS独特特点

l基于标准C语言编写。

l可移植

 

作者尽量使用把与CPU相关部分压缩到最小,与CPU无关部分用ANSI C编写。

2.3 STOS++独特特点

l基于标准C++编写,使用更方便。

每个任务(优先级最低的除外)都是一个对象,都有共同的祖先OS_TASK。通过OS_TASK的方法访问RTOS。

l与CPU管部分代码与同版本的Small RTOS相同。

这样,如果CPU既支持C又支持C++,只需移植一次,Small RTOS和RTOS++均可使用。

2.4 未来的版本

 

未来的版本除了增加事件支持外,最主要的是增加调试支持。