經過一段時間的學習,對系統的任務切換算是有了那麼一點點的認識吧,只所以寫這篇文章,是因為我想對自己的一些見解做乙個備忘,如果看到這篇文章的人,覺得我說的有什麼不對,那麼請指正,我會感激不盡的。其實這也是為什麼很多系統選擇開源的原因吧,希望蒐集廣大共同學習者的意見,大家共同提公升。
首先說一下這個任務排程函式os_sched (void)吧,任務排程函式的的主要任務是找出優先順序最高的任務,然後觸發pendsv中斷。而真正的任務任務切換,進行偷梁換柱就是在pendsv的中斷函式裡面完成的,在這個中斷函式裡面,主要進行任務的進棧和出棧,把cpu裡面的暫存器內容換掉,即把事發當場的現場改變成要切換任務的現場,在中斷進行返回的時候好讓另外乙個任務執行。這就是所謂的任務切換。。。
然後os_sched (void)函式主要被那些函式進行呼叫呢?在任務要給任務排程器開鎖的時候會呼叫os_sched (void),在時鐘節拍中斷服務函式中返回時也會呼叫os_sched (void),還有在某個任務的執行過程中建立乙個任務,os_sched (void)也會被呼叫,刪除任務的時候也會呼叫os_sched (void),改變任務優先順序的時候,掛起任務,恢復任務等等,......,因為ucos是乙個實時的搶占式系統,總是執行最高優先順序的任務,所以當要進行任務切換的時候,就會呼叫os_sched (void)。
還有乙個問題是,在osstart()中,啟動多工的時候,也觸發了乙個pendsv中斷,那麼這個是不是任務切換呢?在我的理解當中,我個人覺得,其實這也是一次任務切換。
ucosii任務切換
osctxsw 和osintctxsw osctxsw 是任務優先順序切換函式,它的作用是先將當前任務的cpu現場儲存到該任務的堆疊中,然後獲得最高優先順序任務的堆疊指標,並從該堆疊中恢復此任務的cpu現場,使之繼續執行,該函式就完成了一次任務切換。osintctxsw 是中斷級的任務切換函式。由於...
uCOS II任務機制
1 任務是乙個無返回的無窮迴圈。uc os ii總是執行進入就緒狀態的最高優先順序的任務。2 任務是如何排程 切換 的?因為uc os ii總是執行進入就緒狀態的最高優先順序的任務。所以,確定哪個任務優先順序最高,下面該哪個任務執行,這個工作就是由排程器 scheduler 來完成的。任務級的排程是...
uC OS ii在M3中的任務切換與任務堆疊
1.1 m3入賬序列 1.2 加上手工入棧序列 systick為嵌入到核心中,優先順序比一般中斷優先順序高。若在一般中斷的isr執行過程中,發生了systick異常,則systick會搶占該isr。若此時systick做上下文切換,在m3中將觸發用法fault 在中斷活躍時嘗試切入執行緒模式 即使在...