搜索
bottom↓
回复: 8

菜鸟对ucos任务切换的疑惑,请侠客们指点!

[复制链接]

出0入0汤圆

发表于 2010-7-29 15:35:58 | 显示全部楼层 |阅读模式
在任务级切换时用OSTaskSuspend主动挂起一个任务时,设置好相应的操作(如:就绪表中删除)后,调用OS_Sched()进行任务调度,查找最高权限就绪任务等相应操作后,再正式调用OS_TASK_SW()进行任务的切换.好像这时才把此时的寄存器状态值(PC,lr等)压入栈中当作为被挂起任务的栈数据,供下次换醒该任务回复各寄存器值继续运行.

我疑惑的是,在压栈保存寄存器状态值的这个时间点时,PC已经跳了很多,先调用OSTaskSuspend挂起后跳转OS内核去执行挂起操作和OS_Sched()调度,然后再调用OS_TASK_SW(),我的理解时,这时都跳出任务程序到内核程序执行了很久了才保存寄存器状态值当作为被挂起任务的现场值.所以我感觉此时保存的不是挂起任务现场值.

请问各位,主动挂起的任务是不是这样的运行过程.要怎么来理解这时的寄存器保护现场过程.
谢谢!!!

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-7-30 14:57:01 | 显示全部楼层
我也正在研究uC/OS,可以加我QQ(1367331530)一块研究吗?

出0入0汤圆

发表于 2010-7-30 15:57:30 | 显示全部楼层
回复【楼主位】jsjlj
-----------------------------------------------------------------------

在OSTaskSuspend(..)函数中有下边一句话:
if (self == TRUE) {                                       
        OS_Sched();
        }
意思是当挂起的是当前任务时,进行任务就绪调度,在这之前是把当前任务从就绪表中删除,但没执行任务调度函数OS_Sched()之前,CPU控制权还在当前任务中。

在函数OS_Sched()通过
y   = OSUnMapTbl[OSRdyGrp];         
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
得到就绪任务表中的最高优先级任务的优先级,
然后通过
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
把要执行的最高优先级任务放到最高优先级任务控制块中。

最后调用
OS_TASK_SW()
函数把CPU控制权交到最高优先级任务控制块中的任务并进行相应的入栈出栈操作,之后就进入最高优先级任务中执行。

我是这样理解的,不知道其他大侠的高见是、、、期待一起讨论

出0入0汤圆

 楼主| 发表于 2010-7-30 17:08:01 | 显示全部楼层
非常感谢楼上的兄弟,这种运行的脉络顺序我基本知道,我的疑惑是:
我理解任务主动挂起后调到OS_Sched时,运行的程序是属于内核程序(因为OS_Sched是内核代码),然后继续调用OS_TASK_SW()再进行保持现场状态进行切换,所以我感觉好像是保存了内核的运行现场状态!

可能我这种理解是不正确的,可能人为的从代码结构去分,此时的运行是属于在哪个范畴(任务或内核).

但实际相当于一般的函数调用,即进入OS_Sched()了,但它还是属于当前任务的程序在执行.
是不是这样呢?!

出0入0汤圆

发表于 2010-7-30 17:12:48 | 显示全部楼层
回复【4楼】jsjlj
-----------------------------------------------------------------------

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3289675&bbs_page_no=1&bbs_id=3004
看看这个

出0入0汤圆

发表于 2010-9-1 11:09:49 | 显示全部楼层
ucos没有像linux那样区分内核程序和用户空间程序,在OS_Sched中调用OS_TASK_SW()后保存现场状态并进行切换,就是保存程序运行到OS_TASK_SW时各种特殊寄存器值和栈指针,当下一次任务切换回来时,会接着运行OS_Sched没有执行完的部分,并从该函数返回,这样就回到原来的任务里执行了,在任务看来,就是执行了OS_Sched这样一个函数,只是该函数会可能切换到其它任务去。

出0入0汤圆

发表于 2010-9-4 09:01:46 | 显示全部楼层
6楼说的对。

出0入0汤圆

发表于 2010-12-14 11:05:40 | 显示全部楼层
回复【6楼】simonccn
-----------------------------------------------------------------------

在看任务切换的时候,发现在OSIntExit()中调用了OSIntCtxSw()切换,而该函数中有将PC指向待运行的任务,这样的话,OSIntExit()中的最后一句指令OS_EXIT_CRITICAL()就不能够执行,按照上面的说法,将先执行待运行任务,后再切换到
OSIntExit()继续执行OS_EXIT_CRITICAL()然后才能退出中断退出函数了,可是这样的话,在执行待运行任务时,不就相当于临界段了么?不知道我这么理解对不对,给个链接,关于该问题的,请大家不啬赐教。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4452318&bbs_page_no=1&bbs_id=3004
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 12:07

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

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