chandle2735 发表于 2012-11-7 22:01:23

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

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

实在没弄懂,求解答

chandle2735 发表于 2012-11-8 08:23:27

自己顶。。。

ifree64 发表于 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。

好像写的有点乱。





jz701209李 发表于 2012-12-18 20:10:54

学习学习.....
页: [1]
查看完整版本: SMALLRTOS任务切换的问题,求释疑