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

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

Info

Publication number
CN1208721C
CN1208721C CN 03157389 CN03157389A CN1208721C CN 1208721 C CN1208721 C CN 1208721C CN 03157389 CN03157389 CN 03157389 CN 03157389 A CN03157389 A CN 03157389A CN 1208721 C CN1208721 C CN 1208721C
Authority
CN
China
Prior art keywords
task
user
interrupt
stack
register
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN 03157389
Other languages
English (en)
Other versions
CN1490722A (zh
Inventor
孙晓民
蔡云鹏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tsinghua University
Original Assignee
Tsinghua University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tsinghua University filed Critical Tsinghua University
Priority to CN 03157389 priority Critical patent/CN1208721C/zh
Publication of CN1490722A publication Critical patent/CN1490722A/zh
Application granted granted Critical
Publication of CN1208721C publication Critical patent/CN1208721C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Abstract

基于PowerPC处理器结构的分级任务切换方法属于嵌入式实时操作系统领域,其特征在于:它针对PowerPC处理器结构的特殊性,把用户任务上下文划分为基本、扩展和可选三部分,在中断处理中,根据系统配置和任务调度情况,采用只有基本部分入栈、基本和扩展部分入栈和全部上下文入栈三种方式;中断处理程序首先执行基本部分入栈,执行中断处理后判断任务调度性质,选择执行下一级入栈操作、调用调度器,或者恢复现场返回用户任务。减少了不必要的堆栈操作。作为清华大学汽车电子开放式系统的一部分,在MPC555平台上实施。测试表明,它提高了任务切换的效率,加快了系统运行速度。

Description

基于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结构处理器主要寄存器列表
    名称     简写
    通用寄存器     GPR0~GPR31(简写r0~r31),
    浮点寄存器     FPR0~FPR31(简写f0~f31),
    链接寄存器     LR
    条件寄存器     CR
    机器状态寄存器     MSR
    机器状态保存/恢复寄存器     SRR0、SRR1
    浮点状态寄存器     FPSCR
    整数异常寄存器     XER
    计数寄存器     CTR
按照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寄存器,然后调度器或者中断处理程序执行中断返回指令rfi,CPU就将当前指令指针指向SRR0所指的地址,从而实现了切换到用户任务代码或者上一层中断处理程序代码的功能。
上述整个中断处理程序框架的详细流程图见附图9。
本发明的方法,在清华OSEK操作系统中进行了应用,作为中断处理程序的核心,在系统中成功嵌入了时钟中断、CAN总线中断和串口中断。经过在MPC555平台上初步测试,采用上述方法,从产生中断到进入用户中断处理程序只需要13微秒;而如果采用通用的方法,需要23~33微秒。由此可见,本发明所述的方法提高了任务切换的效率。本发明实施方式中涉及的主要MPC555硬件操作如表2所示。
本发明所述方法适用于所有PowerPC处理器结构的微控制器。
         表2  主要MPC555硬件操作列表
    硬件操作 对应的硬件设置方法
    禁止硬件中断 往第81号特殊寄存器写任意数值,如执行汇编指令mtspr 81,r3。
    允许硬件中断 往第80号特殊寄存器写任意数值,如执行汇编指令mtspr 80,r3。
    设置系统时钟频率 设置锁相环、低电及复位控制寄存器PLPRCR(地址0x12FC284),当硬件晶振为4MHz时,若PLPRCR=0x900000,系统时钟频率为40MHz,若PLPRCR=0x400000时,系统时钟频率为20MHz。
    关闭软件看门狗 将系统保护控制寄存器SYPCR(地址0x12FC004)最低第三位清0(比如SYPCR=0xFFFFFF03)。
    获取中断请求号 读取系统界面单元中断向量寄存器SIVEC(地址0x12FC01C)的值,即为当前应该处理的硬件中断的请求号。

Claims (1)

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)中断恢复处理:
若用户中断服务程序完成后,判断不需要进行任务切换,则中断处理程序直接执行恢复现场操作,返回被中断的用户任务;若判断需要进行任务切换,则继续执行保存现场步骤,即进行第二级入栈操作或第二级和第三级入栈操作,激活调度器切换到用户任务执行。
CN 03157389 2003-09-19 2003-09-19 基于PowerPC处理器结构的分级任务切换方法 Expired - Fee Related CN1208721C (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 03157389 CN1208721C (zh) 2003-09-19 2003-09-19 基于PowerPC处理器结构的分级任务切换方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 03157389 CN1208721C (zh) 2003-09-19 2003-09-19 基于PowerPC处理器结构的分级任务切换方法

Publications (2)

Publication Number Publication Date
CN1490722A CN1490722A (zh) 2004-04-21
CN1208721C true CN1208721C (zh) 2005-06-29

Family

ID=34157012

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 03157389 Expired - Fee Related CN1208721C (zh) 2003-09-19 2003-09-19 基于PowerPC处理器结构的分级任务切换方法

Country Status (1)

Country Link
CN (1) CN1208721C (zh)

Families Citing this family (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1311337C (zh) * 2004-06-24 2007-04-18 华为技术有限公司 设备的保护运行模式实现方法及维护方法
CN100347676C (zh) * 2005-03-04 2007-11-07 清华大学 基于PowerPC处理器的车用操作系统中断管理方法
US7581051B2 (en) * 2005-05-16 2009-08-25 Microsoft Corporation Method for delivering interrupts to user mode drivers
CN100361105C (zh) * 2005-05-17 2008-01-09 北京中星微电子有限公司 中断处理中恢复访问环境设置的方法及装置
CN100361106C (zh) * 2005-05-17 2008-01-09 北京中星微电子有限公司 连续访问环境下的中断恢复方法及装置
US7716461B2 (en) * 2006-01-12 2010-05-11 Microsoft Corporation Capturing and restoring application state after unexpected application shutdown
US20070282928A1 (en) * 2006-06-06 2007-12-06 Guofang Jiao Processor core stack extension
US8296768B2 (en) * 2007-06-30 2012-10-23 Intel Corporation Method and apparatus to enable runtime processor migration with operating system assistance
GB2454885B (en) * 2007-11-21 2012-06-06 Advanced Risc Mach Ltd Interrupt jitter suppression
CN101290588B (zh) * 2008-03-07 2010-06-16 重庆邮电大学 一种微嵌入式实时任务调度器及调度方法
CN101770392B (zh) * 2008-12-30 2012-07-25 上海贝岭股份有限公司 一种基于μC/OS-Ⅱ的高速通信方法
CN102147752A (zh) * 2010-02-09 2011-08-10 深圳市金蝶中间件有限公司 一种处理事件的方法及装置
CN101853181A (zh) * 2010-05-11 2010-10-06 中达电通股份有限公司 用于嵌入式系统的子程序相互调用的方法
CN102043668B (zh) * 2010-12-10 2013-05-22 成电汽车电子产业园(昆山)有限公司 一种嵌入式实时操作系统中任务多次激活的方法
CN102033779B (zh) * 2010-12-17 2013-04-03 青岛海信信芯科技有限公司 中断处理方法及微控制器
CN102567104A (zh) * 2010-12-30 2012-07-11 中兴通讯股份有限公司 实时操作系统的软中断实现方法及装置
CN103309734A (zh) * 2013-06-24 2013-09-18 哈尔滨工业大学 基于优先级分组的嵌入式任务调度方法
CN103793325A (zh) * 2014-01-24 2014-05-14 深圳市同洲电子股份有限公司 一种内核调试方法及系统
CN106775988A (zh) * 2016-12-30 2017-05-31 广东欧珀移动通信有限公司 一种数据处理方法及设备
US10908952B2 (en) 2017-04-21 2021-02-02 Intel Corporation Preemptive scheduling of in-enclave threads
CN108804139B (zh) * 2017-06-16 2020-10-20 上海兆芯集成电路有限公司 可编程设备及其操作方法和计算机可用介质
CN107436752B (zh) * 2017-07-20 2020-12-01 龙芯中科技术有限公司 异常现场恢复方法、装置及计算机可读存储介质
CN107526622B (zh) * 2017-08-16 2020-04-07 北方工业大学 Linux的快速异常处理方法及装置
CN108037951B (zh) * 2017-12-27 2020-11-20 山东师范大学 一种dtp处理器的中断快速切换方法及装置
CN110362396A (zh) * 2019-07-23 2019-10-22 天津国芯科技有限公司 基于powerpc架构并支持中断嵌套的外部中断管理方法及系统
CN112799792B (zh) * 2021-02-01 2023-12-05 安徽芯纪元科技有限公司 一种嵌入式操作系统的任务上下文寄存器保护方法

Also Published As

Publication number Publication date
CN1490722A (zh) 2004-04-21

Similar Documents

Publication Publication Date Title
CN1208721C (zh) 基于PowerPC处理器结构的分级任务切换方法
CN100342342C (zh) 支持多进程的Java虚拟机实现方法
CN1308826C (zh) 用于smt处理器上的cpi调度的系统和方法
CN100347676C (zh) 基于PowerPC处理器的车用操作系统中断管理方法
US9798595B2 (en) Transparent user mode scheduling on traditional threading systems
CN102027447B (zh) 调度器中的局部任务集合
US8321874B2 (en) Intelligent context migration for user mode scheduling
CN1801096A (zh) 在计算机系统中用于对进程进行休眠的方法和系统
CN87100507A (zh) 微处理器芯片上的堆栈式超高速缓冲存储器
CN1783020A (zh) 基于PowerPC体系结构的嵌入式操作系统的中断管理方法
CN1601475A (zh) 用于在smt处理器中进行cpi负载平衡的系统和方法
CN1867891A (zh) 用于实时多线程处理的方法和装置
CN1916854A (zh) 一种管理与配置虚拟机的系统和方法
JPH06222999A (ja) スワップ・ブロック組立方法及びメモリ管理機構
CN101894049A (zh) 一种自适应回收垃圾对象的系统及方法
JP2008108075A (ja) タスク切替え制御方法及びコンピュータシステム
US9122521B2 (en) Enabling multiple operating systems to run concurrently using barrier task priority
CN106201695A (zh) 适用于嵌入式软件系统的多任务调度方法
CN1238787C (zh) 嵌入式实时操作系统的二分查找式任务调度方法
CN1329309A (zh) 操作系统的多语言用户接口
CN1424649A (zh) 开放式结构机器人控制器
CN112346835B (zh) 一种基于协程的调度处理方法及系统
CN1851651A (zh) 嵌入式sram操作系统进程优先权调度的实现方法
CN1384431A (zh) 上下文保存
CN1867895A (zh) 用于除了操作一个主操作系统外还操作一个辅助操作系统的方法和装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
C19 Lapse of patent right due to non-payment of the annual fee
CF01 Termination of patent right due to non-payment of annual fee