uc/os-ii 多工實現機制分析
前面已經說過,uc/os-ii是一種基於優先順序的可搶先的多工核心。那麼,它的多工機制到底如何實現的呢?了解這些原理,可以幫助我們寫出更加健壯的**來。由於我們面向的初級程式設計師,本文不打算寫成又一篇uc/os-ii的原始碼分析,那樣的文章太多了,本文打算從實現原理的角度**這個問題。
首先我們來看看為什麼多工機制可以實現?其實在單一cpu的情況下,是不存在真正的多工機制的,存在的只有不同的任務輪流使用cpu,所以本質上還是單任務的。但由於cpu執行速度非常快,加上任務切換十分頻繁並且切換的很快,所以我們感覺好像有很多任務同時在執行一樣。這就是所謂的多工機制。
由上面的描述,不難發現,要實現多工機制,那麼目標cpu必須具備一種在執行期更改pc的途徑,否則無法做到切換。不幸的是,直接設定pc指標,目前還沒有哪個cpu支援這樣的指令。但是一般cpu都允許通過類似jmp,call這樣的指令來間接的修改pc。我們的多工機制的實現也正是基於這個出發點。事實上,我們使用call指令或者軟中斷指令來修改pc,主要是軟中斷。但在一些cpu上,並不存在軟中斷這樣的概念,所以,我們在那些cpu上,使用幾條push指令加上一條call指令來模擬一次軟中斷的發生。
回想一下你在微機原理課程上學過的知識,當發生中斷的時候,cpu儲存當前的pc和狀態暫存器的值到堆疊裡,然後將pc設定為中斷服務程式的入口位址,再下來乙個機器週期,就可以去執行中斷服務程式了。執行完畢之後,一般都是執行一條reti指令,這條指令會把當前堆疊裡的值彈出恢復到狀態暫存器和pc裡。這樣,系統就會回到中斷以前的地方繼續執行了。那麼設想一下?如果再中斷的時候,人為的更改了堆疊裡的值,那會發生什麼?或者通過更改當前堆疊指標的值,又會發生什麼呢?如果更改是隨意的,那麼結果是無法預料的錯誤。因為我們無法確定機器下一條會執行些什麼指令,但是如果更改是計畫好的,按照一定規則的話,那麼我們就可以實現多工機制。事實上,這就是目前幾乎所有的os的核心部分。不過他們的實現不像這樣簡單罷了。
uc osII實時操作2
任何乙個作業系統都會提供大量的api供程式設計師使用,uc os ii也不例外。由於uc os ii面向的是嵌入式開發,並不要求大而全,所以核心提供的api也就大多和多工息息相關。主要的有以下幾類 任務類 訊息類 同步類 時間類 臨界區與事件類 我個人認為對於初級程式設計師而言,任務類和時間類是必須...
ucosii實時作業系統的任務排程
嵌入式作業系統的任務排程演算法好壞在很大程度上決定了該系統的執行效率,由於其執行的頻率極高,所以在任務排程函式的實現上,對於效率的要求可以用苛刻來形容。基於優先順序的任務排程總結下來就是做了兩件事 1 找到優先順序最高的就緒態任務 2 切換任務上下文並開始執行該任務 第二步的切換上下文對個各個rto...
嵌入式實時作業系統ucos ii 原理與應用(六)
第七章 動態記憶體管理 7.1 記憶體控制塊 c os 對記憶體進行兩級管理,即把乙個連續的記憶體空間分為若干各分割槽,每個分割槽分為若干個大小相等的記憶體塊。作業系統以分割槽為單位來管理動態記憶體,而任務以記憶體塊為單位來獲取和釋放動態記憶體。7.1.1 可動態分配記憶體劃分 1.記憶體塊 c o...