打印

Small RTOS51是怎么管理堆栈的?

[复制链接]
1988|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Small RTOS51把所有的内部自由RAM空间分配给当前任务。为了顺利进行堆栈变换,Small RTOS51定义了一个数组OSTaskStackBotton保存所有任务堆栈的顶端和底端位置。它的定义如下:
uint8 idata *OSTaskStackBotton[OS_MAX_TASKS+2];  //任务堆栈底部位置。
这三个图系统假设有三个任务。因为OSTaskStackBotton[x]为字节宽度,所以,当IDATA_RAM_SIZE为0x100时,OSTaskStackBotton[OS_MAX_TASKS+2]=0。
为什么要这样做呢?只是因为51系列单片机内部RAM小,通过中断切换任务要保存的内容我(最少17个;R0~R7,A,B,PSW,DPTR和PC),全局变量和局部变量还要使用一些,寄存器组还要占用一些。若不把所有空闲RAM分配给当前任务作堆栈,则堆栈几乎肯定溢出,故只好以时间换空间。。

cccc.jpg (17.8 KB )

cccc.jpg

aaaa.jpg (20.65 KB )

aaaa.jpg

bbbbb.jpg (20.58 KB )

bbbbb.jpg

aaaa.jpg (20.65 KB )

aaaa.jpg

相关帖子

沙发
Hello_LeeHom|  楼主 | 2011-2-12 18:52 | 只看该作者
uint8 idata *OSTaskStackBotton[OS_MAX_TASKS+2];
请问这个指针数组中是任务堆栈的栈底指针?还是任务堆栈的栈底和栈顶都存放在里面?
如果是,栈底和栈顶都存放在里面,为什么这个指针数组只定义了OS_MAX_TASKS+2个单元。。而每个任务的栈顶和栈底 不是需要两个单元来存放吗?就应该是OS_MAX_TASKS的两倍。

在任务切换时,每一个任务又怎么能找到属于自已的栈底和栈顶指针呢?

使用特权

评论回复
板凳
Hello_LeeHom|  楼主 | 2011-2-12 20:15 | 只看该作者
哦=基本上看明白了、下一个任务的栈底指针就可以做为相连的上一个任务的栈顶指针。
OSTaskID保存着当前任务的ID、OSNestTaskID保存着将要运行任务的ID、
但是在 C_OSCtxSw()函数中有三个判断,然后根据判断结果,移动堆栈内容。
这三个判断是:
OSTaskID>OSNestTaskID?
OSTaskID<OSNestTaskID?
OSTaskID=OSNestTaskID?

OSNestTaskID是将要运行任务的ID,也就是就绪表中的最高优先级的任务。
那么OSNestTaskID一定是小于或者等于OSTaskID。不可能大于OSTaskID、因为它大于的话,那么它就不是就绪表中优先级别最高的任务了。为什么这里还有这么一个判断语句呢?

使用特权

评论回复
地板
Hello_LeeHom|  楼主 | 2011-2-12 21:27 | 只看该作者
哦,光研究中断退出时的函数去了、任务调用OSWait()函数将自身挂起时那个任务调度函数也要调用这个堆栈变换函数。在那里可能有OSTaskID<OSNestTaskID这种情况。

使用特权

评论回复
5
coody| | 2011-2-12 23:52 | 只看该作者
SMALL RTOS51将暂时不运行的任务的堆栈移到一起连续分布,给当前任务最大的堆栈空间,以时间换空间,所以切换时间比较长。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

126

帖子

1

粉丝