首页> 中国专利> 一种嵌入式操作系统中切换任务的方法和单元

一种嵌入式操作系统中切换任务的方法和单元

摘要

本发明公开了一种嵌入式操作系统中切换任务的方法和单元;单元,包括:存储模块、共用堆栈控制模块;所述存储模块用于存储多个任务共用的堆栈;所述共用堆栈控制模块用于在接收切换任务的指令后,将当前运行任务的现场数据存放在所述共用堆栈中,查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。本发明的技术方案可以解决任务堆栈浪费存储空间的问题,适用于存储空间紧缺的系统;并且在任务切换时不需要更改CPU的SP指针。本发明的优化方案还可以进一步节省存储空间;另一优化方案可以降低任务切换时的工作量,从而提高切换效率。

著录项

  • 公开/公告号CN101290591A

    专利类型发明专利

  • 公开/公告日2008-10-22

    原文格式PDF

  • 申请/专利权人 北京中星微电子有限公司;

    申请/专利号CN200810114322.3

  • 发明设计人 艾国;

    申请日2008-06-03

  • 分类号G06F9/48;

  • 代理机构北京安信方达知识产权代理有限公司;

  • 代理人栗若木

  • 地址 100083 北京市海淀区学院路35号世宁大厦16层

  • 入库时间 2023-12-17 20:58:06

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2013-07-24

    未缴年费专利权终止 IPC(主分类):G06F9/48 授权公告日:20111012 终止日期:20120603 申请日:20080603

    专利权的终止

  • 2011-10-12

    授权

    授权

  • 2009-03-04

    实质审查的生效

    实质审查的生效

  • 2008-10-22

    公开

    公开

说明书

技术领域

本发明涉及嵌入式操作系统,尤其涉及一种嵌入式操作系统中切换任务的方法和单元。

背景技术

嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器browser等。与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。

中断是指由于某个事件的发生,CPU暂停当前正在执行的其它程序,转而执行处理该事件的一个程序。该事件的程序执行完成后,CPU接着执行被暂停的程序,这个过程称为中断。根据中断源的位置,有两种类型的中断:有的中断源在CPU的内部,称为内部中断。大多数的中断源在CPU的外部,称为外部中断。根据中断引脚的不同,或者CPU响应中断的不同条件,也可以把中断划分为可屏蔽中断和不可屏蔽中断两种。有了这种中断机制,CPU才能有条不紊地“同时”完成多个任务,中断机制实质上帮助CPU提高了并发“处理”能力。

任务上下文是指任务切换要保存的数据,也叫上下文,简单地说,一个任务可看作一个运行中的C函数。对于抢先式RTOS(实时操作系统)来说,在任务切换时,应保存当前任务的各种现场数据。现场数据包括局部变量、各个CPU寄存器、堆栈指针和程序被中止的任务指针。CPU寄存器是任何任务代码均会用到的;而局部变量,一般的编译器是将其它安排在堆栈空间中,堆栈指针也是各任务共用的,所以也需要保存。而对于全局变量,由于一般是在内存中的固定位置,各任务所占用的空间完全独立,所以不需要保存。

变量在堆栈中的位置,一般编译器中,对于一个存在函数调用嵌套的C程序来说,大部分编译器将传递的参数和函数本身的局部变量放在了堆栈中,编译器会自动生成压栈(push)和弹栈(pop)代码,以保存上级函数的运行寄存器。假设函数main()调用test1(),而test1()调用test2(),则在执行test2()中的代码时,堆栈映像如图1所示(ARM CPU的情况)。对于RTOS系统,堆栈中的各种数据就是一个任务的现场。一般CPU的堆栈指针SP只有一个,在进行任务切换时,必须将挂起任务所使用的堆栈内容保存起来,以便使该任务在下次唤醒时能从原地继续运行。

在现有技术中,为了保存任务堆栈中的数据,为每个任务定义一个数组变量作为堆栈,在任务切换时,将CPU堆栈指针SP指向当前运行的任务对应的数组中的某个元素,即栈顶,如图2所示。而各任务的堆栈空间都是预留好的。

在图2中,为每个任务定义一个数组变量作为堆栈,数组的大小一般根据可能出现的任务需要的最大堆栈来分配,任务所需的最大堆栈一般很难确定,一般根据经验值来确定,而且堆栈要确保不能溢出,一旦溢出就很麻烦,因此在实际中每个任务需要分配比实际大很多的一个堆栈,这样每个任务的堆栈都会有浪费,一般在操作系统中任务的个数是比较多的,因此对于整个系统而言,存储资源的浪费就很明显。

发明内容

本发明要解决的技术问题是提供一种嵌入式操作系统中切换任务的方法和单元,能够节省任务堆栈占用的存储空间。

为了解决上述问题,本发明提供了一种嵌入式操作系统中切换任务的方法,包括:

建立多个任务共用的堆栈;切换任务时,先将当前运行任务的现场数据存放在所述共用堆栈中;

查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。

进一步的,将当前运行任务的现场数据存放在所述共用堆栈中时,记录该当前运行任务现场数据存放起点和终点的地址;

查找待运行任务的现场数据是否保存在共用堆栈中是指:查找所述待运行任务现场数据对应的存放起点和终点的地址,判断该起点和终点是否位于所述共用堆栈中;

待运行任务的现场数据根据待运行任务现场数据对应的存放起点和终点的地址在所述共用堆栈中找到。

进一步的,将待运行任务的现场数据调换至共用堆栈中所有数据的上方具体是指:

将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移L,L为待运行任务现场数据的长度;更新下移的各任务对应的存放起点和终点的地址。

进一步的,将待运行任务的现场数据调换至共用堆栈中所有数据的上方具体是指:

在共用堆栈中待运行任务现场数据上方的存储空间中查找,是否存在现场数据长度小于或等于待运行任务现场数据长度的任务;

如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移L,L为待运行任务现场数据的长度;更新下移的各任务对应的存放起点和终点的地址;

如果存在则从查找到的任务当中选择一个作为目标任务,将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方;将目标任务的现场数据复制或移动到待运行任务现场数据原先的存放位置,更新该任务对应的存放起点和终点的地址;将共用堆栈中在目标任务现场数据原先存放位置以上的所有数据依次下移L1,L1为目标任务现场数据的长度;更新下移的各任务对应的存放起点和终点的地址。

进一步的,复制或移动现场数据时直接进行,或先将待运行任务的现场数据复制/移动到临时存储空间中,再复制/移动到共用堆栈中。

本发明还提供了一种嵌入式操作系统中切换任务的单元,包括:存储模块、共用堆栈控制模块;

所述存储模块用于存储多个任务共用的堆栈;

所述共用堆栈控制模块用于在接收切换任务的指令后,将当前运行任务的现场数据存放在所述共用堆栈中,查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。

进一步的,所述共用堆栈控制模块将当前运行任务的现场数据存放在所述共用堆栈中时,将其存放起点和终点的地址记录在任务控制块TCB中;

所述共用堆栈控制模块查找待运行任务的现场数据是否保存在共用堆栈中是指:共用堆栈控制模块在TCB中查找所述待运行任务现场数据对应的存放起点和终点的地址,判断该起点和终点是否位于所述共用堆栈中;

所述共用堆栈控制模块根据待运行任务现场数据对应的存放起点和终点的地址在所述共用堆栈中找到待运行任务的现场数据。

进一步的,所述共用堆栈控制模块将待运行任务的现场数据调换至共用堆栈中所有数据的上方具体是指:

共用堆栈控制模块将待运行任务的现场数据按顺序复制或移动到共用堆栈中当前运行任务的现场数据的上方,然后将共用堆栈中待运行任务现场数据原先存放位置以上的所有数据依次下移L,L为待运行任务现场数据的长度;更新TCB中下移的各任务对应的存放起点和终点的地址。

进一步的,所述共用堆栈控制模块将待运行任务的现场数据调换至共用堆栈中所有数据的上方具体是指:

共用堆栈控制模块在共用堆栈中找到现场数据位于待运行任务现场数据上方的任务,根据TCB中的记录确定这些任务及待运行任务的现场数据长度;判断这些任务中是否存在现场数据长度小于或等于待运行任务现场数据长度的任务;

如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中当前运行任务的现场数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移L,L为待运行任务现场数据的长度;更新TCB中下移的各任务对应的存放起点和终点的地址;

如果存在则选择一个作为目标任务;将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方;将目标任务的现场数据复制或移动到待运行任务现场数据原先的存放位置,更新TCB中该任务对应的存放起点和终点的地址;将共用堆栈中在目标任务现场数据原先存放位置以上的所有数据依次下移L1,L1为目标任务现场数据的长度;更新TCB中下移的各任务对应的存放起点和终点的地址。

进一步的,所述存储模块中还包括一临时存储空间;

共用堆栈控制模块复制或移动待运行任务的现场数据时先将其复制/移动到所述临时存储空间中,再复制/移动到共用堆栈中。

本发明的技术方案可以解决任务堆栈浪费存储空间的问题,适用于存储空间紧缺的系统;并且在任务切换时不需要更改CPU的SP指针。本发明的优化方案还可以进一步节省存储空间;另一优化方案可以降低任务切换时的工作量,从而提高切换效率。

附图说明

图1为一种堆栈的映像图;

图2为现有技术中切换任务时的堆栈使用示意图;

图3为本发明中的共用堆栈示意图;

图4为应用实例中的堆栈使用示意图;

图5为应用实例中的流程示意图。

具体实施方式

下面将结合附图及实施例对本发明的技术方案进行更详细的说明。

堆栈是一种先进后出的存储器,即第一条进栈的数据将位于堆栈的最底端(即栈底),而最后一条进栈的数据将位于堆栈的最顶端。本文中,为了方便说明,将从栈顶到栈底的方向称为“向下”,而从栈底到栈顶的方向称为“向上”,堆栈的栈顶和栈底分别指的是堆栈中的上、下边界,即一个数据的位置在先进栈的数据的上方。一个任务的现场数据的长度是指:数据的总条数或数据占用的存储空间的大小;比如从图1来看,一条数据占用堆栈中的“一格”。

本发明提供了一种嵌入式操作系统中切换任务的方法:

建立多个任务共用的堆栈;切换任务时,先将当前运行任务的现场数据存放在所述共用堆栈中;

查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。

其中,所述共用堆栈的大小比现有技术中所需要的堆栈的总存储空间要小的多,假设现有的方法中每个堆栈空间大小为K(K为任务可能出现的任务所需要的最大存储空间大小),任务数为N,则需要的堆栈总空间为N×K;而在本发明中,考虑到各任务互补的情况,即各任务不会都需要占用大小为K的存储空间,假设各任务平均的堆栈空间大小为M,共用堆栈中存放N个任务的现场数据,则共用堆栈的总空间大小等于或稍大于M×N即可,差不多是现有方法中的二分之一或者更小。

其中,将当前运行任务的现场数据存放在所述共用堆栈中时,可以记录该当前运行任务现场数据存放起点和终点的地址。实际应用时,也可以记录起点和终点地址中的任一个,以及堆栈长度;可以但不限于记录于TCB(任务控制块)中。

其中查找待运行任务的现场数据是否保存在共用堆栈中可以是指:查找所述待运行任务现场数据对应的存放起点和终点的地址,判断该起点和终点是否位于所述共用堆栈中。起点和终点地址如记录于TCB中,则在TCB中查找。实际应用时,如果记录的是起点和终点地址中的任一个及堆栈长度,则这一步骤相应判断起点/终点地址是否位于所述共用堆栈中。

其中,待运行任务的现场数据可以根据待运行任务现场数据对应的存放起点和终点的地址在所述共用堆栈中找到。实际应用时,如果记录的是起点和终点地址中的任一个,以及堆栈长度,则这一步骤相应根据起点/终点地址以及堆栈长度在所述共用堆栈中找到待运行任务的现场数据。

其中,将待运行任务的现场数据调换至共用堆栈中所有数据的上方具体可以是指:将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移L,L为待运行任务现场数据的长度;更新下移的各任务对应的存放起点和终点的地址。

实际应用时,如果记录的是起点和终点地址中的任一个,以及堆栈长度,则更新相应地址即可。

复制或移动现场数据时可以直接进行,也可以通过一个临时存储空间进行中转,即先将待运行任务的现场数据复制/移动到该临时存储空间中,再复制/移动到共用堆栈中;如果采用中转的方法,则可以在将待运行任务的现场数据复制/移动到临时存储空间后,先下移待运行任务现场数据原先存放位置以上的所有数据,下移后再将临时存储空间中的现场数据复制/移动到共用堆栈中所有数据的上方,更新下移的各任务和待运行任务对应的存放起点和终点的地址。这个临时存储空间也可以用共用堆栈中顶部的空间来代替,这样是栈的空间占用的更少,如图3所示。

本文中,复制是指不删除原始数据的方式,而移动是指删除原始数据的方式;下移时可以是采用复制的方式,也可以采用移动的方式。

当调换完成后,共用堆栈中各任务的现场数据是从栈底开始相邻存储的,各现场数据间没有间隔,比如对于一个存储位置位于共用堆栈中间的任务而言,其第一条数据(最先进栈的数据)和位于其下面的任务的最后一条数据(最后进栈的数据)是相邻的,而其最后一条数据和位于其上方的任务的第一条数据是相邻的。可以看出,由于在调换前后总的堆栈长度不变,因此切换任务时CPU的SP指针是不用改变的。

其中,将待运行任务的现场数据调换至共用堆栈中所有数据的上方也可以是指:

在共用堆栈中待运行任务现场数据上方的存储空间中查找,是否存在现场数据长度小于或等于待运行任务现场数据长度的任务;

如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移L,L为待运行任务现场数据的长度;更新下移的各任务对应的存放起点和终点的地址;

如果存在则从查找到的任务当中选择一个作为目标任务,将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方;将目标任务的现场数据复制或移动到待运行任务现场数据原先的存放位置,更新该任务对应的存放起点和终点的地址;将共用堆栈中在目标任务现场数据原先存放位置以上的所有数据依次下移L1,L1为目标任务现场数据的长度;更新下移的各任务对应的存放起点和终点的地址。

选择目标任务时,选择现场数据长度和待运行任务现场数据长度最接近,或在共用堆栈中与待运行任务现场数据存放位置间隔最远的任务。

现场数据长度可以从TCB中直接找到,或由存放起点、终点地址的差值得到。

这样做的优点在于:目标任务的现场数据在共用堆栈中与待运行任务现场数据存放位置间隔越远,调换时的工作量就能降低越多,因为这两个任务间隔的那些任务都可以不用参与下移了。但是,当查找到的任务的现场数据小于待运行任务的现场数据长度时,调换完成后该查找到的任务的现场数据与其它任务(位于该任务上方,或下方,或上下方都有)的数据之间会有间隔,相当于是存储空间的碎片;这样会需要常常进行碎片整理,以免堆栈中的存储空间被浪费而导致溢出。

本发明还提供了一种嵌入式操作系统中切换任务的单元,包括:存储模块、共用堆栈控制模块。

所述存储模块用于存储多个任务共用的堆栈;

所述共用堆栈控制模块用于在接收CPU切换任务的指令后,将当前运行任务的现场数据存放在所述共用堆栈中,查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。

其中,所述共用堆栈控制模块将当前运行任务的现场数据存放在所述共用堆栈中时,可以将当前运行任务现场数据存放起点和终点的地址记录在TCB中。实际应用时,也可以记录起点和终点地址中的任一个,以及堆栈长度。实际应用时也不限于记录于TCB中。

其中,所述共用堆栈控制模块查找待运行任务的现场数据是否保存在共用堆栈中可以是指:共用堆栈控制模块在TCB中查找所述待运行任务现场数据对应的存放起点和终点的地址,判断该起点和终点是否位于所述共用堆栈中。实际应用时,如果记录的是起点和终点地址中的任一个,以及堆栈长度,则共用堆栈控制模块相应判断起点/终点地址是否位于所述共用堆栈中。

其中,所述共用堆栈控制模块可以根据待运行任务现场数据对应的存放起点和终点的地址在所述共用堆栈中找到待运行任务的现场数据。实际应用时,如果记录的是起点和终点地址中的任一个,以及堆栈长度,则共用堆栈控制模块相应根据起点/终点地址以及堆栈长度在所述共用堆栈中找到待运行任务的现场数据。

其中,所述共用堆栈控制模块将待运行任务的现场数据调换至共用堆栈中所有数据的上方具体可以是指:共用堆栈控制模块将待运行任务的现场数据按顺序复制或移动到共用堆栈中当前运行任务的现场数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移L,L为待运行任务现场数据的长度;更新TCB中下移的各任务对应的存放起点和终点的地址。

实际应用时,如果记录的是起点和终点地址中的任一个,以及堆栈长度,则更新相应地址即可。

共用堆栈控制模块可以直接复制或移动现场数据。

如果所述存储模块中还包括一临时存储空间,则共用堆栈控制模块也可以先将待运行任务的现场数据复制/移动到该临时存储空间中,再复制/移动到共用堆栈中;此时,共用堆栈控制模块可以在将待运行任务的现场数据复制/移动到临时存储空间后,先下移待运行任务现场数据原先存放位置以上的所有数据,下移后再将临时存储空间中的现场数据复制/移动到共用堆栈中所有数据的上方,更新下移的各任务和待运行任务对应的存放起点和终点的地址。下移时可以是采用复制的方式,也可以采用移动的方式。

其中,所述共用堆栈控制模块将待运行任务的现场数据调换至共用堆栈中所有数据的上方也可以是指:

共用堆栈控制模块在共用堆栈中找到现场数据位于待运行任务现场数据上方的任务,根据TCB中的记录确定这些任务及待运行任务的现场数据长度--可以直接在TCB里找到记录,或由存放起点、终点地址的差值得到;判断这些任务中是否存在现场数据长度小于或等于待运行任务现场数据长度的任务;

如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中当前运行任务的现场数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移L,L为待运行任务现场数据的长度;更新TCB中下移的各任务对应的存放起点和终点的地址;

如果存在则选择一个作为目标任务;将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方;将目标任务的现场数据复制或移动到待运行任务现场数据原先的存放位置,更新TCB中该任务对应的存放起点和终点的地址;将共用堆栈中在目标任务现场数据原先存放位置以上的所有数据依次下移L1,L1为目标任务现场数据的长度;更新TCB中下移的各任务对应的存放起点和终点的地址。

所述共用堆栈控制模块选择现场数据长度和待运行任务现场数据长度最接近,或在共用堆栈中与待运行任务现场数据存放位置间隔最远的任务作为目标任务。

下面用本发明的两个应用实例进一步加以说明。

应用实例一是简单的两个任务的切换情况,其中堆栈情况如图4所示;假定任务1首次运行时任务栈为空。运行一段时间后任务2运行,堆栈空间继续往上生长。这次任务切换不需要修改CPU的SP数值,但需要记下任务1的现场数据存放起点位置SP1和长度。在任务2运行一段时间后,RTOS又切换到任务1运行。在切换时,不能简单地将SP指针修改回SP1的数值,因为这样堆栈向上生长时会破坏任务2堆栈中的数据。办法是记下任务2的现场数据存放起点位置SP2和长度,将原来保存的任务1的现场数据移动到靠栈顶的位置,而将任务2的现场数据下移到靠栈底的位置,堆栈指针SP实际上不需要修改。

应用实例二中切换时的流程图如图5所示,主要步骤是:

501、CPU指示切换到任务i运行;

502、判断任务i的现场数据是否位于共用堆栈最上方,如果是则不用切换,进行步骤508;如果不是则进行步骤503;

503、将任务i的现场数据复制到临时堆栈中;

504、判断任务i的现场数据是否在共用堆栈中,如果不在则说明任务i为新任务,完成切换,进行步骤508;如果在则进行步骤505;

505、将共用堆栈中任务i的现场数据上方的数据都下移L,L为任务i的现场数据的长度;

506、更新下移的各任务对应的存放起点和终点地址;

507、将临时堆栈中的现场数据复制到共用堆栈中所有数据的上方;更新待运行任务对应的存放起点和终点地址;

508、结束。

当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明的权利要求的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号