raw os 的起源以及展望
raw os第一行代码起于2012年1月15号,2012年4月28号发布了第一版。在2012年之前一直彷徨是不是要写一个实时操作系统,彷徨的原因是目前世界上有这么多的实时操作系统,有开源的也有闭源的实时操作系统,自己还有必要去写一个这样的实时操作系统吗?这样的彷徨了好多年,突然意识到应该要做些什么了。世界上的实时操作系统再多也是别人的,纵观国内的实时系统处于零星之火,自己写一个实时操作系统完全是能造福国人的。凭借此想法就开始了raw os的发展之路,也就是那个时候创建了中国RTOS联盟群,至此一路不可自制,行进之今。
raw os 做了很多,也有很多没做,需要更多更多的国人支持,才能切实的走下去,进而造福国人。
对于raw os的未来,希望在工控领域铺开来安家,也希望在强实时性的消费类电子领域铺广开来。
raw os 的设计哲学
一个实时操作系统的哲学的指导,往往能决定这个系统的最终层次。Raw os 的第一行代码起始于2012年1月15号,期间积累了10年以上的操作系统经验。
raw os 的理念是承上启下,广采博取,加以糅合创新,自成一脉。
大神牛顿有一句话说得很好:
如果说我比别人看得更远些,那是因为我站在了巨人的肩上。
牛顿的意思有两个层面,第一他肯定了前人的贡献,第二他在前人的基础上做出了创新。这个哲学思想无时不刻影响着raw os的前进。
一个系统如果固步自封,不吸取活水的话,是不可能有未来的,本人始终认为一个实时操作系统的根本在于它的内核的先进和创新性。
以下举几个例子来说明这个哲学观念:
1 raw os 的调度算法一定程度上参考了日本著名实时操作系统t kernel。
2 raw os 的api 设计一定程度上参考了threadx 的api 设计。
3 raw os 的任务状态机一定程度上参考了ucos 3 的任务状态设计。
4 raw os 的中断下半部一定程度上参考了linux的中断下半部设计。
5 raw os 的事件驱动框架以及fsm, hsm状态机的设计参考了QP 操作系统。
以及还有很多的这样的情况,不举例子了。
所以读者仔细阅读raw os 源码的时候无时不刻能感受到多方面的亲切。
raw os除了继承优秀系统的特性外,自我创新了很多的特性,比如中断下半部task 0, 内核最大关中断时间为0us等等,具更多的特性请参考官网。
raw os究竟可以多小?可以多快?
由于raw os 针对市场是目前中低端的cpu,所谓的中低端cpu 一般以arm 9 划分,arm 9 级别的或者类似速度的cpu 为中端cpu, 以上的比如arm 11为高端cpu, 以下的为低端cpu, 比如cortex-m0,cortex-m3,cortex-m4等等。
raw os的市场既然已经决定在中低端cpu, raw os 力争做到世界上所有实时操作系统之中的体积最小以及速度最快者。基于此理论,整个raw os 的模块是可以高度可配置的,甚至每一个api 也可以单独使能配置,具体的参看raw_config.h。
实战证明raw os整个内核高度配置后,在cortex-m3上的只读代码体积在2K左右,ram只有几百个字节。raw os整个内核在cortex-m0 上的只读代码体积在1.5K左右,ram只有几百个字节。Micro raw os 的体积更小只读代码只需要1K, 而ram只需要几个字节。
天下武功唯快不破,操作系统原则上运行速度越快越好,raw os 正是基于此理论而精益求精,不断优化加速,达到极限。当然实时操作系统的实时性永远是最重要的,有的时候宁愿算法效率低一点也要保证实时性这个原则的贯彻。
raw os 的各个模块都是经过算法极限处理过的,保证在同类产品中,速度无论是在调度方面还是时钟处理方面都是保持领先的。举其中一个例子,比如bit_search_first_one这个函数是一个找到最高优先级的函数,此函数在32位cpu 和8位cpu 是不同的版本,用来加速不同类型的cpu。具体的可以通过RAW_CPU_WIDTH_32使能或者关闭。
如果单独使用基于raw os的事件触发系统,ram只占有几个字节,也省去了任务栈空间。在实时性上也不比实时操作系统差,具体的章节请参阅基于空闲任务的事件触发机制。
综上所述,raw os 在中低端cpu 上速度和体积都是精心优化过的,特别是在cortex-m 系列的cpu 上具有很大的优势。
Raw os 整体内核架构
raw os的整体模块有以下几种:
1 消息队列queue, 对应的内核文件为raw_queue.c。
此模块的特点是消息队列发送的是消息的指针。可适用于中断发送消息。
2 消息队列queue size,对应的内核文件为raw_queue_size.c。
此模块的特点是消息队列发送的是消息的指针以及消息的大小。可适用于中断发送消息。
3 消息队列mqueue,对应的内核文件为raw_mqueue.c。
此模块的特点是消息队列发送的是消息的指针以及大小并且能按照消息的优先级排序。不可用于中断发送消息。
4 消息队列queue buffer,对应的内核文件为raw_queue_buffer.c。
此模块的特点是消息队列内部会维护一个buffer,当发送消息时,会把消息copy到消息队列内部的buffer,任务接收消息时会从内部buffer把消息copy到用户的buffer中。
5 信号量semaphore ,对应的内核文件为raw_sem.c。
信号量可用于临界区的保护,更多的用于任务的同步。
6 事件标志位event, 对应的内核文件为raw_event.c。一个事件标志有32位。任务可以在事件标志位上实现and 和 or关系的对应操作。
7块内存分配block ,对应的内核文件为raw_block.c
内存一块块的分配,特点是速度快但是不能用于不同字节的分配。可适用于中断。
8字节内存分配byte, 对应的内核文件为raw_byte.c
可以分配不同字节的内存,缺点是有内存碎片,而且存在分配的时间不规定上,不利于实时性。
9 空闲任务事件,对应的内核文件为raw_idle_event.c。空闲任务的优先级是最低的,此模块的特点是利用空闲任务使用以状态机为基础的