博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 詳解FreeRTOS:嵌入式軟件系統(tǒng)架構(gòu)(理論篇—1)

詳解FreeRTOS:嵌入式軟件系統(tǒng)架構(gòu)(理論篇—1)

發(fā)布人:美男子玩編程 時(shí)間:2023-05-16 來(lái)源:工程師 發(fā)布文章

目前常見(jiàn)的嵌入式軟件系統(tǒng)架構(gòu)有三種可以分為:輪詢(xún)系統(tǒng)架構(gòu)、前后臺(tái)系統(tǒng)架構(gòu)和多任務(wù)系統(tǒng)架構(gòu)。

1

輪詢(xún)系統(tǒng)架構(gòu)

輪詢(xún)系統(tǒng)架構(gòu)是最簡(jiǎn)單的一種軟件結(jié)構(gòu),主程序是一段無(wú)限循環(huán)的代碼,在循環(huán)中順序查詢(xún)各個(gè)條件,如果滿(mǎn)足就執(zhí)行相應(yīng)的操作。

這種方案的好處是實(shí)現(xiàn)簡(jiǎn)單,邏輯清晰,便于開(kāi)發(fā)人員掌握。但是每個(gè)事件的查詢(xún)和處理時(shí)間是不能確定的,假如前面的操作時(shí)間較長(zhǎng),那么后面的操作必然會(huì)被延遲。

如下圖所示,假如步驟1操作需要很久,那么步驟2必然得不到及時(shí)處理,如果步驟2的工作很重要或者很緊急,那么系統(tǒng)的性能和響應(yīng)能力就很差了。

圖片


示例偽代碼如下所示:














int main(void){    HwInit();                //初始化外設(shè)  while(1)  {    statement_1;         //語(yǔ)句1    statement_2;         //語(yǔ)句2     statement_3;         //語(yǔ)句3    ......  }  return 0;}

2


前后臺(tái)系統(tǒng)架構(gòu)

相對(duì)輪詢(xún)系統(tǒng)架構(gòu),前后臺(tái)系統(tǒng)架構(gòu)對(duì)外部事件的處理做了優(yōu)化,前后臺(tái)系統(tǒng)架構(gòu)是由中斷驅(qū)動(dòng)的。


主程序依然是一段無(wú)限循環(huán)的代碼,稱(chēng)為后臺(tái)程序,而事件的響應(yīng)則由中斷來(lái)完成,稱(chēng)為前臺(tái)程序。


在后臺(tái)程序執(zhí)行時(shí),如果有外部事件發(fā)生,則前臺(tái)的中斷程序會(huì)打斷后臺(tái)程序。在完成必要的事件響應(yīng)之后,前臺(tái)中斷程序退出并通知后臺(tái)程序來(lái)繼續(xù)操作,由后臺(tái)程序完成事件的后繼處理。


從代碼功能上講,事件的響應(yīng)和處理分為了兩個(gè)部分。因?yàn)橹袛嘧陨碛袃?yōu)先級(jí)和嵌套的功能,所以?xún)?yōu)先級(jí)高的事件能夠得到及時(shí)響應(yīng)。但后臺(tái)程序仍然需要按順序處理各個(gè)事件的后繼事務(wù)。


圖片


在中斷源之間有優(yōu)先級(jí)的概念,ISR會(huì)首先響應(yīng)事件,簡(jiǎn)單的事件可以在ISR中直接處理,復(fù)雜的情況下則記錄下必要數(shù)據(jù)和狀態(tài)標(biāo)記,等所有中斷處理結(jié)束后,將由后臺(tái)主函數(shù)按順序處理各個(gè)事件。也可以理解,事件的響應(yīng)是支持優(yōu)先級(jí)的,但事件的最終處理卻是順序的。


使用中斷來(lái)代替輪詢(xún)方案中事件的查詢(xún)操作,對(duì)事件的響應(yīng)能力有較大改善。


示例偽代碼如下所示:




















int main(void){    HwInit();                //初始化外設(shè)  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ù)系統(tǒng)架構(gòu)

相對(duì)于前后臺(tái)系統(tǒng)架構(gòu),多任務(wù)系統(tǒng)架構(gòu)在響應(yīng)事件的時(shí)候,同樣是由多個(gè)中斷處理程序完成的。但是對(duì)于事件的后繼操作則是由多個(gè)任務(wù)來(lái)處理的,也就是說(shuō)每個(gè)任務(wù)處理它所負(fù)責(zé)的事件。


在基于優(yōu)先級(jí)的多任務(wù)系統(tǒng)架構(gòu)中,因?yàn)槿蝿?wù)間存在優(yōu)先級(jí)高、低的關(guān)系,優(yōu)先級(jí)高的任務(wù)可打斷低優(yōu)先級(jí)任務(wù)的運(yùn)行而取得CPU的優(yōu)先使用權(quán),這樣優(yōu)先級(jí)高的事件就能及時(shí)得到處理;在基于分時(shí)機(jī)制的多任務(wù)系統(tǒng)中,任務(wù)間則按比例輪流占用處理器。


圖片


因?yàn)槎嗳蝿?wù)系統(tǒng)架構(gòu)允許將具體的應(yīng)用系統(tǒng)分成若干個(gè)相對(duì)獨(dú)立的任務(wù)來(lái)管理,所以多任務(wù)操作系統(tǒng)的使用可以簡(jiǎn)化應(yīng)用程序的設(shè)計(jì),系統(tǒng)也變得簡(jiǎn)潔且便于維護(hù)和擴(kuò)展。對(duì)實(shí)時(shí)性要求嚴(yán)格的事件都能得到及時(shí)可靠的處理。不過(guò)多任務(wù)操作系統(tǒng)自身將消耗更多的處理器、存儲(chǔ)器等硬件資源,這是引入多任務(wù)機(jī)制的必要代價(jià)。

示例偽代碼如下所示:








































int main(void){    HwInit();                //初始化外設(shè)    OS_Init();               //初始化系統(tǒng)    OS_Start();              //運(yùn)行內(nèi)核調(diào)度  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


區(qū)別

最后,對(duì)比一下三種嵌入式軟件系統(tǒng)架構(gòu)的特點(diǎn)和區(qū)別,如下表所示:


圖片


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: FreeRTOS 嵌入式

相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉