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

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

【技术实现步骤摘要】

本专利技术涉及嵌入式操作系统,尤其涉及一种嵌入式操作系统中切换任务的方法和单元
技术介绍
嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器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中的记录确定这些任务及待运行任务的现场数据长度;判断这些任务中是否存在现场数据长度小于或等于待运行任务现场数据长度-->的任务;如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中当前运行任务的现场数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有本文档来自技高网
...

【技术保护点】
一种嵌入式操作系统中切换任务的方法,包括:    建立多个任务共用的堆栈;切换任务时,先将当前运行任务的现场数据存放在所述共用堆栈中;    查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。

【技术特征摘要】
1、一种嵌入式操作系统中切换任务的方法,包括:建立多个任务共用的堆栈;切换任务时,先将当前运行任务的现场数据存放在所述共用堆栈中;查找待运行任务的现场数据是否保存在共用堆栈中,如果在则找到其对应的现场数据,将该现场数据调换至共用堆栈中其它数据的上方。2、如权利要求1所述的方法,其特征在于:将当前运行任务的现场数据存放在所述共用堆栈中时,记录该当前运行任务现场数据存放起点和终点的地址;查找待运行任务的现场数据是否保存在共用堆栈中是指:查找所述待运行任务现场数据对应的存放起点和终点的地址,判断该起点和终点是否位于所述共用堆栈中;待运行任务的现场数据根据待运行任务现场数据对应的存放起点和终点的地址在所述共用堆栈中找到。3、如权利要求2所述的方法,其特征在于,将待运行任务的现场数据调换至共用堆栈中所有数据的上方具体是指:将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移L,L为待运行任务现场数据的长度;更新下移的各任务对应的存放起点和终点的地址。4、如权利要求2所述的方法,其特征在于,将待运行任务的现场数据调换至共用堆栈中所有数据的上方具体是指:在共用堆栈中待运行任务现场数据上方的存储空间中查找,是否存在现场数据长度小于或等于待运行任务现场数据长度的任务;如果不存在则将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方,然后将共用堆栈中在待运行任务现场数据原先存放位置以上的所有数据依次下移L,L为待运行任务现场数据的长度;更新下移的各任务对应的存放起点和终点的地址;如果存在则从查找到的任务当中选择一个作为目标任务,将待运行任务的现场数据按顺序复制或移动到共用堆栈中所有数据的上方;将目标任务的现场数据复制或移动到待运行任务现场数据原先的存放位置,更新该任务对应的存放起点和终点的地址;将共用堆栈中在目标任务现场数据原先存放位置以上的所有数据依次下移L1,L1为目标任务现场数据的长度;更新下移的各任务对应的存放起点和终点的地址。5、如权利要求3或4所述的方法,其特征在于:复制或移动现场数据时直接进行,或先将待运行任务的现场数据复制/移动到临时存储空间中,再复制/移动到共用堆栈中。6、一种嵌入式操作系统中切换任务的单元,其特征在于,包括:存储模块、共用堆栈控制模块;所述存储模块用于存储多个任务共用的堆栈;所述共用堆栈控制模块用于在接收切换任务的指令后,将当前运行任务的现场数据存放在...

【专利技术属性】
技术研发人员:艾国
申请(专利权)人:北京中星微电子有限公司
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1