基于PowerPC处理器结构的分级任务切换方法

文档序号:6379107阅读:253来源:国知局
专利名称:基于PowerPC处理器结构的分级任务切换方法
技术领域
基于PowerPC处理器结构的分级任务切换方法属于嵌入式实时操作系统技术领域,尤其涉及基于PowerPC处理器结构的嵌入式实时操作系统技术领域。
背景技术
任务切换机制是多任务实时操作系统的核心。其中,堆栈操作是任务切换的主要操作。堆栈操作的合理性,直接关系到操作系统的稳定性和运行效率。任务切换机制的主要任务是保存和恢复必要的程序运行现场,使得程序可以在执行过程中被打断而不产生错误结果。一方面,实时操作系统要求任务切换过程具有较高的速度;另一方面,嵌入式系统要求任务切换过程尽量节省资源。采用占先式调度的操作系统,中断处理过程和任务切换过程紧密联系,任务切换所需的堆栈操作更为复杂。好的任务切换方法必须在保证系统可靠性的前提下,实现时间开销和空间开销的平衡。
目前,现存的嵌入式实时操作系统种类繁多,各具特色。比较著名的嵌入式实时操作系统包括VxWorks、pSOS、QNX、WinCE、μC/OS-II和各种嵌入式实时Linux等等。为了保证通用性,上述各种嵌入式实时操作系统的任务切换机制均采用与处理器无关的实现框架,针对不同类型的处理器只进行细微的代码改动,这种方式有利于减少代码移植的工作量。但是,目前各种处理器在堆栈操作、寻址操作等方面的指令系统特征差别很大,如果针对特定的处理器结构设计任务切换机制,将更有利于充分利用特定处理器的功能,提高在该处理器平台上的运行效率。
在现有的任务切换机制中,保存和恢复程序运行现场(在多任务操作系统中即为用户任务上下文,Context)是一次完成的,这个过程存在一些多余的操作,也就是说,程序运行现场的一部分状态实际上并没有被改变,不需要保存。一些操作系统根据不同情况,保存用户任务上下文的某一个或多个部分,以减少多余操作。但这种做法限制了后续程序的操作内容,降低了系统的灵活性。
程序运行现场在内存中的保存位置有两种不同选择在用户堆栈中或在系统堆栈中。现有实时操作系统的任务切换机制只采用两种堆栈中的一种。在存在中断嵌套的系统中,只用用户堆栈使得每个用户任务都必须预留较大的堆栈空间;而只用系统堆栈则使得在发生任务调度时要进行额外的堆栈调整,降低了速度。

发明内容
针对现有实时操作系统的任务切换机制与处理器特性结合不够紧密、切换过程中存在多余操作、堆栈使用不够经济的问题,本发明基于PowerPC结构指令体系堆栈操作指令可以批量分配堆栈空间的特殊功能,提出了分级任务切换方法,主要包括下列内容1、分级入栈技术将用户任务上下文划分为基本、扩展和可选部分。在中断处理中,根据系统配置和任务调度性质的不同,采用只有基本部分入栈、基本部分和扩展部分入栈和全部上下文入栈三种方式。中断处理过程首先执行第一级入栈操作,保存上下文的基本部分,执行中断处理程序后,判断任务调度要求,选择执行下一级入栈操作并激活调度器,或者恢复现场返回用户任务。
2、用户堆栈和系统堆栈间切换机制在中断预处理中进行堆栈切换,使用户堆栈只保留用户任务上下文,系统堆栈保留中断服务程序上下文,降低用户堆栈的负荷。
3、提供了系统配置接口,可供用户进行系统级和任务级两种级别的配置。
4、提供了对用户中断服务程序的封装。用户可以自行编写中断服务程序,经过封装自动生成实现上述机制的系统。
本发明的特征在于它除了实现由用户任务来执行激活新任务或申请调度的操作外,主要针对以操作系统代码的形式来执行由中断程序激活任务而产生任务切换的情况;所述的操作系统代码含有以下部分系统启动代码放在MPC555微控制器地址0x100处,在系统上电复位时自动执行,依次含有硬件初始化、初始化堆栈、初始化就绪任务列表以及开始调度的操作。系统内核操作代码包括供系统启动代码、用户任务代码、或中断处理程序调用的激活任务、终止任务和按照规定策略从就绪任务列表中选取一个用户任务再跳转到该任务执行的这样一种调度器操作;系统内核操作代码支持抢占式调度,即当用户任务代码或者中断处理程序调用系统内核操作激活一个高优先级的用户任务的时候,激活任务操作可以调用调度器选择新激活的任务,强制打断正在运行的优先级较低的用户任务,而转到激活的任务去执行。
用户任务代码任务由用户自定义。该用户任务可以调用系统内核操作,激活其他任务、申请调度或者终止自身的执行。
就绪任务列表记录当前可以执行的用户任务信息,包括任务优先级、用户程序入口地址和用户堆栈指针这三个数值。
中断处理程序操作代码它依次含有中断处理程序入口、用户中断服务程序和中断处理程序结束三个部分。其中,外部中断处理程序放在MPC555微控制器的入口地址0x500处,计数器中断处理程序放在入口地址0x900处,该中断处理的优先级高于用户任务优先级,由用户中断服务程序激活了的新任务,只能等中断处理程序结束后再通过调度器来执行。
所述的中断处理程序,其框架依次包含保存现场、堆栈切换、调用用户服务程序、中断恢复处理四个步骤,现分述如下(1)保存现场在批量预留堆栈空间的条件下,分级入栈式的保存被打断任务的执行现场,即MPC555中CPU的各种寄存器的值。PowerPC处理器结构下的寄存器遵循统一的PowerPC-EABI(基于PowerPC结构的嵌入式系统代码接口)规范。
首先,把用户任务上下文即寄存器按内容划分为以下三个部分基本部分包括链接寄存器(LR)、机器状态寄存器(MSR)、保存中断结束后返回地址的机器状态保存/恢复寄存器(SRR0)、保存中断发生时MSR状态的机器状态保存/恢复寄存器(SRR1)、条件寄存器(CR)、整数异常寄存器(XER)、计数寄存器(CTR)及通用寄存器r0、r3~r12;在调用高级语言函数时应当保存。
扩展部分包括通用寄存器r14~r31,只在任务调度时需要保存。
可选部分浮点寄存器f0~f31和浮点状态寄存器FPSCR,只用于浮点计算情况下。
其次,在执行任务过程中产生中断时,或者在执行另一个中断处理程序过程中产生中断即中断嵌套时,在根据PowerPC处理器指令体系所定义的堆栈操作指令批量预留了保存完整上下文即全部寄存器内容的条件下,只先执行第一级入栈操作即只先执行保留基本部分的操作;在中断处理程序结束后若要进行任务调度时,再进行第二级入栈操作保存扩展部分或第二级和第三级保存可选部分的入栈操作,激活调度器,否则恢复现场返回用户任务。
(2)堆栈切换使用户堆栈只保留用户任务上下文,系统堆栈保留中断服务程序上下文,根据中断层数或中断处理结束后任务调度的情况使堆栈指针在用户堆栈和系统堆栈之间进行堆栈切换。
(3)调用用户中断服务程序中断处理程序通过一个包括中断索引地址和对应的用户中断服务程序入口地址两项的中断查找表跳转到用户编写的中断服务程序;再通过系统定义的一个全局性的调度标志来通知中断处理程序是否需要进行任务切换,该调度标准设在系统内核操作代码中,在第一层中断处理程序进行堆栈切换的同时置为0,当用户中断服务程序要激活新任务时,把调度标志置为1,通知中断服务程序需要进行任务切换,它根据系统配置情况进行第二级或第二、第三级入栈操作,把相应寄存器的值写入第一级入栈操作时预留的用户堆栈空间里。
(4)中断恢复处理若用户中断服务程序完成后,判断不需要进行任务切换,则中断处理程序直接执行恢复现场操作,返回被中断的用户任务。
经过在MPC555平台上初步测试,用本发明所述的方法从产生中断到进入用户中断处理程序所需时间比采用通用方法要少,提高了任务切换的效率。


图1.清华OSEK操作系统内核部分组成2.由中断产生任务切换的流程示意3.MPC555微控制器结构4.MPC555的CPU结构框5.MPC555寄存器分类示意6.分级任务切换方法的实现程序框7.第一级入栈过程示意8.第二、第三级入栈过程示意9.中断处理程序框架流程图具体实施方式
本发明提出的方法是嵌入式实时操作系统内核的一部分,以操作系统代码的形式实现。下面以清华大学自主开发的清华OSEK(汽车电子开放式系统及其相应接口)操作系统、基于MPC555微控制器的硬件平台环境为例,说明分级任务切换方法的具体实施方式

MPC555微控制器中,规定了多个程序入口地址。系统启动代码放在入口地址0x100处,外部中断处理程序放在入口地址0x500处、计数器中断处理程序放在入口地址0x900处。当系统上电复位时,从0x100地址处开始执行启动代码。
运行于MPC555平台上的清华OSEK操作系统包括五部分启动代码、系统内核操作、用户任务代码、就绪任务列表和中断处理程序。如附图1所示。
启动代码在系统上电复位时自动执行。第一步先进行硬件初始化操作,即暂时禁止硬件中断、设置系统时钟频率以及关闭软件看门狗。这些操作的细节见表2说明。第二步操作是将堆栈指针寄存器和数据段基地址寄存器(在后面有详细介绍)分别设置为系统堆栈和数据段的地址(具体数值由用户指定)。第三步操作是将可以开始执行的任务添加到就绪任务列表中。最后,启动代码打开硬件中断开关允许硬件中断,再执行系统内核操作中的调度操作,开始执行用户任务。
系统内核操作包括激活任务、终止任务和调度器三个操作。激活任务操作将一个用户任务添加到就绪任务列表,终止任务操作将任务从就绪任务列表中删除。调度器是任务切换机制的核心,按照一定的策略从就绪任务列表中选取一个用户任务,跳转到该任务开始执行。
用户任务代码是用户编写的一段程序,完成一定的功能,任务何时可以开始执行、何时结束、进行什么操作均由用户自行定义,不属于操作系统设计的内容。用户任务可以调用系统内核操作,激活其他任务、申请调度或者终止自身的执行。
就绪任务列表记录当前可以执行的用户任务信息,包括任务优先级、用户程序入口地址、用户堆栈指针。这三个数值最初均由用户自行定义。在系统运行过程中,用户代码或者操作系统代码都可以修改用户堆栈指针的值,从而达到在堆栈中保存或者恢复数据的目的。如果一个任务放在就绪任务列表中,称这些任务处于就绪态。
中断处理程序是操作系统中相对独立的一部分,这部分代码放在中断处理程序入口地址处。中断处理程序通常只在启动代码执行完毕、进入用户任务之后才被允许执行,它由系统中的硬件事件触发,何时执行由运行时的软硬件状态决定,在设计中无法预计。中断处理程序可以调用系统内核操作,激活新任务,从而打乱用户任务执行的流程。
清华OSEK作为符合OSEK规范的操作系统,具有如下特征1、每个任务用一个优先级数值表示其重要程度。调度器选择处于就绪任务列表中的最高优先级的任务执行。
2、支持抢占式调度,即一个优先级高的用户任务可以强制打断一个优先级低的用户任务的执行。
3、中断处理程序优先级高于用户任务优先级。在中断处理程序中如果激活了新任务,不能立刻进行任务调度,而应该等中断处理程序结束后才进行。所以,抢占式调度只发生在第一层中断程序结束处。
在符合OSEK规范的操作系统中,发生任务调度有两种可能情况。一种是用户任务执行了可能激活新任务的操作,另一种是用户任务执行被中断,中断处理程序激活新任务。在本发明实现的系统中,对第一种情况的处理和目前其他操作系统的处理基本一致,主要针对第二种情况进行改进。
由中断处理程序激活任务而产生任务切换的情况见附图2所示。用户中断服务程序调用系统内核操作,激活希望执行的任务,将其添加到用户任务列表。中断处理程序在结束的时候,调用调度器,如果新激活的任务优先级比正在执行的当前任务优先级高,就将原来处于执行状态的当前任务切换为就绪态,然后将新激活的任务作为当前运行任务,跳转到该任务的代码,开始执行。
MPC555微控制器的结构见附图3所示。它主要包括精简指令CPU、内部存储器、外部设备和总线接口。其中,和本发明相关的主要是前两部分。内部存储器是操作系统代码和数据的存放空间,精简指令CPU是代码的运行环境。精简指令CPU的结构如附图4所示。它包括一系列寄存器和处理单元。本发明所涉及的硬件部分主要是CPU中的寄存器,如图4中浅色框标出的部分。寄存器保留了程序运行过程的所有瞬时信息。MPC555的寄存器全集见附图5,其中,用户程序运行需要用到的寄存器如表1所示。
表1 PowerPC结构处理器主要寄存器列表


按照PowerPC-EABI规范,通用寄存器r1在操作系统中作为系统堆栈的指针,又称为堆栈寄存器(简称SP)。
在PowerPC硬件体系结构中,中断处理程序代码根据其类型的不同,放在内存的不同起始地址处。当硬件产生中断信号以后,CPU响应中断,自动切换到相应的入口地址执行指令。
在清华OSEK操作系统中,本发明提出的方法被作为操作系统核心代码的一部分实现并封装起来,在系统生成的时候放置在MPC555处理器规定的外部中断入口地址0x500、计数器中断入口地址0x900处(还可以视用户要求增加入口地址),成为中断处理程序框架。这一框架包括保存现场、堆栈切换、调用用户处理程序、中断恢复处理四个步骤。附图6为本发明所述方法具体实施的程序框图。
假设系统原来在运行某一任务,当中断产生时,如附图6中标有“中断响应”的箭头所示,CPU当前指令指针由指向任务程序改为指向中断处理程序入口,开始执行本发明设计的中断处理程序框架。
中断处理程序框架的第一步操作是保存被打断任务的执行现场,也就是CPU的各种寄存器的值。PowerPC处理器结构下的寄存器遵循统一的规范(PowerPC-EABI规范),有严格的用途划分,在堆栈中的位置也有严格要求。
在PowerPC处理器结构中,LR保存函数调用时的返回地址,MSR保存程序运行过程的处理器配置状态,SRR0保存中断结束后的返回地址,SRR1保存中断发生时的MSR状态,CR、XER保存整数运算、逻辑运算和浮点运算指令设置的标志位,CTR用于程序循环计数。这些寄存器是程序运行过程必不可少的。因此,一段程序如果被打断后恢复执行,必须恢复这些寄存器原来的状态,才能使程序运行正常。
根据PowerPC-EABI规范,通用寄存器r0~r31中,r1为堆栈指针,r2、r13为系统小数据段的基地址,这几个寄存器的内容不会被用户任务破坏。r0、r3~r12用于函数调用时传入和返回参数,不论用户任务或者中断处理程序,都可能修改这些寄存器的值。所以在任务切换过程中和中断处理中都必须保留这些寄存器的值。
r14~r31用于保存临时变量,如果一段程序需要用到这些寄存器,应该先保存它的数值,在这段程序退出的时候恢复。如果用户任务执行过程发生中断,中断处理程序而不激活新任务,那么中断处理程序结束的时候会恢复这些寄存器中改动的部分,返回用户程序的时候就像没有修改过一样,所以,一般的中断处理过程中不需要保存这些寄存器。而如果中断处理程序激活了新任务,则新任务可能修改这些寄存器,并且无法预计什么时候会切换回原来的用户任务,这个时候,就必须在中断处理程序中把这些寄存器保存下来。
浮点寄存器用于浮点计算,只有当用户程序进行浮点运算时才会改动。一般而言,操作系统核心代码以及绝大部分中断处理程序都不需要使用浮点寄存器。浮点状态寄存器保存浮点运算时设置的标志,随浮点寄存器一起被改动。
依据以上规定,可将寄存器、也就是程序上下文划分为三个部分1.基本部分包括寄存器LR、MSR、SRR0、SRR1、CR、XER、CTR及通用寄存器r0、r3~r12。这些寄存器在调用高级语言函数时内容可能被破坏,需要保存。
2.扩展部分通用寄存器r14~r31,这些寄存器只在任务调度时需要保存。
3.可选部分浮点寄存器f0~f31和浮点状态寄存器FPSCR,只对使用浮点计算的用户任务有意义。
在符合OSEK规范的操作系统中,如果中断是在执行任务时产生的,那么视中断处理的结果,有可能只需要保存第1部分也有可能需要保存第1、2部分或者全部三部分,这是无法预测的。如果中断是在执行另一个中断处理程序时产生的,则只需要保留第1部分。
本发明采用折中办法,即留出保留全部内容的空间,但只先执行保留第1部分的操作。这样,既能兼顾各种可能的处理结果,又减少了不必要的操作,而且不违反PowerPC-EABI规范对寄存器存放位置的规定。
为方便叙述,设保存上下文第1部分所需的内存空间字节数为S1,保存1、2部分所需内存空间为S2,保存全部内容所需空间为S3。在MPC555处理器中,S1=80,S2=152,S3=416。
PowerPC处理器指令体系所定义的堆栈操作指令与i386等处理器体系定义的逐字push/pop(即只在堆栈指针的顶部进行数据存取,指针每次只能上移或下移一个数据单元)不同,采用预留堆栈空间和偏移地址访问(指针可以一次移动多个数据单元的位置,可以对堆栈内部进行数据存取操作)。本发明利用这一特性,批量预留了堆栈空间。程序首先执行stwu指令,将堆栈指针上移,留出S2或S3的空间(视系统配置的结果,详叙见后),但是只将基本部分的值保存到堆栈中,占S1空间。如附图7所示。
由于第一级入栈操作时预留了保存完整上下文的空间,这样,后面如果进行第二级入栈操作将不需要重新分配空间和作额外的调整,提高了处理效率。
保存现场之后,中断处理程序框架进行堆栈切换。首先,将用来记录中断层数的变量加一,如果是第一层中断,则将堆栈指针由指向被打断任务的用户堆栈区改为指向系统堆栈区。这样,当发生中断嵌套时,中断处理程序的程序现场在系统堆栈中保存,而用户任务的程序现场是在堆栈切换前保存的,在用户堆栈区。这样,既降低了用户堆栈的负荷,又便于进行任务调度。如果是嵌套中断,由于第一层中断处理程序已经进行了切换,堆栈指针已经指向系统堆栈区,无须再进行切换。
随后,中断处理程序框架通过查询中断查找表,跳转到用户编写的中断服务程序。中断查找表包括中断索引地址和对应的用户中断服务程序入口地址两项。中断索引地址是MPC555处理器定义的一个序数表,用不同的中断请求号表示不同的引起中断的硬件。发生中断的时候,MPC555的SIVEC寄存器记录了当前应该处理的中断请求号。用户在编写中断服务程序时只需实现自己所要的处理功能,并将函数入口地址填入中断查找表相应中断请求号的表项中。中断处理程序框架通过读取SIVEC,就可以检索中断查找表中对应中断请求号的表项,转到对应的用户中断服务程序地址执行。
操作系统中定义了一个全局标志,称为调度标志。中断处理程序框架在第一层中断处理程序进行堆栈切换的同时,将调度标志置为0,然后再执行用户编写的中断服务程序。用户中断服务程序如果想激活新任务,需要调用系统内核操作才能实现,操作系统会在系统内核操作中将调度标志置为1,以通知中断服务程序框架需要进行任务切换。
从用户中断服务程序返回本程序后,进入中断恢复处理步骤。这一步骤包括多个判断分支和对应的任务切换操作。
在中断恢复处理步骤中,将记录中断层数的变量减一,判断是否为第一层中断。如果是不是第一层中断,不需要进行堆栈切换,而且按照OSEK规范的要求,不能进行任务调度。于是程序执行恢复现场操作将从堆栈中读出上下文基本部分的寄存器值,逐一放到CPU对应的寄存器中,然后执行中断返回指令rfi。这时,CPU的当前指令指针会指回上一层中断处理程序,继续执行上一次层中断。如果是第一层中断,则进行堆栈切换,使堆栈指针指回用户任务区。
随后,中断处理程序框架判断调度标志是否为1,如果是,则需要进行任务切换,应进行第二级入栈操作,将扩展部分和可选部分的寄存器填入堆栈中已经预留好的空间。如果系统配置选择该任务使用可选部分的寄存器,则CPU中扩展部分和可选部分寄存器的值都应写入第一级入栈操作时预留的堆栈空间里。如果系统配置选择该任务不使用可选部分,则只将扩展部分寄存器写入。如附图8所示。
清华OSEK操作系统按照OSEK实现语言规范(OSEK-OIL),提供了系统配置接口,通过该接口用户可以进行系统级和任务级两种级别的配置,即指定所有用户任务或者个别用户任务使用或不使用可选部分的寄存器。
经过上述操作以后,用户堆栈中保存的上下文结构与从一个任务切换到另一个任务时的上下文结构完全一样,所有任务都可以通过调度器被挂起或执行。中断处理程序执行最后一步操作,调用调度器,选择应该执行的用户任务,从堆栈中恢复寄存器的值到CPU中,切换到该用户任务执行。
如果中断处理完成后,判断不需要进行任务切换,则中断处理程序直接执行恢复现场操作,返回被中断的用户任务。
MPC555处理器由中断处理程序或者调度器切换到上一层中断处理程序或者用户任务的机制如下在用户任务代码或者中断处理程序代码被打断时,保存现场的操作将该段代码恢复执行时的返回地址存入堆栈中,当前面所述过程中执行恢复现场操作时,又将返回地址写入SRR0寄存器,然后调度器或者中断处理程序执行中断返回指令rji,CPU就将当前指令指针指向SRR0所指的地址,从而实现了切换到用户任务代码或者上一层中断处理程序代码的功能。
上述整个中断处理程序框架的详细流程图见附图9。
本发明的方法,在清华OSEK操作系统中进行了应用,作为中断处理程序的核心,在系统中成功嵌入了时钟中断、CAN总线中断和串口中断。经过在MPC555平台上初步测试,采用上述方法,从产生中断到进入用户中断处理程序只需要13微秒;而如果采用通用的方法,需要23~33微秒。由此可见,本发明所述的方法提高了任务切换的效率。本发明实施方式中涉及的主要MPC555硬件操作如表2所示。
本发明所述方法适用于所有PowerPC处理器结构的微控制器。
表2主要MPC555硬件操作列表

权利要求
1.基于PowerPC处理器结构的分级任务切换方法,以操作系统代码的形式实现任务的切换,其特征在于它除了实现由用户任务来执行激活新任务或申请调度的操作外,主要针对以操作系统代码的形式来执行由中断程序激活任务而产生任务切换的情况;所述的操作系统代码含有以下部分系统启动代码放在MPC555微控制器地址0x100处,在系统上电复位时自动执行,依次含有硬件初始化、初始化堆栈、初始化就绪任务列表以及开始调度的操作;系统内核操作代码包括供系统启动代码、用户任务代码、或中断处理程序调用的激活任务、终止任务和按照规定策略从就绪任务列表中选取一个用户任务再跳转到该任务执行的这样一种调度器操作;系统内核操作代码支持抢占式调度,即当用户任务代码或者中断处理程序调用系统内核操作激活一个高优先级的用户任务的时候,激活任务操作可以调用调度器选择新激活的任务,强制打断正在运行的优先级较低的用户任务,而转到激活的任务去执行;用户任务代码任务由用户自定义;该用户任务可以调用系统内核操作,激活其他任务、申请调度或者终止自身的执行;就绪任务列表记录当前可以执行的用户任务信息,包括任务优先级、用户程序入口地址和用户堆栈指针这三个数值;中断处理程序操作代码它依次含有中断处理程序入口、用户中断服务程序和中断处理程序结束三个部分;其中,外部中断处理程序放在MPC555微控制器的入口地址0x500处,计数器中断处理程序放在入口地址0x900处,该中断处理的优先级高于用户任务优先级,由用户中断服务程序激活了的新任务,只能等中断处理程序结束后再通过调度器来执行;所述的中断处理程序,其框架依次包含保存现场、堆栈切换、调用用户服务程序、中断恢复处理四个步骤,现分述如下(1)保存现场在批量预留堆栈空间的条件下,分级入栈式的保存被打断任务的执行现场,即MPC555中CPU的各种寄存器的值;PowerPC处理器结构下的寄存器遵循统一的PowerPC-EABI(基于PowerPC结构的嵌入式系统代码接口)规范;首先,把用户任务上下文即寄存器按内容划分为以下三个部分基本部分包括链接寄存器(LR)、机器状态寄存器(MSR)、保存中断结束后返回地址的机器状态保存/恢复寄存器(SRR0)、保存中断发生时MSR状态的机器状态保存/恢复寄存器(SRR1)、条件寄存器(CR)、整数异常寄存器(XER)、计数寄存器(CTR)及通用寄存器r0、r3~r12;在调用高级语言函数时应当保存;扩展部分包括通用寄存器r14~r31,只在任务调度时需要保存;可选部分浮点寄存器f0~f31和浮点状态寄存器FPSCR,只用于浮点计算情况下;其次,在执行任务过程中产生中断时,或者在执行另一个中断处理程序过程中产生中断即中断嵌套时,在根据PowerPC处理器指令体系所定义的堆栈操作指令批量预留了保存完整上下文即全部寄存器内容的条件下,只先执行第一级入栈操作即只先执行保留基本部分的操作;在中断处理程序结束后若要进行任务调度时,再进行第二级入栈操作保存扩展部分或第二级和第三级保存可选部分的入栈操作,激活调度器,否则恢复现场返回用户任务;(2)堆栈切换使用户堆栈只保留用户任务上下文,系统堆栈保留中断服务程序上下文,根据中断层数或中断处理结束后任务调度的情况使堆栈指针在用户堆栈和系统堆栈之间进行堆栈切换;(3)调用用户中断服务程序中断处理程序通过一个包括中断索引地址和对应的用户中断服务程序入口地址两项的中断查找表跳转到用户编写的中断服务程序;再通过系统定义的一个全局性的调度标志来通知中断处理程序是否需要进行任务切换,该调度标准设在系统内核操作代码中,在第一层中断处理程序进行堆栈切换的同时置为0,当用户中断服务程序要激活新任务时,把调度标志置为1,通知中断服务程序需要进行任务切换,它根据系统配置情况进行第二级或第二、第三级入栈操作,把相应寄存器的值写入第一级入栈操作时预留的用户堆栈空间里;(4)中断恢复处理若用户中断服务程序完成后,判断不需要进行任务切换,则中断处理程序直接执行恢复现场操作,返回被中断的用户任务。
全文摘要
基于PowerPC处理器结构的分级任务切换方法,属于嵌入式实时操作系统领域,其特征在于它针对PowerPC处理器结构的特殊性,把用户任务上下文划分为基本、扩展和可选三部分,在中断处理中,根据系统配置和任务调度情况,采用只有基本部分入栈、基本和扩展部分入栈和全部上下文入栈三种方式;中断处理程序首先执行基本部分入栈,执行中断处理后判断任务调度性质,选择执行下一级入栈操作、调用调度器,或者恢复现场返回用户任务。减少了不必要的堆栈操作。作为清华大学汽车电子开放式系统的一部分,在MPC555平台上实施。测试表明,它提高了任务切换的效率,加快了系统运行速度。
文档编号G06F9/48GK1490722SQ03157389
公开日2004年4月21日 申请日期2003年9月19日 优先权日2003年9月19日
发明者孙晓民, 蔡云鹏 申请人:清华大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1