资源描述:
《uCOSII任务栈处理的一种改进方法》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、一匹/051任务钱处班的一种改进方法.合肥工业大学彭良清,,在pc/05一工I内核中各个不同的任务使用独立的堆栈空间堆栈的大小按每个任务所需要摘要,。的最大堆钱深度来定义这种方法可能会造成堆栈空间浪费本文叙述如何在RToS中多个任务共用连续存储空间作为任务栈的方法,并详细比较二者的优缺点和适用性。关键词pe/05一11任务堆栈RTOS共用空间堆钱一关于pC/05H这个实时内核及其应用已经有个任务所需要的最大堆栈深度来定义,这种方法可,,很多文章介绍了对于学习RTOS的人来说这个能会造成堆栈空间的浪费。下面讨论如何
2、在RT0s系统是很好的学。。习起点虽然文献[l]的源代码没有中多个任务共用一段连续存储空间作为任务堆栈行号和函数名交叉索引表等,给源代码阅读造成一1任务切换要保存的数据些困难(可使用Bc31的grep查找功能,提高阅读,效率),好在代码不是很长,前面又有详细的中文简单地说一个任务可看作一个运行中的C函。,,说明,对于有一定X86汇编和C语言基础的人来说,数对于抢先式RTOS来说在任务切换时应保。仍然可以在不长的时间内掌握。存当前任务的各种现场数据现场数据包括局部·、一,CPUpC/05H内核是一个抢先式内核可以进
3、行任变量各个寄存器堆栈指针和程序被中止。务间切换,也可以让一个任务在得不到某个资源时的位置指针CPU寄存器是任何任务代码均会用,;休眠一定时间后再继续运行;提供了用于共享资到的而局部变量一般的编译器是将其安排在,,源管理的信号灯,用于进程通信的消息队列和邮堆栈空间中堆栈指针也是各任务公用的所以也。箱,甚至提供了存储器管理机制,是一个比较全面需要保存,的系统。对于全局变量由于一般是在内存中的固定,,一,pC/051内核有些地方仍然值得改进比如该位置各任务所占用的空间完全独立所以不需要。系统不支持时间片调度(见文献[
4、l],P39)。如果有保存一个任务中有一段死循环代码(或者条件循环代在X86环境中,要保存的CPU寄存器共14个16、、、、码),代码就会永远(或长时间)在此处执行,调位寄存器:通用寄存器8个(AXBXCXDX、、、、、、、度程序无法控制,其它任务也就得不到及时执行。SPBP51BI)段寄存器4个(CSDSES这种抢先式系统实际上和非抢先式系统(文献[2])55)以及指令指针IP和标志寄存器FR各1个。存在着同样问题。当然,如果这种代码不是一个ZC编译器中变量在堆栈中的位置[3]BUG,问题是可以解决的,在不提供
5、时间片调度的C,抢先式系统中,,对于一个存在函数调用嵌套的程序来说大一般采取信号灯或者任务主动休pC/05一,部分编译器将传递的参数和函数本身的局部变量放眠的方法(对于H很容易改造成支持时间,push,OSIn在了堆栈中编译器会自动生成压栈()和弹片调度只要在定时中断服务程序调用tCtxsw栈(pop)代码,以保存上级函数的运行寄存器。;()函数即可)非抢先式系统一般采取有限状态机ann,nillnZ方法,不使用这种耗时很长的循环代码。,假设函数m()调用fu()而九()调用九不过无,,nl论如何,对RTOS的使
6、用者来说,这毕竟会使得任()则在执行fu2()中的代码时堆栈映像如图X86CPU。务函数的编码不能随心所欲。所示(的情况)RT0s,pC/05一对于软件堆栈中的各种数据就是一个1内核的另外一个值得改进的地方就。CPUSP。一,任务的工作现场一般的堆栈指针只有一是其任务栈管理方法在“C/05H内核中各个,,,个在进行任务切换时必须将挂起任务所使用的不同的任务使用独立的堆栈空间堆栈的大小按每20牛喻翻J一入成旅性滋画...二蒸麒撇黝夔撇翼撇翼黔蒸蒸燃蘸森黝低端存储器栈顶堆栈内容占用字节数说明;保存挂起任务的堆栈指针S
7、PfonZ的局部变量参数,一CPU寄存器MOVES:[BX+2]55,返回加n1的地址(PC3)MOVES:[BX+0]SP调用九心的参数各部分占用堆栈的、l的局部变量参数(PC2)长度和具体代码Cfun,:CPU寄存器编译器有关LESBXDW0RDPTRDS高端存储器栈底返回majn的地址(PCI)_oSTCBHighyRd调用funl的参数;切换SP到要运行任务的堆栈空间图1函数调用嵌套时的堆栈情况,:+MOV55ES[BX2],堆栈内容保存起来以便使该任务在下次唤醒时能P,:MOVSES[BX]从原地继续运
8、行。,3pc/Os一日对任务栈的处理方法与缺陷在代码中变量osTCBHighRdy(05兀Beur)和堆栈指针变量OSTCBStkPtr的数值是相同的,因为一,pC/05H为了保存任务堆栈中的数据对每个。osTCBst沙tr是结构osTeBHighRdy的第一个分量任务定义一个数组变量作为堆栈,在任务切换时,这种任务栈处理方法的缺点是可能造成空间的CPUSP,将堆栈指针指