詳解FreeRTOS:嵌入式軟件系統架構(理論篇—1)
目前常見(jiàn)的嵌入式軟件系統架構有三種可以分為:輪詢(xún)系統架構、前后臺系統架構和多任務(wù)系統架構。
1
輪詢(xún)系統架構
輪詢(xún)系統架構是最簡(jiǎn)單的一種軟件結構,主程序是一段無(wú)限循環(huán)的代碼,在循環(huán)中順序查詢(xún)各個(gè)條件,如果滿(mǎn)足就執行相應的操作。
這種方案的好處是實(shí)現簡(jiǎn)單,邏輯清晰,便于開(kāi)發(fā)人員掌握。但是每個(gè)事件的查詢(xún)和處理時(shí)間是不能確定的,假如前面的操作時(shí)間較長(cháng),那么后面的操作必然會(huì )被延遲。
如下圖所示,假如步驟1操作需要很久,那么步驟2必然得不到及時(shí)處理,如果步驟2的工作很重要或者很緊急,那么系統的性能和響應能力就很差了。
示例偽代碼如下所示:
int main(void){ HwInit(); //初始化外設 while(1) { statement_1; //語(yǔ)句1 statement_2; //語(yǔ)句2 statement_3; //語(yǔ)句3 ...... } return 0;}
2
前后臺系統架構
相對輪詢(xún)系統架構,前后臺系統架構對外部事件的處理做了優(yōu)化,前后臺系統架構是由中斷驅動(dòng)的。
主程序依然是一段無(wú)限循環(huán)的代碼,稱(chēng)為后臺程序,而事件的響應則由中斷來(lái)完成,稱(chēng)為前臺程序。
在后臺程序執行時(shí),如果有外部事件發(fā)生,則前臺的中斷程序會(huì )打斷后臺程序。在完成必要的事件響應之后,前臺中斷程序退出并通知后臺程序來(lái)繼續操作,由后臺程序完成事件的后繼處理。
從代碼功能上講,事件的響應和處理分為了兩個(gè)部分。因為中斷自身有優(yōu)先級和嵌套的功能,所以?xún)?yōu)先級高的事件能夠得到及時(shí)響應。但后臺程序仍然需要按順序處理各個(gè)事件的后繼事務(wù)。
在中斷源之間有優(yōu)先級的概念,ISR會(huì )首先響應事件,簡(jiǎn)單的事件可以在ISR中直接處理,復雜的情況下則記錄下必要數據和狀態(tài)標記,等所有中斷處理結束后,將由后臺主函數按順序處理各個(gè)事件。也可以理解,事件的響應是支持優(yōu)先級的,但事件的最終處理卻是順序的。
使用中斷來(lái)代替輪詢(xún)方案中事件的查詢(xún)操作,對事件的響應能力有較大改善。
示例偽代碼如下所示:
int main(void){ HwInit(); //初始化外設 while(1) { statement_1; //語(yǔ)句1 statement_2; //語(yǔ)句2 statement_3; //語(yǔ)句3 ...... } return 0;} void interrupt_event(void){ statement_4; //語(yǔ)句4 return 0;}
3
多任務(wù)系統架構
相對于前后臺系統架構,多任務(wù)系統架構在響應事件的時(shí)候,同樣是由多個(gè)中斷處理程序完成的。但是對于事件的后繼操作則是由多個(gè)任務(wù)來(lái)處理的,也就是說(shuō)每個(gè)任務(wù)處理它所負責的事件。
在基于優(yōu)先級的多任務(wù)系統架構中,因為任務(wù)間存在優(yōu)先級高、低的關(guān)系,優(yōu)先級高的任務(wù)可打斷低優(yōu)先級任務(wù)的運行而取得CPU的優(yōu)先使用權,這樣優(yōu)先級高的事件就能及時(shí)得到處理;在基于分時(shí)機制的多任務(wù)系統中,任務(wù)間則按比例輪流占用處理器。
因為多任務(wù)系統架構允許將具體的應用系統分成若干個(gè)相對獨立的任務(wù)來(lái)管理,所以多任務(wù)操作系統的使用可以簡(jiǎn)化應用程序的設計,系統也變得簡(jiǎn)潔且便于維護和擴展。對實(shí)時(shí)性要求嚴格的事件都能得到及時(shí)可靠的處理。不過(guò)多任務(wù)操作系統自身將消耗更多的處理器、存儲器等硬件資源,這是引入多任務(wù)機制的必要代價(jià)。
示例偽代碼如下所示:
int main(void){ HwInit(); //初始化外設 OS_Init(); //初始化系統 OS_Start(); //運行內核調度 while(1) { ...... } return 0;} //任務(wù)1void task_1(void){ task_statement_1; task_statement_2; task_statement_3; OS_delay();} //任務(wù)2void task_2(void){ task_statement_1; task_statement_2; task_statement_3; OS_delay();} //任務(wù)3void task_3(void){ task_statement_1; task_statement_2; task_statement_3; OS_delay();}
4
區別
最后,對比一下三種嵌入式軟件系統架構的特點(diǎn)和區別,如下表所示:
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。