REX操作系统指南

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Real-TimeExecutive(REX)使用手册第一章序言1.1目的本文描述了基于ARM平台的Real-TimeExecutive(REX)操作系统特性及使用方法。REX是专为小型嵌入式系统设计的简单高效的抢占式多任务实时操作系统(RTOS)。该系统最初是为Intel80186处理器设计的,随后被移植到ARM处理器。本文提供了REX的指南,第7章为编程参考。1.2适用范围本手册适用于需要在REX系统上编写应用程序的读者。1.3内容组织本文按以下结构编写:第2章REX概述第3-6章REX的详细叙述及内部工作机制第7章编程指南1.4字形习惯函数声明,函数名,类型声明,示例代码使用特殊的字体,例如:#include程序变量用尖括号包围,例如number1.5版本历史版本日期说明1999年1月初始版本Rev.A1999年3月内容更新Rev.B2001年6月删除了与80186有关的部分,更新了REX的API,更新了中断处理的章节Rev.C2001年9月删除了成型信息1.6参考资料1REXPortationGuide80-24880-1X11999年3月2REX++REXExtensionsUsersGuide80-V3083-1X12001年4月1.7技术支持如需要求了解本文未详细说明的信息可通过高通的CDMA技术支持邮箱联系:asicapps@qualcomm.com。1.8术语及习惯用语本文使用以下术语及习惯用语APCSARM调用规范。为了支持不同厂家编译系统及汇编语言混合编程,ARM规定了程序调用的入口、出口处理及寄存器的使用规范。API应用程序接口。ARMAdvancedRISCMachinesLimited,ARM系列处理器制造商,通常也指ARM系列微处理器。ARM7TDMIARM7系列处理器中的一款。CPSR当前程序状态寄存器,该寄存器保存了旗语,中断控制位和处理器当前操作模式。criticalsection临界区,代码中访问共享资源的部分。FIQ快速中断,由ARM支持的中断之一,FIQ中断服务程序正在进行时也可用来标志处理器工作模式。IRQ普通中断,由ARM支持的中断之一,IRQ中断服务程序正在进行时也可用来标志处理器工作模式。ISR中断服务程序,也称为interrupttrampolinefunction。IdleTask操作系统中的优先级最低的任务,空闲任务的优先级为0,为一个空等待循环,只能由中断抢夺其CPU控制权。PC程序当前指令寄存器PSR程序状态寄存器REX高通的实时操作系统RTOS实时操作系统SPSR受保护的程序状态寄存器,每一个处理器模式提供一个SPSR用以保存处理器切换到其它模式前的CPSR。TCB任务控制块,REX内部的数据结构,用于存放任务的信息。timerblock定时器的别名。trampolinefunctionREX之外的中断服务函数,同ISR。第二章REX概述REX是一个抢先的多任务实时操作系统,为任务的控制,同步,互斥,定时和中断控制提供了相应的API,所有的函数在调用它们的任务提供的设备环境下运行。2.1任务REX将每个任务视为独立的实体句柄,有独享的堆栈和优先级并共同组成任务的设备环境,每个任务有一组数据组成的结构,称为任务控制块(TCB),REX通过任务控制块记录任务运行的设备环境。REX运行期间允许在任何时候动态创建任意数量的任务,尽管更多的任务造成了遍历任务链表的时间延长,但新增任务对REX性能造成的损失是微乎其微的。不过仍要注意尽量使任务的数量保持最小。REX所能负担的任务最终取决于处理器种类,时钟速率以及特定应用下的中断响应指标。2.2堆栈前一节提到过每个任务有独立的堆栈空间,任务处于运行状态时,该堆栈被激活,当任务挂起时,任务的设备环境被保存于堆栈顶部,堆栈指针则存放于该任务的TCB中。任务可能由于阻塞,等待信号量,等待中断服务而挂起。如果任务被重新激活到运行状态,调度程序从TCB中恢复堆栈指针,任务的设备环境就可从堆栈中弹出,任务即可恢复运行。任务调度处理对于任务来讲是透明的。2.3优先级和调度每一个任务都有一个优先级,优先级存放于任务的TCB中,优先级可以是任何的非零的32位数,数值越小则优先级越低,REX占用了优先级0用于空闲任务,旧版本的REX要求每个任务独占优先级,新的版本已经没有这个限制了。REX的调度策略为放行优先级最高的就绪态任务,即激活不等待任何事件的最高优先级任务。如果满足条件的同优先级任务不只一个,则REX会任选其中的一个任务。被激活的任务会一直运行到主动挂起或中断程序使另一个更高优先级的任务恢复运行。一个任务等待的事件到达后,该任务进入就绪态,如果所有的任务都处于挂起状态,则空闲任务被激活。REX支持任务动态修改优先级,一个任务可以提升或降低自己或其他任务的优先级。2.4中断REX为抢占式内核,当中断返回时,控制会交给优先级最高的就绪任务而不是被中断的任务。2.5互斥当两个任务需要共享一个资源时,需要有一个访问互斥机制,访问共享资源部分的代码成为临界区。通过关中断可以简单的实现临界区,REX还提供一种不太彻底的方式,导出函数可用于锁定或释放公共资源。2.6禁用中断后的挂起只有正在运行的任务可以禁止中断,一旦某个任务禁止中断后挂起,中断状态则一直由该任务保存,任务重新激活后可以恢复中断状态。有一种潜在的危险是中断被下一个激活的任务允许,这一特性在以后的版本中可能被修改,但是程序员不能依赖这一点。2.7信号量通用信号量集与每一个任务关联,这些信号量集作为相关任务的设备环境保存在任务的TCB里,用来表示与任务有关的某类事件发生了。一个任务的信号量可以被所有任务及中断服务程序设置或清除。关于信号量需要注意的重点:信号量是通用旗语,用户可以任意定义信号量的含义。一个任务可以通过其他任务或中断任意设置一个特定的信号量挂起,需要强调的是任意,如果一个任务并没有因该信号量挂起,则设置的信号量不会对该任务的运行状态产生影响。2.8定时器定时器用来确定某个时间间隔,任务通过定时器来实现一段延时,延时时间到了以后会有一个信号量时标,任务可以查询该时标,或者任务可以挂起自己等待该信号量时标。定时器可以和其他事件联合使用,这样就可以确定事件是否超时。REX通过维护定时器链表的方式管理所有正在计时的定时器。对定时器的数量没有限制,定时器越多则每次遍历链表耗时越长,但是新增一个定时器对性能的影响是微弱的。已经到期的计数器不会产生管理开销。2.9扩展接口REX提供了一些扩展接口以增强可操作性,例如异步进程调用,延迟进程调用,内存管理。详情参考REX++—REX扩展用户使用手册(80-V3083-1)。第三章任务本章详细描述了REX的调度及设备环境调度机制。3.1任务的创建创建新任务使用REX提供的函数rex_def_task()。REX并不为任务堆栈和TCB分配空间。这一工作由调用创建任务函数的程序负责。不过REX要求避免用户直接操作TCB的数据结构。任务创建函数rex_def_task()完成以下工作:1.将设备环境数据入栈2.设置TCB3.将要创建的任务加入任务列表4.调度处理如果新建任务优先级高于当前任务,则新任务取得控制权,否则,调度直接返回而不发生任务切换。新建的任务直到成为优先级最高的就绪任务时开始执行。任务的入口由rex_def_task()指定为rex_task_preamble(),任务在第一次获得控制权时初始化堆栈。任务永远不会返回,因此rex_task_preamble()在调用了任务函数之后,会调用rex_kill_task(),这样的话一旦任务异常返回,则该任务会被REX终止。3.1.1调度任务的调度由函数实现,调度函数为REX保留的内部函数,不能被应用程序直接调用。调用该函数时必须禁止中断,调用函数rex_sched()之前必须先设置全局变量rex_best_task并将该变量指向优先级最高的就绪任务的TCB。调度算法的基本规则为:1.调度器检查rex_best_task是否指向当前正运行的任务rex_curr_task。2.如果rex_best_task与rex_curr_task相同,则调度器直接返回。3.如果rex_best_task与rex_curr_task不同,将rex_best_task的值赋给rex_curr_task,然后调度器检查是否在中断服务程序,如果在中断服务程序,则调度器返回。4.如果系统未在中断服务,则调度器开始执行设备环境切换,将当前的设备环境入栈,栈顶指针存入当前运行任务的TCB,并从rex_curr_task指向的任务的TCB中恢复堆栈指针,再从堆栈中恢复设备环境。3.1.2ARM平台上任务的特殊性ARM是一款32位微处理器,具有线性地址空间,因此堆栈指针仅占用TCB的一个字段:sp。设备环境数据结构设备环境包括r0-r12,lr,pc,CPSR寄存器,图3-1表示了一个挂起任务的堆栈状态。程序状态寄存器CPSRr0-r12连接寄存器lr返回地址应用程序堆栈数据栈顶(保存于TCB中)图3-1ARM系统中休眠态的任务堆栈示例由于rex_sched()运行时中断被禁止,在ARM处理器上,设备环境的保存与恢复必须由rex_sched()自己处理。程序状态寄存器保存的是函数入口时的CPSR值,因此设备环境保存了中断状态。保存设备环境需进行如下操作:1.从rex_curr_task指向的任务TCB中取出堆栈指针。2.将已保存的PSR值考入SPSR寄存器。3.带^后缀调用ldmfd指令装载r0-r12,lr,pc切换到Thumb模式返回到任务注:为保证同时恢复PC和CPSR,调用ldmfd指令一定要记得使用^后缀。第四章中断处理本章叙述了REX在进入中断和退出中断时所进行的操作。ARM有两级中断,FIQ和IRQ,本章只讨论IRQ,因为FIQ中断处理期间不需要进行设备环境切换,所以FIQ非常简单。当产生中断时,采用ARM汇编语言实现的函数IRQ_Handler()取得控制权,根据异常事件中断向量表调用相应的中断服务处理。rex_set_interrupt_vector()用来加载中断向量(该函数的详细说明见第八章7.19节)。产生中断时,ARM处理器切换到IRQ模式,使用IRQ寄存器区,将控制权交给IRQ_Handler(),由其进行以下操作:1.中断服务程序要使用的寄存器入栈,如果函数是由C语言编写,则受保护的寄存器包括:r0-r3,r10,r12,r14,如果中断嵌套,还要保护SPSR。2.中断嵌套计数加一。3.切换回系统模式,并保存系统模式的lr寄存器,因为该寄存器在后面的处理中要使用。4.调用中断向量表注册了的中断服务处理程序。5.中断服务处理完毕返回后,恢复lr寄存器,工作模式切换回IRQ模式。6.中断嵌套计数减一。7.如果嵌套计数减为0,并且rex_best_task不等于rex_curr_task时,需要进行任务切换。8.如需要任务切换,作如下处理:a.从IRQ的堆栈恢复SPSR及其它保护的寄存器。b.切换到超级用户模式。c.在当前任务的堆栈中保存其设备环境d.将超级用户模式的堆栈指针保存至任务的TCB中。e.rex_best_task的值赋给rex_curr_task。f.恢复rex_curr_task的设备环境。9.如果不需要任务切换,则从IRQ堆栈中恢复SPSR及其它受保护的寄存器,切换回超级用户模式。注:某些版本的IRQ_Handler不切换回系统模式处理中断,他们不支持中断嵌套,因此也不管理中断嵌套。这种机制通过中断时的任务切换实现了强占式多任务,在中断到来时,既是当前任务正在运行,也会切换到更高优先级的就绪任务。第五章信号量和定时器REX使用信号量和定时器来实现任务间的同步机制及内部定时。5.1信号量REX为任务间通讯提供了信号量机制,信号量集与每个任务都关联,这样任何一个任务都可以通过rex_get_sigs(),rex_set_sigs()和rex_clr_sig

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功