嵌入式系統(tǒng)中,有很多方式實(shí)現(xiàn)任務(wù)調(diào)度。功能有限的小系統(tǒng)中,無(wú)限循環(huán)足夠?qū)崿F(xiàn)小系統(tǒng)的功能。當(dāng)軟件設(shè)計(jì)變得龐大且復(fù)雜時(shí),開(kāi)發(fā)者應(yīng)該考慮使用實(shí)時(shí)操作系統(tǒng)RTOS。
下面給大家分享幾點(diǎn)RTOS相比裸機(jī)的優(yōu)勢(shì):
1.硬實(shí)時(shí)響應(yīng)
基于優(yōu)先級(jí)搶占的RTOS,根據(jù)任務(wù)的實(shí)時(shí)需求,執(zhí)行優(yōu)先調(diào)度。有嚴(yán)格時(shí)序限制的任務(wù)可以?xún)?yōu)先執(zhí)行,提高應(yīng)用程序?qū)r(shí)間關(guān)鍵事件的響應(yīng)。
2.系統(tǒng)性能最大化
針對(duì)大型的、復(fù)雜的嵌入式應(yīng)用,使用一個(gè)事件驅(qū)動(dòng)的RTOS,來(lái)替代基于輪詢(xún)的超循環(huán)結(jié)構(gòu),可以生成一個(gè)更有效的設(shè)計(jì),更小的存儲(chǔ)占用,應(yīng)用可以獲得更多的處理器時(shí)間。
3.降低復(fù)雜度
RTOS允許應(yīng)用劃分為一個(gè)個(gè)小的自主運(yùn)行的任務(wù)。任務(wù)執(zhí)行自己的上下文中,不依賴(lài)其它任務(wù)或調(diào)度器。
4.高峰負(fù)載管理
RTOS提供了為管理系統(tǒng)高峰活動(dòng)提供了一個(gè)有效的方法。更高的優(yōu)先級(jí)分配給執(zhí)行峰值負(fù)載活動(dòng)的任務(wù),確保他們?cè)谂R界時(shí)間內(nèi)訪(fǎng)問(wèn)處理器,在此期間,較低優(yōu)先級(jí)的任務(wù)被延遲。
5.緊密集成的中間件
RTOS的模塊化設(shè)計(jì)使得它可以很容易的增加中間件。中間件組件以任務(wù)和驅(qū)動(dòng)的方式增加。他們使用RTOS提供的資源與其它任務(wù)通信?;谙鄳?yīng)的事件被RTOS調(diào)度。
6.更大的開(kāi)發(fā)團(tuán)隊(duì)
每個(gè)任務(wù)可以被認(rèn)為是一個(gè)項(xiàng)目。通過(guò)RTOS提供的資源(隊(duì)列、信號(hào)量等)來(lái)定義輸入輸出。將系統(tǒng)定義為一個(gè)個(gè)的任務(wù),可以更容易的部署更多開(kāi)發(fā)人員到一個(gè)項(xiàng)目。
7.易于調(diào)試和驗(yàn)證
系統(tǒng)劃分為功能明確的任務(wù),不依賴(lài)其它任務(wù)。在整個(gè)系統(tǒng)集成之前,可以很容易的調(diào)試和驗(yàn)證每個(gè)任務(wù)。
8.代碼重用
RTOS系統(tǒng)中的模塊化設(shè)計(jì),鼓勵(lì)將軟件功能創(chuàng)建為獨(dú)立的、驗(yàn)證過(guò)的任務(wù)。其獨(dú)立性使得在其它設(shè)計(jì)中重用這些模塊變得很簡(jiǎn)單。
現(xiàn)在MCU資源相比以前更多了,很多場(chǎng)景都適合跑RTOS,當(dāng)然,也有少部分場(chǎng)景跑裸機(jī)就夠了。
01
邏輯系統(tǒng)
裸機(jī)系統(tǒng)通常分成輪詢(xún)系統(tǒng)和前后臺(tái)系統(tǒng)。
1、輪詢(xún)系統(tǒng)
輪詢(xún)系統(tǒng)即是在裸機(jī)編程的時(shí)候,先初始化好相關(guān)的硬件,然后讓主程序在一個(gè)死循環(huán)里面不斷循環(huán),順序地做各種事情,大概的偽代碼具體如代碼清單所示:
intmain(void) { /* 硬件相關(guān)初始化 */ HardWareInit(); /* 無(wú)限循環(huán) */ for(;;) { /* 處理事情 1 */ DoSomething1(); /* 處理事情 2 */ DoSomethingg2(); /* 處理事情 3 */ DoSomethingg3(); } }
輪詢(xún)系統(tǒng)是一種非常簡(jiǎn)單的軟件結(jié)構(gòu),通常只適用于那些只需要順序執(zhí)行代碼且不需要外部事件來(lái)驅(qū)動(dòng)的就能完成的事情。在代碼清單 1-1 中,如果只是實(shí)現(xiàn) LED 翻轉(zhuǎn),串口輸出,液晶顯示等這些操作,那么使用輪詢(xún)系統(tǒng)將會(huì)非常完美。但是,如果加入了按鍵操作等需要檢測(cè)外部信號(hào)的事件,用來(lái)模擬緊急報(bào)警,那么整個(gè)系統(tǒng)的實(shí)時(shí)響應(yīng)能力就不會(huì)那么好了。
假設(shè)DoSomethingg3 是按鍵掃描,當(dāng)外部按鍵被按下,相當(dāng)于一個(gè)警報(bào),這個(gè)時(shí)候,需要立馬響 應(yīng) , 并 做 緊 急 處 理 , 而 這 個(gè) 時(shí) 候 程 序 剛 好 執(zhí) 行 到 DoSomethingg1 , 要 命 的 是DoSomethingg1 需要執(zhí)行的時(shí)間比較久,久到按鍵釋放之后都沒(méi)有執(zhí)行完畢,那么當(dāng)執(zhí)行到 DoSomethingg3 的時(shí)候就會(huì)丟失掉一次事件。足見(jiàn),輪詢(xún)系統(tǒng)只適合順序執(zhí)行的功能代碼,當(dāng)有外部事件驅(qū)動(dòng)時(shí),實(shí)時(shí)性就會(huì)降低。
2、前后臺(tái)系統(tǒng)
相比輪詢(xún)系統(tǒng),前后臺(tái)系統(tǒng)是在輪詢(xún)系統(tǒng)的基礎(chǔ)上加入了中斷。外部事件的響應(yīng)在中斷里面完成,事件的處理還是回到輪詢(xún)系統(tǒng)中完成,中斷在這里我們稱(chēng)為前臺(tái), main 函數(shù)里面的無(wú)限循環(huán)我們稱(chēng)為后臺(tái),大概的偽代碼見(jiàn)代碼清單所示:
intflag1 =0;
intflag2 =0;
intflag3 =0;
intmain(void)
{
/* 硬件相關(guān)初始化 */
HardWareInit();
/* 無(wú)限循環(huán) */
for(;;) {
if(flag1) {
/* 處理事情 1 */
DoSomething1();
}
if(flag2) {
/* 處理事情 2 */
DoSomethingg2();
}
if(flag3) {
/* 處理事情 3 */
DoSomethingg3();
}
}
}
voidISR1(void)
{
/* 置位標(biāo)志位 */
flag1 =1;
/* 如果事件處理時(shí)間很短,則在中斷里面處理
如果事件處理時(shí)間比較長(zhǎng),在回到后臺(tái)處理 */
DoSomething1();
}
voidISR2(void)
{
/* 置位標(biāo)志位 */
flag2 =2;
/* 如果事件處理時(shí)間很短,則在中斷里面處理
如果事件處理時(shí)間比較長(zhǎng),在回到后臺(tái)處理 */
DoSomething2();
}
voidISR3(void)
{
/* 置位標(biāo)志位 */
flag3 =1;
/* 如果事件處理時(shí)間很短,則在中斷里面處理
如果事件處理時(shí)間比較長(zhǎng),在回到后臺(tái)處理 */
DoSomething3();
}
在順序執(zhí)行后臺(tái)程序的時(shí)候,如果有中斷來(lái)臨,那么中斷會(huì)打斷后臺(tái)程序的正常執(zhí)行流,轉(zhuǎn)而去執(zhí)行中斷服務(wù)程序,在中斷服務(wù)程序里面標(biāo)記事件,如果事件要處理的事情很簡(jiǎn)短,則可在中斷服務(wù)程序里面處理,如果事件要處理的事情比較多,則返回到后臺(tái)程序里面處理。
雖然事件的響應(yīng)和處理是分開(kāi)了,但是事件的處理還是在后臺(tái)里面順序執(zhí)行的,但相比輪詢(xún)系統(tǒng),前后臺(tái)系統(tǒng)確保了事件不會(huì)丟失,再加上中斷具有可嵌套的功能,這可以大大的提高程序的實(shí)時(shí)響應(yīng)能力。在大多數(shù)的中小型項(xiàng)目中,前后臺(tái)系統(tǒng)運(yùn)用的好,堪稱(chēng)有操作系統(tǒng)的效果。
02
多線(xiàn)程系統(tǒng)
相比前后臺(tái)系統(tǒng),多線(xiàn)程系統(tǒng)的事件響應(yīng)也是在中斷中完成的,但是事件的處理是在線(xiàn)程中完成的。在多線(xiàn)程系統(tǒng)中,線(xiàn)程跟中斷一樣,也具有優(yōu)先級(jí),優(yōu)先級(jí)高的線(xiàn)程會(huì)被優(yōu)先執(zhí)行。
當(dāng)一個(gè)緊急的事件在中斷被標(biāo)記之后,如果事件對(duì)應(yīng)的線(xiàn)程的優(yōu)先級(jí)足夠高,就會(huì)立馬得到響應(yīng)。相比前后臺(tái)系統(tǒng),多線(xiàn)程系統(tǒng)的實(shí)時(shí)性又被提高了。
多線(xiàn)程系統(tǒng)大概的偽代碼具體見(jiàn)代碼清單所示:
intflag1 =0; intflag2 =0; intflag3 =0; intmain(void) { /* 硬件相關(guān)初始化 */ HardWareInit(); /* OS 初始化 */ RTOSInit(); /* OS 啟動(dòng),開(kāi)始多線(xiàn)程調(diào)度,不再返回 */ RTOSStart(); } voidISR1(void) { /* 置位標(biāo)志位 */ flag1 =1; } voidISR2(void) { /* 置位標(biāo)志位 */ flag2 =2; } voidISR3(void) { /* 置位標(biāo)志位 */ flag3 =1; } voidDoSomething1(void) { /* 無(wú)限循環(huán),不能返回 */ for(;;) { /* 線(xiàn)程實(shí)體 */ if(flag1) { } } } voidDoSomething2(void) { /* 無(wú)限循環(huán),不能返回 */ for(;;) { /* 線(xiàn)程實(shí)體 */ if(flag2) { } } } voidDoSomething3(void) { /* 無(wú)限循環(huán),不能返回 */ for(;;) { /* 線(xiàn)程實(shí)體 */ if(flag3) { } } }
相比前后臺(tái)系統(tǒng)中后臺(tái)順序執(zhí)行的程序主體,在多線(xiàn)程系統(tǒng)中,根據(jù)程序的功能,我們把這個(gè)程序主體分割成一個(gè)個(gè)獨(dú)立的,無(wú)限循環(huán)且不能返回的小程序,這個(gè)小程序我們稱(chēng)之為線(xiàn)程。
每個(gè)線(xiàn)程都是獨(dú)立的,互不干擾的,且具備自身的優(yōu)先級(jí),它由操作系統(tǒng)調(diào)度管理。加入操作系統(tǒng)后,我們?cè)?a target="_blank">編程的時(shí)候不需要精心地去設(shè)計(jì)程序的執(zhí)行流,不用擔(dān)心每個(gè)功能模塊之間是否存在干擾。
加入了操作系統(tǒng),我們的編程反而變得簡(jiǎn)單了。整個(gè)系統(tǒng)隨之帶來(lái)的額外開(kāi)銷(xiāo)就是操作系統(tǒng)占據(jù)的那一丁點(diǎn)的 FLASH 和 RAM?,F(xiàn)如今,單片機(jī)的 FLASH 和 RAM 是越來(lái)越大,完全足以抵擋 RTOS 那點(diǎn)開(kāi)銷(xiāo)。
輪詢(xún)、前后臺(tái)和多線(xiàn)程系統(tǒng)軟件模型區(qū)別:
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
19102瀏覽量
228819 -
mcu
+關(guān)注
關(guān)注
146文章
16890瀏覽量
349931 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3551瀏覽量
129110 -
RTOS
+關(guān)注
關(guān)注
21文章
809瀏覽量
119362 -
裸機(jī)
+關(guān)注
關(guān)注
0文章
39瀏覽量
6329
原文標(biāo)題:MCU跑RTOS相比裸機(jī)的優(yōu)勢(shì)
文章出處:【微信號(hào):談思實(shí)驗(yàn)室,微信公眾號(hào):談思實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論