嵌入式操作系统-ucos是什么?

一句话概括ucos系统:一款源代码开放的,抢占式多任务实时操作系统。其在整个嵌入式产品的架构中的角色和主要功能代码如下图所示:ucos 系统建立了用户程序和底层硬件之间沟通的渠道。通过ucos系统的管理和调度,一方面可以很好的对硬件进行驱动;另一方面可以为上层用户软件提供系统级别的软件支撑。

嵌入式操作系统-ucos是什么?_第1张图片

ucos的任务】:

前面我们提到:前后台系统的后台部分,作为软件的核心处理主体,一直处于无限循环状态。同样,ucos的任务和这个后台系统及其他的多任务系统一样,每个任务都是一个独立功能的无限循环。不同的是,ucos支持任务的参数输入

嵌入式操作系统-ucos是什么?_第2张图片

任务如何实现状态变迁】:

世间万物,在其存在期间都有各种各样的生存状态。软件领域里的任务也不例外。在ucos系统中,任务也有着自己的状态表示,同时还可以根据“外界环境”的变化和系统内部提供的指令接口在各个状态之间进行变迁。

任务睡眠状态

睡眠状态下的任务,驻留在内存中,或者可以理解为用户已经在代码实现上完成了coding,但是并没有让ucos接管该任务的管理权。即在这种状态下,ucos系统是不会对这类任务进行调度和处理的。通过ucos系统的指令接口OsTaskCreate和OsTaskDel,实现用户和ucos间对任务管理权的交接。

嵌入式操作系统-ucos是什么?_第3张图片

任务就绪状态

当任务被创建并由ucos接管后,即进入到就绪状态。换句话说,就是等待CPU资源进行任务的运行。但是什么时候能够获取到CPU资源,将由ucos系统调度来决定。

任务运行状态

当任务获取到CPU资源,即进入到运行状态。在该中状态下,任务占用CPU和其他资源按照任务的设定功能执行相关代码,提供相关任务的服务。

任务等待状态

多任务系统中,很多资源都是所有任务共享的。当任务试图获取某项资源失败后,都会进入到等待状态。在等待状态中,该任务会释放CPU资源,进入被等待资源的等待队列中。当被等待资源被释放后,ucos会从等待队列中,找到优先级最高的等待任务恢复到运行状态继续执行。

同时,ucos系统也提供了另一种等待策略:任务延时等待。即运行状态下的任务,可以通过延时等待功能进入到等待状态,此时释放CPU资源。当等待超时后,会重新抢夺CPU资源,至于那个时候能不能抢到,就看超时后调度的时刻是否有优先级更高的任务了。

任务中断状态

中断状态,即任务在执行过程中,被硬件中断处理过程打断执行过程,被迫放弃CPU资源。进入到中断服务函数中。当中断结束后,重新对CPU资源进行抢占。同理,能否抢到CPU资源,就要看任务调度时刻,是否有更高优先级的任务就绪。下图优先级B>C>A。所以当ISR结束后,CPU资源被任务B抢占。

嵌入式操作系统-ucos是什么?_第4张图片

任务信息如何存储】:

现实生活中,每个人都有个人档案用于存放个人的历史和关键信息。同样的,ucos为每个任务专门制作了各自对应的档案,档案对应的数据结构(数据结构体),就被我们称为TCB(Tack Control Block)即任务控制块。有了这些TCB帮助,当任务从切换或者打断中恢复执行,能够保证从被打断点继续执行。具体任务的TCB细节说明,将会在下一个章节的任务管理中,详细介绍。

任务就绪表】:

如上文提到,任务需要进入到就绪状态后,才能够在合适的时间内被ucos系统进行调度。为了便于索引,ucos系统在内部建立了就绪组OsRdyGrp(8个bit单位)和就绪位数组OsRdyTbl[](每个元素为8个bit单位)两个变量,用于和任务的优先级建立索引关系。ucos系统中,共定义0-63,即64个任务优先级。0的优先级最高,63优先级最低。

OsRdyGrp的定义:

嵌入式操作系统-ucos是什么?_第5张图片

OsRdyGrp与OsRdyTbl[]之间的映射图:

嵌入式操作系统-ucos是什么?_第6张图片

:当OsRdyTbl[x]任何一个bit置位,对应的OsRdyGrp的第x位bit也相应置位。x=0-7。

任务如何调度的】:

按照我们前文的介绍,ucos总是让处在就绪状态并且优先级最高的那个任务占用CPU资源运行。那么从64个任务中,如何找到就绪并且优先级最高的任务,就是任务调度器的工作了。部分任务调度器的源码如下:

嵌入式操作系统-ucos是什么?_第7张图片

我们需要重点关注:

  • - 第二个if语句。判断从就绪队列获取的任务最高有限,与当前运行任务的有限级的比较
  • - OS_TASK_SW()的调度:该函数宏定义,用于出发一次任务的调度。

注:在操作系统中,调度总是认为由中断引起。这里很多处理器提供了一种模拟硬中断的机制:软中断语句,让CPU误以为的确发生了中断事件,需要进行任务的调度检查从而进行任务的调度。具体任务的调度细节,如任务现场如何保存,堆栈如何恢复,将会在后面ucos的任务管理里面,重点讲解。

ucos系统的初始化和启动】:

ucos的系统初始化比较简单,直接调用OSInit()即可。需要注意的是:ucos借鉴了模块化的思想,在配置文件OS_CFG.H文件中,定义了一些配置宏定义,可以根据项目的需要进行使能或者去使能。当系统初始化后,我们直接调用OSStart接口,启动ucos系统。调用接口后,调度器将会开始工作,从就绪队列中寻找到优先级最高的那个任务开始执行。

以上内容,仅仅是个人的经验总结,如有疏漏和错误地方,还请各位知友批评指正共同进步。另外如果想对嵌入式操作系统有深入和权威的了解,还可以自行阅读以下书籍。本文章系列仅仅站在答主个人的理解角度,力求用通俗的语言向嵌入式爱好者们普及嵌入式的一些理论和实战知识。

你可能感兴趣的:(嵌入式,ucos,操作系统)