-
精辟,实在感谢。看问题果然要耐心细致,非常感谢。
-
其实想问的正是这一句,如果将OSSchedUnlock()放到OSTaskSuspend(B)之后,那这一句还会不会执行呢?挂起任务后是不是之后的语句都不会执行了呢?也就是说,实际上OSTaskSuspend(B)挂起自身后又没有来得及执行OSSchedUnlock(),所以程序无事可做,可能会死掉。这样理解对吗?谢谢指点
-
非常感谢juntianya的回复。本来已经隔了几天没看这个论坛了,没想到您还是热心的帮我解答问题,非常感谢。事实上也的确是你说的那个问题,我颠倒了一下顺序就好了。非常感谢。现在还是有一个问题希望请教。我是三个任务来回切换,例如说A、B、C,切换有两种可能,中断或者是任务中设置条件满足。现在问题来了,有这种情况,在任务B运行过程中(此时A、C都没有运行) if(满足条件) { OSTaskResume(A);//解除任务A的挂起状态 OSTaskSuspend(B);//挂起当前任务B }这种情况下,解除A的挂起状态时运行过OSSched(),因为A的优先级高,所以直接切换过去运行A,等到A中运行到OSTimeDly()这一块,又转回来运行B,然后发现B需要挂起,有点绕远路的感觉。我觉得这个过程有点麻烦,有没有什么方法能先解除A的挂起,再挂起B,然后才运行调度函数,进行任务切换。我的想法是 if(满足条件) { OSLockNesting++; OSTaskResume(A);//解除任务A的挂起状态 OSLockNesting++; OSTaskSuspend(B);//挂起当前任务B }这样子就能保证先解除A的挂起状态同时不进行任务切换,留到挂起B的时候再进行任务切换,你觉得这样合适吗?谢谢!
-
也许是我太愚钝了,还是不太明白。为什么OSTCBFreeList的值为0时就意味着已经没有空余TCB了呢?初始化时不也是为0吗?
好的,谢谢你的指点。我还是回去再琢磨琢磨代码吧。
-
很感谢你能够耐心给我指点,抱歉还是不太明白,请允许我再多问几句。如果说“空余”的TCB应该非零,那么为什么初始化时要清零呢?假如我初始化后直接建立一个任务,岂不是就立即失败。初始化函数OSInit()之中将所有的TCB控制块清零,同时OSTCBFreeList指向第一个控制块,此时应该是零吧?然后我建立一个任务OSTaskCreate()之中会调用OS_TCBInit(),这个函数中会检验是否存在剩余的控制块,如果发现ptcb == (OS_TCB *)0,应该会报错吧?
这是我的理解,不知道哪里出问题了,请指教。
还有我知道OSTCBTbl和OSTCBPrioTbl是两个不同的控制块,前者是按照创建任务的顺序排布的,大小根据最大任务数,后者则是按照优先级排布的,大小根据最大任务优先级数,但是初始化函数中这两个均置零了,为什么判断是否仍有空余时不同呢?
恳请指教,谢谢!