新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于OSEK/VDX标准的Trampoline操作系统研究

基于OSEK/VDX标准的Trampoline操作系统研究

作者:时间:2009-05-08来源:网络收藏

完全支持要求,实现了统一的API接口,支持静态配置,支持4个符合类,支持 PCP协议。另外,的设计还考虑到两个方面――高可移植性和减少内存使用量。
为了达到高可移植性,设计了一个硬件抽象层来隔离底层的硬件差异,把平台有关的代码与平台无关的代码进行隔离。把Trampoline从一个目标平台移植到另一个目标平台,仅需要把与目标平台有关的那部分代码改写一下就可以了,硬件抽象层之上的那部分不用修改,这大大减少了移植的工作量。在Trampoline代码的组织中,不同目标平台代码放在不同的文件中,分离得很清楚。与目标平台有关的代码,仅仅是任务上下文切换、初始化及一些与硬件相关的函数(中断使能、睡眠模式等)代码。这部分代码量减到了最少。由于车载嵌入式系统中的微控制器RAM容量很小,一般从几百字节到几K字节,而增加RAM容量会增加产品的成本,在产品批量生产时往往会难以接受。Trampo―line在设计时尽量减少内存的使用,并优化了任务管理和中断管理的数据结构,把一部分不变的内容放到ROM中,以减少RAM的使用要求。
下面着重分析Trampoline最核心的调度机制、任务管理、中断管理的设计与实现。
2.1 调度机制
Trampoline使用静态优先级调度算法。在系统生成阶段,用户为每一个任务分配一个优先级。在不同的符合类下,优先级与任务的对应关系不同。在BCCl和ECCl符合类下,一个优先级仅对应一个任务,不同的任务有不同的优先级,任务之间不能共享优先级;而在BCC2和ECC2符合类下,一个优先级可以对应多个任务,不同的任务可以共享同一个优先级。任务有4种状态:就绪状态、等待状态、挂起状态(仅ECCl和ECC2符合类下有)及运行状态。
由于使用处于等待或者挂起状态的任务时直接给出了该任务结构,因此Trampoline没有使用数据结构来管理等待状态和挂起状态的任务;而对于就绪状态的任务,在不同的符合类下,Trampoline采用了两种不同的数据结构来管理。由于在BCCl和ECCl符合类下不同的任务有不同的优先级,Trampoline使用一个简单的链表,按照任务的优先级由高到低把就绪态任务描述符给连接起来;而在BCC2和ECC2符合类下,几个任务可以共享一个优先级,Trampoline使用了一个任务子集链表数据结构来组织就绪任务。共享一个优先级的任务组成了一个任务子集,它们也组成了一个链表。然后把不同子集的链表表头按优先级由高到低链接起来,组成了所有就绪任务的链表,如图l所示。由于按照优先级由高到低的顺序来组织任务子集链表,因此最高优先级的任务总是在链表头部,这样会使调度器能快速选取到最高优先级的任务,但也会导致低优先级任务选取得很慢。

本文引用地址:http://www.eepw.com.cn/article/152492.htm

Trampoline使用一个tpl_running_task指针指向当前正在运行的任务。调度器管理着就绪任务的集合,当重新调度发生时,从就绪任务集合中选取一个最高优先级的任务来执行,并把它从就绪任务集合里删除。然后,tpl_running_task指针指向该任务,并把任务的状态由就绪态改为运行态。该任务将一直处在运行状态,直到运行结束或一个系统服务阻塞了它的执行,或被一个更高优先级任务抢占。另外,一个任务可以是不可抢占的。在这种情况下,它将一直占有CPU,直到运行结束(即使有一个更高优先级就绪任务在等待)。Trampoline也支持使用任务组的结构来实现混合调度。在这种调度模式下,把所有就绪任务分成不同的任务组,同一个任务组里的任务之间是不可抢占的,但它可以被这个组外的更高优先级任务抢占。
2.2 任务管理
Trampoline使用任务描述符结构(struct tpl_task)来管理任务的信息,其中包括系统运行时不断变化的信息,如任务状态、任务优先级、任务的激活次数、任务的资源、
任务的事件等;还包括系统运行时不变的信息,如任务的上下文、任务的堆栈、任务代码段入口地址、任务ID、任务基础优先级、最大激活次数和类型等信息。为了减少内存的使用,Trampoline任务描述符结构被分成图2所示的两个部分:第一部分是系统运行时不断变化的数据,保存在tpl_exec_common结构里,它必须常驻RAM中;另一部分是在系统运行时不变的部分,保存在tpl_exec_static结构里。在tpl_exec_common结构里设置了一个指针static_desc,指向任务的tpl_exec_static结构。由于tpl_exec_static里存放的信息在系统运行时是不变的,因此可以把这部分放到ROM里,以节省RAM的使用。在tpl_exec_static结构里有两部分是体系结构相关的,即上下文结构context和堆栈结构stack,它们使用指向一个或多个RAM区域的指针来保存任务执行的上下文和堆栈信息。这种设计使得不同的任务之间可以通过共享指向上下文或堆栈结构的指针就能共享上下文和堆栈,从而可以减少任务上下文和堆栈所占用的存储空间。另外,Trampoline上下文结构的设计可以使用尽可能少的RAM。例如,如果目标平台处理器没有FPU(浮点处理器),Trampoline上下文结构有两个指针,第一个指向整数上下文的RAM区域,第二个指向浮点上下文RAM区域,这些RAM区域都是用来保存任务运行时要使用的整数寄存器或浮点寄存器的。然而,并不是每个任务都需要使用浮点寄存器,如果任务没有使用FPU,第二个指针将会设为空,以避免分配浮点寄存器所占用的RAM空间。任务上下文和堆栈结构都属于与体系结构有关的代码,内核不直接同这部分打交道,而是通过硬件抽象层来使用它们。这样,使得与体系结构相关的代码与无关的代码隔离起来,从而便于把它移植到其他平台。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭