實時操作系統的靈魂----調度器
實時操作系統廣泛應用於工業控制、無人飛機、機器人、航空航,但是學習這些少則幾千行,多則幾萬行代碼,讓非計算機專業的同行們感覺有點望而卻步,事實不是因為一些項目的推動就一般的前後台架構對付一般的小項目也足夠了,所以很少會有人主動去用實時系統做項目,下面這篇文章主要是挑起你對實時系統的興趣,並讓你為學習實時系統打好基礎練,練好內功心法,讓你快速深入了解實時系統運作的原理,先文章先暫傳4頁,之後會繼續把剩餘全部上傳,我會把最歡迎各位同行討論,當然同時也能希望收到更多的贊.....
在介紹最小實時系統之前,首先介紹下計算機或微處理(控制)器主流的操作系統。
桌面系統: 如微軟的windows 7,10、蘋果的Mac OS X大家都在用也比較熟悉不在多說。
嵌入式系統: 它是包含一種可編程計算機(微處理器、微控制器、DSP)的控制系統,它包括事件觸發系統與時間觸發系統,它可以是複雜的應用于飛機的控制的快速響應的實時系統、它也可以是一段有超循環代碼構成的簡單代碼的遙控小車的控制系統、它也可以是特殊的信息系統等等。
在民用、工業、軍工都有大量的應用,比如智能手機、電視機、智能吸塵器、以及各種工業控制設備、飛機、導彈、衛星等等,它的使用量遠遠超過了你所熟悉的桌面操作系統,凡是用到微處理器、微控制器、DSP電力電子設備都需要嵌入式系統,事實上多數時候我們的嵌入式系統往往是比較簡單的一段程序、一個超級循環、或者稍微高級點用個中斷服務程序實現前後台的架構,也就是說並沒有使用實時操作系統,我們稱這種為裸跑。
為什麼使用實時操作系統?實時操作系統一定比前後台架構可靠嘛?
比如做個微逆變器,我可以用前後台程序直接搞定,也可以用實時操作系統去跑,但到底是用裸跑還是用實時系統穩定呢?這還真不好說,這主要項目難度和要求了,對於一般的簡單控制系統,如果你編程技術過關,使用前後台可能會比使用實時操作系統更可靠,但是在運行複雜的系統的時候,比如大於一定數量多任務控制系統,而對各任務的執行時間又有明確性的要求,同時又考慮程序後期升級維護與管理,這個時候使用實時操作系統會顯得很有必要了,尤其是當做一個大的項目的時候,各個任務模塊的程序可以有多人獨立來完成,這樣有利於加速項目進程,快速完成項目,另使用實時系統對產品的後期功能擴展更新與維護管理也將會帶來很大的方便。
實時操作系統:目前主流的實時操作系統有VxWorks、uC/OS II、RT-Linux、QN、XeCos、FreeRTOS…等等,主要應用都是對系統要求比較高、響應迅速、對任務運行有時間確定性要求的系統,具體應用比如:工業控制、交通管理、機器人、航空航天,比如美國NASA裝有多個處理器的好奇號火星無人車,就用了VxWorks、uC/OS II兩種實時系統。
但是學習這些少則幾千行,多則幾萬行實時系統是需要一定的基礎與學習時間,這讓從沒接觸實時操作系統,本身又不是計算機專業的同行們,望而卻步,實際上你沒有個把月還真不能算入門實時操作系統,我們都知道現在干這行的尤其是在小公司,一個人需要跨好幾個專業的,干著大公司多個人的工作,電路能設計、PCB繪製、底層代碼也自己寫,平時都比較忙,所以沒有那麼多的時間與精力學習,同時由於做的基本上是一些小項目,比如寫一個簡單的觸摸檯燈控制、太陽能充電控制器等等,這一般的前後台架構足以勝任,這又使主動學習實時操作的那股勁就大大的減弱了。
那麼有沒有一個比較小的簡單的實時系統?它的代碼量不大,幾百行,它的難度也不大,能讓你在1到2天之內快速掌握它,同時也能快速深入領悟實時操作系統的精華,讓你有興趣去學習實時操作系統?有,當然有….那就是英國Michael J.Pont寫的《時間觸發嵌入式系統設計模式》,這本書我買了好幾年了,一直沒細看,最近看了遍,第一發現這本翻譯的書,錯誤不少,英文原版的代碼風格讓人受不了,大量注釋與代碼混淆在一起,所以翻譯的也照抄,讓人感覺凌亂,也許是這個英國人編寫代碼風格我真的不喜歡,我還是喜歡注釋在右邊的,但這本書的內容,不得不說是本入門好書,尤其是軟體篇,它能讓你真正學習到實時操作系統核心的內容,你直接看實時操作系統不一定能懂,但是看過這本,再去看其它實時操作系統,我想應該有比較深入的理解了,尤其是對實時系統的調度器的理解。
那麼什麼是調度器?
● 首先調度器可以看作是一個簡單的操作系統,允許以周期性或單次方式調度任務。
● 從底層看,調度器實則是一個多個不同任務共享的定時器中斷服務程序。
● 調度器分為:合作調度器、搶佔調度器和混合調度器。
● 所有的實時操作系統都有一個調度器。
不同的實時操作系統用了不一樣的調度方式,但是基本上跑不出下面這三種調度方式,分別是:合作調度器(不可剝奪型調度器)、搶佔式調度器(可剝型調度器)、混合式調度器。
前麵食堂買菜的例子如果只排兩隊,選菜隊伍與觀察隊伍,超過給定選菜時間,就跳到觀察隊伍,這其實說的就是合作調度器,而排三排有了快速隊伍,這明顯是搶佔任務了屬於搶佔式調度器了。
而混合調度方式就是合作與搶佔並存的調度演算法相對而言比較複雜,本筆記介紹可預測、可靠性比較高的合作調度器。下面講的是8051調度器,定時中斷與睡眠指令改動後完全適用任何MCU。
合作調度器
合作調度器提供的是一種單任務的系統結構,可靠可預測性原因就是因為在任何時刻只有一個任務運行直到運行完成,然後運行的次數與時間有調度器控制。
(1)任務在設定的時刻以周期性或單次運行方式被被調度執行。
(2)當任務需要運行時,需添加到任務隊列等待。
(3)當CPU空閑時,運行等待任務隊列中的下一個任務(如果有的話)。
(4)這種調度器非常簡單,只需少量代碼即可實現。
(5)調度程序一次只能為一個任務分配內存。
(6)該調度器有全部有C語言實現。
▲ 調度器主要有以下部分組成
● 調度器數據結構和最大任務數有用戶根據項目設定
● 初始化函數
● 調度器刷新函數----中斷服務程序—>ISR,用來以一定的時間間隔(時標)刷新調度器
● 添加任務函數,向調度器增加任務的函數。
● 刪除任務函數,從調度器刪除任務的函數,不是所有系統需要刪除任務函數。
● 使任務在設定的時間內被執行的調度函數。
● 狀態報告函數,用來顯示錯誤代碼的簡單函數。
● 睡眠函數,使微控制器進入空閑模式或節電低功耗的模式。
● 調度器數據結構和最大任務數有用戶根據項目設定
(1)調度器的數據結構
其實調度器的核心就是下面這個數據結構,這個數據結構是根據你自己項目需求進行擴展添加
typedef data struct
{ void
(code * pTask)(void); //這是一個指向任務的函數指針tWord Delay; //任務與任務之間的延時(時標)
tWord Period; //周期運行任務的間隔(時標)
tByte
RunMe; //當然需要被運行時的標誌位(有調度器在中斷服務里加1)} sTask;
注意:每一個任務的數據結構都基本都是一樣的。
(2)最大任務數定義在sch51.h文件中設定如下,一個任務填1,2個任務填2,以此類推。
#define
SCH_MAX_TASKS 1推薦閱讀:
※【機器視覺】9. 小結
※揭秘現實中的「拆彈專家」:遊走在死亡邊緣的安全衛士
※2018年世界無人帆船錦標賽將在英國南安普頓舉辦
※選購工業機器人力矩感測器的五大黃金法則
※當你還在攢錢買樂高玩具時,有人已經用樂高機器人做早飯了??