1. 程式人生 > >uCOS入門學習的個人理解

uCOS入門學習的個人理解

      根據老師的推薦,主要參照《嵌入式作業系統基礎μC/OS-Ⅱ和Linux》《嵌入式實時作業系統μC/OS-II原理及應用》這兩本書,後者對學生更友好點,我主要使用前者,多點內容。

   從程式碼的角度μC/OS-II只有彙編和C語言。二者都不難,只是有一個問題,我每一個程式碼片段都能看懂,卻還是覺得複雜而無從理解。這裡就是我覺得最重要的理解主旨了。

    一旦我們陷入書中的程式碼解釋的汪洋大海,即使μC/OS-II的程式碼量也會讓人厭煩。這裡就要扯到程式碼這種東西,實際上是不需要自己寫出來的。很多時候我們要做的就是知曉有某種作用的程式碼在哪裡可以找到。對於μC/OS-II一句話的概括就能記熟:

μC/OS-II是一種小型嵌入式作業系統,它只提供了任務管理、任務的通訊同步和簡單的儲存管理三項基本服務。

    這三個功能是作業系統最為基礎的功能。瞭解μC/OS-II,或者別的作業系統。只要從這些功能要怎樣實現去推測,然後看原作者的方法,就能理解其功能了。

任務管理

  1. 實現多工:在μC/OS-II中,用了一個延遲函式OSTimeDly()將處理器的使用權交回給作業系統。延時正好用於別的任務。
  2. 建立/刪除/掛起/恢復任務:都是簡單的呼叫相應函式。傳入函式的地址(函式名)、引數、堆疊棧頂指標、優先順序。用來影響任務控制塊。
  3. 任務控制塊:一個結構體陣列,每定義一個任務的相關資訊(一個結構體)都會寫入這裡,再組成連結串列。同時系統也是根據連結串列來尋找任務(並非遍歷連結串列,而是根據一張按優先順序排序的陣列,陣列指向相應塊)(實時要求,使得在這個系統中常使用表來完成查詢操作,耗時可預測)。
  4. 任務就緒表:使用一張表來記錄對應優先順序的任務是否就緒。通過另一張表查詢變得簡單而可預測(這些表都是算出上一張表的值,然後直接用值對應出優先順序,簡單卻巧妙的方法)。

任務通訊同步

    當不同的任務同時(因為多工的存在)對一個資源進行操作時,會造成混亂。為了避免這種情況,產生了任務同步(同步其實是不衝突的意思)的需求。

  1. 訊號量:宣告一個標誌位,相關任務執行前查詢其值不為0方可用,使用時置0,使用後置1。
  2. 訊號量集:一個任務需要查詢多個訊號量,使用一個集合,並定義不同訊號量的相關關係(與或非什麼的)。

儲存管理

    對於記憶體管理,作業系統能夠保證記憶體得到釋放。沒有作業系統的管理,每一個任務如果涉及記憶體呼叫都要使用malloc()然後還要記得相應指標和釋放。作業系統簡化這個呼叫和釋放的步驟,並且可以為被刪除或是超時、記憶體溢位的任務善後。但是μC/OS-II除了簡化操作,貌似並沒有別的干預手段,聊勝於無。

  1. 將一片連續的記憶體空間,分割槽再分塊。由記憶體控制表來記錄。
  2. 使用一個請求函式來獲得記憶體。
  3. 使用完成,呼叫釋放函式。