搜索
bottom↓
回复: 3

SMALLRTOS任务切换的问题,求释疑

[复制链接]

出0入0汤圆

发表于 2012-11-7 22:01:23 | 显示全部楼层 |阅读模式
最近在看SMALLRTOS移植到AVR得一些资料,任务切换的时候怎么也搞不懂
问题1; 执行任务切换时,入栈PC,32个通用寄存器,状态寄存器,中断计数器,但如果使用了比较多的局部变量保存在SRAM中(书上说优先使用寄存器,但也会用到RAM),这些临时数据怎么保护的?
问题2;如果只入栈以上内容(PC2字节,寄存器32字节,状态1字节,中断计数器1字节,共36字节),人工堆栈设定OS_STACK_SIZE后,初始化的时候是每个任务之间的堆栈是连续的,那是不是确定了任务的个数,就可以确定人工堆栈的大小了

实在没弄懂,求解答

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-11-8 08:23:27 | 显示全部楼层
自己顶。。。

出0入0汤圆

发表于 2012-12-18 18:04:58 | 显示全部楼层
没有看过你看的资料。用51的small rtos原理解释下;

small rtos中任务A切换到任务B有4中情况:
情景1,任务A主动放弃CPU,切换到任务B,任务B以前是主动放弃CPU的;
情景2,任务A主动放弃CPU,切换到任务B,任务B以前是被抢占CPU的;
情景3,任务A被中断抢占,切换到任务B,任务B以前是主动放弃CPU的;
情景4,任务A被中断抢占,切换到任务B,任务B以前是被抢占CPU的;

任务A主动放弃CPU的流程为:
Task1() ---> ...  -->  OSWait() -->  OSSched() --> OSCtxSw() --> LoadCtx()

由于C51编译器在编译C语言程序时,如果发现一个函数调用了另外一个函数,就认为这个函数返回时,  
R0~R7、ACC、B、PSW、DPH、DPL等寄存器已经变化。因此他不会在调用这个函数前用这些寄存器
保存有用数据,外部函数返回时这些寄存器是任何值都不会影响程序执行。所以通过主动函数调用完成
放弃CPU的,那么该任务在恢复时所需要的环境都在堆栈里,只要换回原来的堆栈就可以切换回来。

这个情况下,任务A停在了OSSched里OSCtxSw调用的后面,因为调用OSCtxSw将导致任务A的栈顶保存 LCALL OSCtxSw的返回地址
,而OSSWCtx修改了SP指针,使指向目标任务栈顶;在执行LoadCtx装载目标任务的堆栈后,RET返回就到了目标任务。

任务A被中断抢占:
断点地址入栈(任务A的堆栈)--->  C51中断函数压栈13个寄存器 ---> 中断处理  --> OSIntExit()  --> OSIntCtxSw()
任务A被停在了中断的断点。

返回到主动放弃CPU的任务B;这个很简单,由上述,修改SP指针执行目标任务的栈顶,RET即可。

返回到被抢占的任务B:修改SP指针执行目标任务的栈顶,恢复17个寄存器(压栈13个,2层函数调用),RET。

好像写的有点乱。





出0入0汤圆

发表于 2012-12-18 20:10:54 来自手机 | 显示全部楼层
学习学习.....
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 04:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表