专利名称:一种嵌入式操作系统中切换任务的方法和单元的制作方法
技术领域:
本发明涉及嵌入式操作系统,尤其涉及一种嵌入式操作系统中切换任务 的方法和单元。
背景技术:
嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入 式系统(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的 底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏
览器browser等。与通用操作系统相比较,嵌入式操作系统在系统实时高效 性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出 的特点。
中断是指由于某个事件的发生,CPU暂停当前正在执行的其它程序,转 而执行处理该事件的一个程序。该事件的程序执行完成后,CPU接着执行被 暂停的程序,这个过程称为中断。根据中断源的位置,有两种类型的中断 有的中断源在CPU的内部,称为内部中断。大多数的中断源在CPU的外部, 称为外部中断。根据中断引脚的不同,或者CPU响应中断的不同条件,也可 以把中断划分为可屏蔽中断和不可屏蔽中断两种。有了这种中断机制,CPU 才能有条不紊地"同时"完成多个任务,中断机制实质上帮助CPU提高了并 发"处理"能力。
任务上下文是指任务切换要保存的数据,也叫上下文,简单地说, 一个 任务可看作一个运行中的C函数。对于抢先式RTOS (实时操作系统)来说, 在任务切换时,应保存当前任务的各种现场数据。现场数据包括局部变量、 各个CPU寄存器、堆栈指针和程序被中止的任务指针。CPU寄存器是任何任 务代码均会用到的;而局部变量, 一般的编译器是将其它安排在堆栈空间中, 堆栈指针也是各任务共用的,所以也需要保存。而对于全局变量,由于一般是在内存中的固定位置,各任务所占用的空间完全独立,所以不需要保存。
变量在堆栈中的位置, 一般编译器中,对于一个存在函数调用嵌套的C 程序来说,大部分编译器将传递的参数和函数本身的局部变量放在了堆栈中,
编译器会自动生成压栈(push)和弹栈(p叩)代码,以保存上级函数的运行 寄存器。假设函数main ()调用testl(),而testl ()调用test2 (),则在执 行test2 ()中的代码时,堆栈映像如图1所示(ARM CPU的情况)。对于RTOS 系统,堆栈中的各种数据就是一个任务的现场。 一般CPU的堆栈指针SP只 有一个,在进行任务切换时,必须将挂起任务所使用的堆栈内容保存起来, 以便使该任务在下次唤醒时能从原地继续运行。
在现有技术中,为了保存任务堆栈中的数据,为每个任务定义一个数组 变量作为堆栈,在任务切换时,将CPU堆栈指针SP指向当前运行的任务对 应的数组中的某个元素,即栈顶,如图2所示。而各任务的堆栈空间都是预 留好的。
在图2中,为每个任务定义一个数组变量作为堆栈,数组的大小一般根 据可能出现的任务需要的最大堆栈来分配,任务所需的最大堆栈一般很难确 定, 一般根据经验值来确定,而且堆栈要确保不能溢出, 一旦溢出就很麻烦, 因此在实际中每个任务需要分配比实际大很多的一个堆栈,这样每个任务的 堆栈都会有浪费, 一般在操作系统中任务的个数是比较多的,因此对于整个 系统而言,存储资源的浪费就很明显。
发明内容
本发明要解决的技术问题是提供一种嵌入式操作系统中切换任务的方法 和单元,能够节省任务堆栈占用的存储空间。
为了解决上述问题,本发明提供了一种嵌入式操作系统中切换任务的方 法,包括
建立多个任务共用的堆栈;切换任务时,先将当前运行任务的现场数据 存;^文在所述共用堆栈中;
查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。
进一步的,将当前运行任务的现场数据存放在所述共用堆栈中时,记录
该当前运行任务现场数据存》文起点和终点的地址;
查找待运行任务的现场数据是否保存在共用堆栈中是指查找所述待运 行任务现场数据对应的存放起点和终点的地址,判断该起点和终点是否位于 所述共用堆栈中;
的地址在所述共用堆栈中找到。
进一步的,将待运行任务的现场数据调换至共用堆栈中所有数据的上方 具体是指
将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上 方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据
依次下移L, L为待运行任务现场数据的长度;更新下移的各任务对应的存放 起点和终点的地址。
进一步的,将待运行任务的现场数据调换至共用堆栈中所有数据的上方 具体是指
在共用堆栈中待运行任务现场数据上方的存储空间中查找,是否存在现 场数据长度小于或等于待运行任务现场数据长度的任务;
如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中 所有数据的上方,然后将共用堆栈中在待运行任务现场数据原先存》文位置以 上的所有数据依次下移L, L为待运行任务现场数据的长度;更新下移的各任 务对应的存》文起点和终点的地址;
如果存在则从查找到的任务当中选择一个作为目标任务,将待运行任务 的现场数据按顺序复制或移动到共用堆栈中所有数据的上方;将目标任务的 现场数据复制或移动到待运行任务现场数据原先的存放位置,更新该任务对 应的存放起点和终点的地址;将共用堆栈中在目标任务现场数据原先存放位 置以上的所有数据依次下移Ll, Ll为目标任务现场数据的长度;更新下移的 各任务对应的存放起点和终点的地址。
^点和乡冬点进一步的,复制或移动现场数据时直接进行,或先将待运行任务的现场 数据复制/移动到临时存储空间中,再复制/移动到共用堆栈中。
本发明还提供了一种嵌入式操作系统中切换任务的单元,包括存储才莫 块、共用堆栈控制模块;
所述存储模块用于存储多个任务共用的堆栈;
所述共用堆栈控制模块用于在接收切换任务的指令后,将当前运行任务 的现场数据存放在所述共用堆栈中,查找待运行任务的现场数据是否保存在 共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆 栈中其它数据的上方。
进一步的,所述共用堆栈控制模块将当前运行任务的现场数据存放在所 述共用堆栈中时,将其存放起点和终点的地址记录在任务控制块TCB中;
所述共用堆栈控制模块查找待运行任务的现场数据是否保存在共用堆栈 中是指共用堆栈控制模块在TCB中查找所述待运行任务现场数据对应的存 放起点和终点的地址,判断该起点和终点是否位于所述共用堆栈中;
所述共用堆栈控制才莫块根据待运行任务现场数据对应的存放起点和终点 的地址在所述共用堆栈中找到待运行任务的现场数据。
进一步的,所述共用堆栈控制模块将待运行任务的现场数据调换至共用 堆栈中所有数据的上方具体是指
共用堆栈控制模块将待运行任务的现场数据按顺序复制或移动到共用堆 栈中当前运行任务的现场数据的上方,然后将共用堆栈中待运行任务现场数 据原先存放位置以上的所有数据依次下移L, L为待运行任务现场数据的长 度;更新TCB中下移的各任务对应的存放起点和终点的地址。
进一步的,所述共用堆栈控制模块将待运行任务的现场数据调换至共用 堆栈中所有数据的上方具体是指
共用堆栈控制^t块在共用堆栈中找到现场数据位于待运行任务现场数据 上方的任务,根据TCB中的记录确定这些任务及待运行任务的现场数据长度; 判断这些任务中是否存在现场数据长度小于或等于待运行任务现场数据长度的任务;
如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中 当前运行任务的现场数据的上方,然后将共用堆栈中在待运行任务现场数据
原先存放位置以上的所有数据依次下移L, L为待运行任务现场数据的长度; 更新TCB中下移的各任务对应的存》t^点和终点的地址;
如杲存在则选择一个作为目标任务;将待运行任务的现场数据按顺序复 制或移动到共用堆栈中所有数据的上方;将目标任务的现场数据复制或移动 到待运行任务现场数据原先的存放位置,更新TCB中该任务对应的存放起点 和终点的地址;将共用堆栈中在目标任务现场数据原先存放位置以上的所有 数据依次下移Ll, Ll为目标任务现场数据的长度;更新TCB中下移的各任务 对应的存》丈起点和终点的地址。
进一步的,所述存储;漠块中还包括一临时存储空间;
共用堆栈控制模块复制或移动待运行任务的现场数据时先将其复制/移 动到所述临时存储空间中,再复制/移动到共用堆栈中。
本发明的技术方案可以解决任务堆栈浪费存储空间的问题,适用于存储 空间紧缺的系统;并且在任务切换时不需要更改CPU的SP指针。本发明的 优化方案还可以进一步节省存储空间;另一优化方案可以降低任务切换时的 工作量,从而提高切换效率。
图1为一种堆栈的映像图2为现有技术中切换任务时的堆栈使用示意图; 图3为本发明中的共用堆栈示意图; 图4为应用实例中的堆栈使用示意图; 图5为应用实例中的流程示意图。
具体实施方式
下面将结合附图及实施例对本发明的技术方案进行更详细的说明。
堆栈是一种先进后出的存储器,即第一条进栈的数据将位于堆栈的最底 端(即栈底),而最后一条进栈的数据将位于堆栈的最顶端。本文中,为了 方便说明,将从栈顶到栈底的方向称为"向下",而从栈底到栈顶的方向称 为"向上",堆栈的栈顶和栈底分别指的是堆栈中的上、下边界,即一个凄t
据的位置在先进栈的数据的上方。 一个任务的现场数据的长度是指数据的 总条数或数据占用的存储空间的大小;比如从图1来看, 一条数据占用堆栈 中的"一格"。
本发明提供了 一种嵌入式操作系统中切换任务的方法
建立多个任务共用的堆栈;切换任务时,先将当前运行任务的现场数据 存》文在所述共用堆栈中;
查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对 应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。
其中,所述共用堆栈的大小比现有技术中所需要的堆栈的总存储空间要 小的多,假设现有的方法中每个堆栈空间大小为K (K为任务可能出现的任 务所需要的最大存储空间大小),任务数为N,则需要的堆栈总空间为NxK; 而在本发明中,考虑到各任务互补的情况,即各任务不会都需要占用大小为 K的存储空间,假设各任务平均的堆栈空间大小为M,共用堆栈中存放N个 任务的现场数据,则共用堆栈的总空间大小等于或稍大于MxN即可,差不多 是现有方法中的二分之一或者更小。
其中,将当前运行任务的现场数据存放在所述共用堆栈中时,可以记录 该当前运行任务现场数据存放起点和终点的地址。实际应用时,也可以记录 起点和终点地址中的任一个,以及堆栈长度;可以但不限于记录于TCB (任 务控制块)中。
其中查找待运行任务的现场数据是否保存在共用堆栈中可以是指查找 所述待运行任务现场数据对应的存放起点和终点的地址,判断该起点和终点 是否位于所述共用堆栈中。起点和终点地址如记录于TCB中,则在TCB中 查找。实际应用时,如果记录的;l^点和终点地址中的任一个及堆栈长度,则这一步骤相应判断起点/终点地址是否位于所述共用堆栈中。
起点和终点的地址在所述共用堆栈中找到。实际应用时,如果记录的^点 和终点地址中的任一个,以及堆栈长度,则这一步骤相应根据起点/终点地址 以及堆栈长度在所述共用堆栈中找到待运行任务的现场凄史据。
可以是指将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数 据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所
有数据依次下移L, L为待运行任务现场数据的长度;更新下移的各任务对应 的存》t起点和终点的地址。
实际应用时,如果记录的^点和终点地址中的任一个,以及堆栈长度, 则更新相应i也址即可。
复制或移动现场数据时可以直接进行,也可以通过一个临时存储空间进 行中转,即先将待运行任务的现场数据复制/移动到该临时存储空间中,再复 制/移动到共用堆栈中;如果采用中转的方法,则可以在将待运行任务的现场 数据复制/移动到临时存储空间后,先下移待运行任务现场数据原先存放位置 以上的所有数据,下移后再将临时存储空间中的现场数据复制/移动到共用堆 栈中所有数据的上方,更新下移的各任务和待运行任务对应的存;^^点和终 点的地址。这个临时存储空间也可以用共用堆栈中顶部的空间来代替,这样 是^^的空间占用的更少,如图3所示。
本文中,复制是指不删除原始数据的方式,而移动是指删除原始数据的 方式;下移时可以是采用复制的方式,也可以采用移动的方式。
当调换完成后,共用堆栈中各任务的现场数据是从栈底开始相邻存储的, 各现场数据间没有间隔,比如对于一个存储位置位于共用堆栈中间的任务而 言,其第一条数据(最先进栈的数据)和位于其下面的任务的最后一条数据 (最后进栈的数据)是相邻的,而其最后一条数据和位于其上方的任务的第 一条数据是相邻的。可以看出,由于在调换前后总的堆栈长度不变,因此切 换任务时CPU的SP指针是不用改变的。其中,
以是指
在共用堆栈中待运行任务现场数据上方的存储空间中查找,是否存在现
场数据长度小于或等于待运行任务现场数据长度的任务;
如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中 所有数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以 上的所有数据依次下移L, L为待运行任务现场数据的长度;更新下移的各任 务对应的存i文起点和终点的地址;
如果存在则从查找到的任务当中选择一个作为目标任务,将待运行任务 的现场数据按顺序复制或移动到共用堆栈中所有数据的上方;将目标任务的 现场数据复制或移动到待运行任务现场数据原先的存放位置,更新该任务对 应的存放起点和终点的地址;将共用堆栈中在目标任务现场数据原先存放位 置以上的所有数据依次下移Ll, Ll为目标任务现场数据的长度;更新下移的 各任务对应的存放起点和终点的地址。
选择目标任务时,选择现场数据长度和待运行任务现场数据长度最接近, 或在共用堆栈中与待运行任务现场数据存放位置间隔最远的任务。
现场数据长度可以从TCB中直接找到,或由存放起点、终点地址的差值 得到。
这样做的优点在于目标任务的现场数据在共用堆栈中与待运行任务现 场数据存放位置间隔越远,调换时的工作量就能降低越多,因为这两个任务 间隔的那些任务都可以不用参与下移了。但是,当查找到的任务的现场数据 小于待运行任务的现场数据长度时,调换完成后该查找到的任务的现场数据 与其它任务(位于该任务上方,或下方,或上下方都有)的数据之间会有间 隔,相当于是存储空间的碎片;这样会需要常常进行碎片整理,以免堆栈中 的存储空间被浪费而导致溢出。
本发明还提供了一种嵌入式操作系统中切换任务的单元,包括存储模 块、共用堆栈控制模块。所述存储^^莫块用于存储多个任务共用的堆栈;
所述共用堆栈控制模块用于在接收CPU切换任务的指令后,将当前运行
任务的现场数据存放在所述共用堆栈中,查找待运行任务的现场数据是否保 存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共 用堆栈中其它数据的上方。
其中,所述共用堆栈控制;f莫块将当前运行任务的现场数据存放在所述共 用堆栈中时,可以将当前运行任务现场数据存放起点和终点的地址记录在 TCB中。实际应用时,也可以记录起点和终点地址中的任一个,以及堆栈长 度。实际应用时也不限于记录于TCB中。
其中,所述共用堆栈控制模块查找待运行任务的现场数据是否保存在共 用堆栈中可以是指共用堆栈控制才莫块在TCB中查找所述待运行任务现场数 据对应的存放起点和终点的地址,判断该起点和终点是否位于所述共用堆栈 中。实际应用时,如果记录的M点和终点地址中的任一个,以及堆栈长度, 则共用堆栈控制模块相应判断起点/终点地址是否位于所述共用堆栈中。
其中,所述共用堆栈控制模块可以根据待运行任务现场数据对应的存放 起点和终点的地址在所述共用堆栈中找到待运行任务的现场数据。实际应用 时,如果记录的是起点和终点地址中的任一个,以及堆栈长度,则共用堆栈
行任务的现场数据。
其中,所述共用堆栈控制才莫块将待运行任务的现场数据调换至共用堆栈 中所有数据的上方具体可以是指共用堆栈控制模块将待运行任务的现场数 据按顺序复制或移动到共用堆栈中当前运行任务的现场数据的上方,然后将 共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移 L, L为待运行任务现场数据的长度;更新TCB中下移的各任务对应的存放 起点和终点的i也址。
实际应用时,如果记录的M点和终点地址中的任一个,以及堆栈长度, 则更新相应地址即可。
共用堆栈控制模块可以直接复制或移动现场数据。如果所述存储模块中还包括一临时存储空间,则共用堆栈控制模块也可
以先将待运行任务的现场数据复制/移动到该临时存储空间中,再复制/移动到 共用堆栈中;此时,共用堆栈控制模块可以在将待运行任务的现场数据复制/
移动到临时存储空间后,先下移待运行任务现场数据原先存放位置以上的所 有数据,下移后再将临时存储空间中的现场数据复制/移动到共用堆栈中所有
下移时可以是釆用复制的方式,也可以采用移动的方式。
其中,所述共用堆栈控制模块将待运行任务的现场数据调换至共用堆栈 中所有数据的上方也可以是指
共用堆栈控制4莫块在共用堆栈中找到现场数据位于待运行任务现场数据
上方的任务,根据TCB中的记录确定这些任务及待运行任务的现场数据长 度一一可以直接在TCB里找到记录,或由存》t^点、终点地址的差值得到; 判断这些任务中是否存在现场数据长度小于或等于待运行任务现场数据长度 的任务;
如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中 当前运行任务的现场数据的上方,然后将共用堆栈中在待运行任务现场数据 原先存》文位置以上的所有数据依次下移L, L为待运行任务现场数据的长度; 更新TCB中下移的各任务对应的存》汰点和终点的地址;
如果存在则选择一个作为目标任务;将待运行任务的现场数据按顺序复 制或移动到共用堆栈中所有数据的上方;将目标任务的现场数据复制或移动 到待运行任务现场数据原先的存放位置,更新TCB中该任务对应的存放起点 和终点的地址;将共用堆栈中在目标任务现场数据原先存》文位置以上的所有 数据依次下移Ll, Ll为目标任务现场数据的长度;更新TCB中下移的各任务 对应的存》文起点和终点的地址。
所述共用堆栈控制模块选择现场数据长度和待运行任务现场数据长度最 接近,或在共用堆栈中与待运行任务现场数据存放位置间隔最远的任务作为下面用本发明的两个应用实例进一步加以说明。
应用实例一是简单的两个任务的切换情况,其中堆栈情况如图4所示;
假定任务1首次运行时任务栈为空。运行一段时间后任务2运行,堆栈空间 继续往上生长。这次任务切换不需要修改CPU的SP数值,但需要记下任务 1的现场数据存放起点位置SP1和长度。在任务2运行一段时间后,RTOS 又切换到任务l运行。在切换时,不能筒单地将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、 将临时堆栈中的现场数据复制到共用堆栈中所有数据的上方;更新 待运行任务对应的存i&点和终点地址;
508、 结束。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的 但这些相应的改变和变形都应属于本发明的权利要求的保护范围。
权利要求
1、一种嵌入式操作系统中切换任务的方法,包括建立多个任务共用的堆栈;切换任务时,先将当前运行任务的现场数据存放在所述共用堆栈中;查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。
2、 如权利要求l所述的方法,其特征在于将当前运行任务的现场数据存放在所述共用堆栈中时,记录该当前运行 任务现场数据存放起点和终点的地址;查找待运行任务的现场数椐是否保存在共用堆栈中是指查找所述待运 行任务现场数据对应的存放起点和终点的地址,判断该起点和终点是否位于 所述共用堆栈中;的地址在所述共用堆栈中找到。
3、 如权利要求2所述的方法,其特征在于,将待运行任务的现场数据调 换至共用堆栈中所有数据的上方具体是指将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上 方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据 依次下移L, L为待运行任务现场数据的长度;更新下移的各任务对应的存放 起点和终点的i也址。
4、 如权利要求2所述的方法,其特征在于,将待运行任务的现场数据调 换至共用堆栈中所有凄t据的上方具体是指在共用堆栈中待运行任务现场数据上方的存储空间中查找,是否存在现 场数据长度小于或等于待运行任务现场数据长度的任务;如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中 所有数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移L, L为待运行任务现场数据的长度;更新下移的各任 务对应的存放起点和终点的地址;如果存在则从查找到的任务当中选择一个作为目标任务,将待运行任务 的现场数据按顺序复制或移动到共用堆栈中所有数据的上方;将目标任务的 现场数据复制或移动到待运行任务现场数据原先的存放位置,更新该任务对 应的存》丈起点和终点的地址;将共用堆栈中在目标任务现场数据原先存i史位 置以上的所有数据依次下移Ll, Ll为目标任务现场数据的长度;更新下移的 各任务对应的存放起点和终点的地址。
5、 如权利要求3或4所述的方法,其特征在于复制或移动现场数据时直接进行,或先将待运行任务的现场数据复制/移 动到临时存储空间中,再复制/移动到共用堆栈中。
6、 一种嵌入式操作系统中切换任务的单元,其特征在于,包括存储模 块、共用堆栈控制模块;所述存储模块用于存储多个任务共用的堆栈;所述共用堆栈控制才莫块用于在接收切换任务的指令后,将当前运行任务 的现场数据存放在所述共用堆栈中,查找待运行任务的现场数据是否保存在 共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆 栈中其它数据的上方。
7、 如权利要求6所述的单元,其特征在于所述共用堆栈控制才莫块将当前运行任务的现场数据存放在所述共用堆栈 中时,将其存放起点和终点的地址记录在任务控制块TCB中;所述共用堆栈控制模块查找待运行任务的现场数据是否保存在共用堆栈 中是指共用堆栈控制;f莫块在TCB中查找所述待运行任务现场数据对应的存 i汰点和终点的地址,判断该起点和终点是否位于所述共用堆栈中;所述共用堆栈控制模块根据待运行任务现场数据对应的存放起点和终点 的地址在所述共用堆栈中找到待运行任务的现场数据。
8、如权利要求7所述的单元,其特征在于,所述共用堆栈控制模块将待共用堆栈控制模块将待运行任务的现场数据按顺序复制或移动到共用堆 栈中当前运行任务的现场数据的上方,然后将共用堆栈中待运行任务现场数据原先存放位置以上的所有数据依次下移L, L为待运行任务现场数据的长 度;更新TCB中下移的各任务对应的存放起点和终点的地址。
9、 如权利要求7所述的单元,其特征在于,所述共用堆栈控制才莫块将待 运行任务的现场数据调换至共用堆栈中所有数据的上方具体是指共用堆栈控制;^莫块在共用堆栈中找到现场数据位于待运行任务现场数据 上方的任务,根据TCB中的记录确定这些任务及待运行任务的现场数据长度; 判断这些任务中是否存在现场数据长度小于或等于待运行任务现场数据长度 的任务;如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中 当前运行任务的现场数据的上方,然后将共用堆栈中在待运行任务现场数据 原先存放位置以上的所有数据依次下移L, L为待运行任务现场数据的长度; 更新TCB中下移的各任务对应的存i文起点和终点的地址;如果存在则选择一个作为目标任务;将待运行任务的现场数据按顺序复 制或移动到共用堆栈中所有数据的上方;将目标任务的现场数据复制或移动 到待运行任务现场数据原先的存放位置,更新TCB中该任务对应的存放起点 和终点的地址;将共用堆栈中在目标任务现场数据原先存i文位置以上的所有 数据依次下移Ll, Ll为目标任务现场数据的长度;更新TCB中下移的各任务 对应的存放起点和终点的地址。
10、 如权利要求8或9所述的单元,其特征在于 所述存储才莫块中还包括一临时存储空间;共用堆栈控制模块复制或移动待运行任务的现场数据时先将其复制/移 动到所述临时存储空间中,再复制/移动到共用堆栈中。
全文摘要
本发明公开了一种嵌入式操作系统中切换任务的方法和单元;单元,包括存储模块、共用堆栈控制模块;所述存储模块用于存储多个任务共用的堆栈;所述共用堆栈控制模块用于在接收切换任务的指令后,将当前运行任务的现场数据存放在所述共用堆栈中,查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。本发明的技术方案可以解决任务堆栈浪费存储空间的问题,适用于存储空间紧缺的系统;并且在任务切换时不需要更改CPU的SP指针。本发明的优化方案还可以进一步节省存储空间;另一优化方案可以降低任务切换时的工作量,从而提高切换效率。
文档编号G06F9/46GK101290591SQ20081011432
公开日2008年10月22日 申请日期2008年6月3日 优先权日2008年6月3日
发明者国 艾 申请人:北京中星微电子有限公司