|
发表于 2009-3-19 14:58:37
|
显示全部楼层
唉,都想证明自已是牛人,当然会吵起来啦.
从讨论上看得出来楼主的OS里是用切换栈指针的方式来切换堆栈,而现场保护用的是完全保护,这两种方式合起来用命中注定会费大量内存,而如果再开启中断,每个任务栈里都要再加最少2字节断点.
解决的方法是
1.使用公栈方式,即所有任务在运行态时用的堆栈地址都是相同的,任务被换出时,将堆复制到私栈中,任务换入时,从私栈中拷贝内容到公栈中,然后在函数嵌套较浅处切换任务,这样就无需担心私栈容量过小,内存占用也就小了.这是目前很多内存紧张的单片机上(比如51)用得较多的方式.
2.任务切换使用不完全现场保护.
现场保护分为寄存器保护和堆栈保护.不完全保护指的是只保护堆栈,不保护寄存器.
中断期间现场完全保护是不可省的,留到后面讨论.先说任务切换时的现场保护:
寄存器和覆盖变量在未使用完时就进行任务切换将会丢失上下文,反过来说,只要不使用寄存器和变量内存覆盖技术,切换任务时就不需要保护上下文.但取消变量的内存覆盖将会占用过多的内存,因些还需要用到下面一项"技术":
3."局部变量生命周期控制",这里所说的局部变量当然是指寄存器变量以及未使用内存覆盖的变量.只要在使用完变量后切换任务,就不存在保护的问题,这样,私栈长度可以大大缩短.
4.中断保护会占用大量内存,但如果你采用的是活动任务共用公栈方式,并且使用协作式多任务模式,则中断不需影响到私栈的长度,因为任务被换出时,中断必定已经结束.
结合以上4种方式,私栈长度可以缩到非常短.当任务切换速度要求较高时,可以取消公栈,这会导致私栈长度大幅增加,但任比不使用以上任务手段时要短.
本人愚见,与其说OS是一门技术,不如说是一门艺术,根据应用的特性灵活组合以上的方式,现场构建操作系统,是51及低端AVR的"唯一"有实用价值的方式.想在这样的单片机上采用泊来主义生搬硬套主流操作系统,不说其性能如何,光是内存占用就是无法解决的问题. |
|