輪詢系統:即在裸機編程時,先初始化相關硬件,讓主程序在一個死循環裏面不斷循環,順序地處理各種事件。不能說輪詢是低端的,輪詢系統是一種非常簡單的軟件結構,但適用於僅需要順序執行代碼且不需要外部事件來驅動就能完成的事情,這會變得簡單可靠。
int main()
{
/* 硬件初始化 */
HardWareInit();
/* 進入輪詢 */
for(;;){
fun1(); //順序程序1
fun2(); //順序程序2
fun3(); //順序程序3
}
return 0;
}
缺點:如果加入按鍵操作等需要檢測外部信號的事件,整個系統的實時響應能力就會體現不好。試想一下,但按鍵按下時,程序正在運行順序1程序,而且順序1程序佔用的程序時間片比較長,系統就有可能錯過對按鍵的檢測(直到按鍵鬆開),實時性極差,用戶無法接受。
前後臺系統:相比輪詢系統,前後臺系統在輪詢系統的基礎上加入了中斷的概念,外部事件的響應在中斷裏面完成,事件的處理還是回到輪詢系統中完成,中斷我們稱之爲前臺,main()函數中的無限循環稱爲後臺。
void isr(){}
int main()
{
HardWareInit();
/* 註冊中斷 */
isrregister(isr);
for(;;){
fun1();
fun2();
fun3();
}
return 0;
}
在順序執行後臺程序時,如果有中斷,那麼中斷會打斷後臺程序的正常執行流,轉而去執行中斷服務程序,在中斷服務程序中標記事件。如果事件要處理的事情很簡短,則可在中斷服務程序裏面處理,如果事件要處理的事情比較多,則返回後臺程序處理。通過中斷可以大大提供程序的實時響應能力,避免造成外部事件的丟失。
多任務系統:相比前後臺系統,多任務系統的事件響應也是在中斷中完成的,但是事件的處理是在任務中完成的。在多任務系統中,任務與中斷一樣,也具有優先級,優先級高的任務會被優先執行。但一個緊急事件在中斷中被標誌之後,如果事件對應的任務優先級足夠高,就會立刻得到響應,相比前後臺系統,多任務系統的實時性又被提高了。
void task1(){}
void task2(){}
void task3(){}
int main()
{
HardWareInit();
/* 註冊中斷 */
isrregister(isr);
/* RTOS初始化 */
RTOSInit();
/* RTOS調度啓動 */
RTOSStart();
return 0;
}
在多任務系統中,程序的主體會分割成一個個獨立的、無限循環且不能返回的任務,每個任務都是獨立的、互不干擾的,而且具備自身的優先級,由操作系統調度管理。整個系統的額外開銷就是操作系統佔據的少量FLASH和RAM,但是對於現在的片上資源,已經是微不足道。
1)輪詢系統:主程序
2)前後臺系統:中斷+主程序
3)多任務系統:中斷+子任務