FOS目前支持的功能:
1. 支持多任务运行, 支持基于优先级任务调度,支持同等优先级FIFO调度。
2. 支持message queue。
3. 支持信号量, 支持互斥锁, 支持优先级置顶算法。
4. 支持软定时器、延时函数。
5. 支持一个int的bit个数的任务数。
6.支持0中断延迟时间。
7. 简化整个软件框架。只用old_task和new_task维护任务切换。
8. 系统支持优先启动任何任务,包括低优先级任务。
9. 支持创建任务时指明是否可以运行。
10. 支持shell组件。
11. 支持uip协议栈。
12. 支持文件系统。
操作系统是管理软硬件的一套软件,有了操作系统,用户不再对硬件设备和资源进行直接操作,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务间的通信。操作系统提供了一些基本的服务如任务切换、阻塞机制、信息传递、中断服务等。随着技术的进步,操作系统的功能逐渐向复杂发展,开发难度也随之提高,为了适应在各种复杂场景,任务有多种状态,像Linux的任务就有6种状态,但这也引申一个问题,复杂的状态转换会导致不稳定因素增加。笔者认为相同功能的情况下,简单的软件框架更能代表稳定。嵌入式实时操作系统的关键性能指标中断延时及对实时控制的影响,关闭中断对于保护临界资源确实有效,但是如果系统过多时间处于这种屏蔽中断的时间里,其他异步事件难以得到及时响应,这会造成系统实时性变差。笔者认为中断能及时相应是关于操作系统实时性的一个关键因素。操作系统的结构一般比较复杂,学习曲线较长,FOS尝试简化内核结构框架,达到稳定,易于理解学习并且开发。
使用RTOS是大势所趋:
前后台系统描述的是用一个while(1)超循环作为后台,里面处理用户代码,代码顺序执行,紧急的事件用中断异步通知,中断服务是前台。后台也可以叫做任务级。前台也叫中断级。时间相关性很强的关键操作一定是靠中断服务来保证的。因为中断服务提供的信息一直要等到后台程序走到该处理这个信息这一步时才能得到处理,这种系统在处理信息的及时性上,比实际可以做到的要差。这个指标称作任务级响应时间。最坏情况下的任务级响应时间取决于整个循环的执行时间。因为循环的执行时间不是常数,程序经过某一特定部分的准确时间也是不能确定的。进而,如果程序修改了,循环的时序也会受到影响。其伪代码格式如下
void main()
{
while(1)
{
user code;
}
}
void interrupt()
{
user code;
}
以上伪代码中main主函数是不可以返回的,因为如果返回,程序PC指针不知会跑到哪里去,就是出现所谓的“跑飞”。
1)优点:
编程模型简单,新人易于上手,很多8bit微控制器采用这种模型。前后台系统是面向比较简单的外围设备处理,以及少任务的软件系统。特别是只专注于一件事情,比如接收传输速度极高的数据,用此结构非常完美。
2)缺点:
(1)while(1)里面函数一个卡住,会造成后面代码执行时间的不确定性,实时性难以保证。在中断处理函数未完成之前,其他低优先级中断无法响应,可能造成中断丢失;
(2)但代码量达到一定数量时候,根据经验值,裸跑程序一般大于50K(代码大约2W行),程序的结构将会变得杂乱无章,无法维护;
(3)任务之间的通信和同步机制比较困难。需要编写一个可以管理信息的队列。
使用RTOS的优点
(1)有一定的软件架构,容易维护大数量的代码;
(2)实时性能得到保证;
(3)多线程、模块化开发,符合软件工程思想,对于用户来说,有一定的软件开发模型;
(4)RTOS提供丰富的API,比如同步,定时,优先级等函数协助用户规划任务;
(5)对于系统cpu移植或是中间件移植有一定的规律,降低移植难度。
FOS创新点
传统的操作系统行为比较多,任务有多种状态,比如阻塞态,运行态,就绪态,状态间转换对于新手来说晦涩难懂,不利于公司的人手交替;复杂代表不稳定因素多,而FOS采用极简的哲学方法,用两种状态概括所有RTOS的任务状态,即可以运行状态和不可以运行状态,另外采用两个全局变量记录运行的任务,和被替换的旧任务,达到简化整个RTOS内核框架。当任务被阻塞的时候就是不可以运行状态,不被阻塞就是就绪状态,也就是可以运行状态,不同的阻塞情况用一个flag标志。
传统操作系统很多地方用关闭中断的方式去保护临界资源。关闭中断保护资源是最简单有效的保护办法,但是同时也要牺牲RTOS的性能作为代价。笔者认为衡量一个RTOS实时性的一个关键指标是系统关闭中断时间的最大值,如果中断得不到及时的相应,那无从谈实时性。如果采用关闭调度器的办法代替关闭中断保护临界资源,那么系统的实时性将大大增强。临界资源在用户任务与用户任务,用户任务与中断任务,中断任务于中断任务之间发生抢占。在FOS中断部分设计,把中断任务当作普通用户任务处理,并不是所有的中断都是最紧急的事情,有些中断甚至比用户的任务优先级别还要低,根据这个原则,可以赋予中断任务优先级,然后交给操作系统去调度。这样就简化了临界资源的抢占发生点,操作系统去调度所有任务的,关闭调度器可以有效的防止临界资源的抢占。系统关闭中断造成的延时减少,因此系统实时性大大增加。
Download source code: https://github.com/yangshanjin/YSJ_OS