小弟刚接触ucos不久,刚看完任哲编著的ucos-II原理那本书,有一块不太理解。(下面内容比较多,希望能读完我的帖子:) 谢谢)
先看下面一部分代码
void MyTask (void *pdata){ pdata = pdata;
for (;;) { OSFlagPend(WFlag,(OS_FLAGS)3,OS_FLAG_WAIT_SET_ALL,0,&err); PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE); Quitkey(); OSTimeDlyHMSM(0,0,2,0); }}
//*****************************YouTask********************************************void YouTask (void *pdata){ pdata = pdata;
for (;;) { PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE); OSTimeDlyHMSM(0,0,8,0); OSFlagPost(WFlag,(OS_FLAGS)2,OS_FLAG_SET,&err); Quitkey(); OSTimeDlyHMSM(0,0,2,0); }}
//*****************************HerTask********************************************void HerTask (void *pdata){ pdata = pdata;
for (;;) { PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE); OSFlagPost(WFlag,(OS_FLAGS)1,OS_FLAG_SET,&err); Quitkey(); OSTimeDlyHMSM(0,0,1,0); }}
小弟是这么分析的:
1、Mytask请求的信号量无效,所以先显示youtask里的S2
2、接下来youtask延时8秒,进行任务调度显示hertask里的S3
3、接下来hertask延时一秒,往后每隔一秒钟S3显示一次(如此显示7次),一直到第八秒时,youtask的8秒延时到达—>返回到youtask—>发信号量——>延时2秒
4、接下来的任务调度中,mytask请求的信号量已全部有效,显示S1。然后mytask延时两秒
5、再接下来的任务调度显示hertask中的S3(几乎和上面的S1同时),hertask延时1秒后再次显示S3。
6、在接下来hertask再次延时1秒的过程中:
我的问题来了,
第一:根据上面分析,youtask先进行的2秒延时,那么他的2秒延时也应该先到达。但为什么运行的结果却是先运行的mytask呢??是我哪里分析错了啊?
第二:在上述的3中,youtask延时8秒后发信号量,那么是先延时2秒呢,还是立即就运行到之前被挂起的mytask中呢?
小弟对类似多任务之间的切换,尤其是涉及到临界时刻时就有点分析不清。还请版主指教!
[ 本帖最后由 idonotknow0914 于 2011-10-23 21:28 编辑 ]