記得上一次師兄去應聘一嵌入式公司,當時(shí)有一道題問(wèn)的就是關(guān)于嵌入式軟件系統設計中的前后臺系統的。聽(tīng)師兄說(shuō),他當時(shí)也是回答得含含糊糊的,確實(shí)沒(méi)有真正地理解前后臺系統的設計方法。這些天,翻閱張大波主編的《嵌入式系統原理、設計與應用》一書(shū)時(shí),發(fā)現書(shū)中對嵌入式軟件系統設計方法的描述很系統,也很清晰,故將其內容概括記錄下來(lái)。
嵌入式系統有復雜和簡(jiǎn)單之分。簡(jiǎn)單的嵌入式系統可以不使用嵌入式操作系統,直接在裸機上開(kāi)發(fā);而復雜的嵌入式系統則通常推薦使用嵌入式操作系統。
1、
無(wú)操作系統的嵌入式系統設計
(1)
前后臺系統
不復雜的小系統可以設計成前后臺系統。應用程序是一個(gè)無(wú)限循環(huán),巡回地執行多個(gè)事件,完成相應的操作,這一部分軟件稱(chēng)為后臺,通常在主程序main()中被調用。中斷服務(wù)程序處理異步事件,這一部分可以看成是前臺。因此,后臺也可稱(chēng)為任務(wù)級,而前臺則被稱(chēng)為中斷級。注意,強實(shí)時(shí)性的關(guān)鍵操作都必須用中斷來(lái)實(shí)現。
前后臺系統的程序設計通常包括兩大部分:主程序main循環(huán)和中斷處理程序。程序框架如下:
main()
{
/* 硬件初始化 */
/* 后臺程序 */
while (1)
{
action1();
action2();
...
actionn();
}
}
action1()
{
/* 執行操作1 */
...
}
action2()
{
/* 執行操作2 */
...
}
...
actionn()
{
/* 執行操作n */
...
}
isr1()
{
/* 中斷1的中斷服務(wù)程序 */
...
}
isr2()
{
/* 中斷2的中斷服務(wù)程序 */
...
}
...
isrn()
{
/* 中斷n的中斷服務(wù)程序 */
...
}
這種系統的實(shí)時(shí)性有一定的問(wèn)題,因為中斷服務(wù)程序提供的數據直到后臺程序運行到該處理這個(gè)數據時(shí),才能得到處理。
(2)
中斷(事件)驅動(dòng)系統
對于省電系統的設計,可以采用中斷驅動(dòng)的程序設計方法,整個(gè)軟件系統完全由中斷服務(wù)程序實(shí)現。
該設計方法包括主程序和中斷服務(wù)程序兩部分:主程序完成系統的初始化,如硬件的初始化等,初始化完成后執行低功耗指令進(jìn)入低功耗方式;而每當外部事件發(fā)生時(shí),相應的中斷服務(wù)程序被激活,執行相關(guān)的處理,處理完成后,又進(jìn)入到低功耗狀態(tài)。其程序框架如下:
main()
{
/* 系統初始化 */
while (1)
enter_low_power();
}
isr1()
{
/* 處理中斷事件 */
...
}
上面的代碼中,主程序main()中除了系統開(kāi)始運行時(shí)的初始化代碼后,沒(méi)有事件處理代碼。
(3)
巡回服務(wù)系統
如果嵌入式微處理器/微控制器的中斷源不多,那么采用中斷驅動(dòng)的程序設計方法有一定的局限性,因為無(wú)法將所有外部事件與中斷源相關(guān)聯(lián)。這時(shí)一般采用的方案有兩種:一種是使用中斷控制器之類(lèi)的擴展中斷源的芯片,進(jìn)行中斷擴展,但這種方法一般不推薦使用,因為擴展硬件帶來(lái)的問(wèn)題很多:系統復雜、成本高,同時(shí)也會(huì )浪費處理器的I/O引腳等資源。另一種方法則是采用軟件的方法,即巡回服務(wù)系統,它把對外部事件的處理由主循環(huán)完成。這樣的設計即使嵌入式微處理器沒(méi)有中斷源也可以完成軟件的設計。
程序框架如下:
main()
{
/* 系統初始化 */
while (1)
{
action1(); /* 巡回檢測事件1并處理事件 */
action2(); /* 巡回檢測事件2并處理事件 */
...
actionn(); /* 巡回檢測事件n并處理事件 */
}
}
(4)
基于定時(shí)器的巡回服務(wù)系統
巡回服務(wù)系統解決了中斷源的數量小于外部事件數量的問(wèn)題,但是處理器總是處于全速運行狀態(tài)(即我們通常所說(shuō)的Poll輪循方法),處理器的開(kāi)銷(xiāo)比較大,帶來(lái)的問(wèn)題是能耗高。如果系統的外部事件不是發(fā)生得很頻繁,那么可以降低處理器服務(wù)事件的頻率,同時(shí)這樣也不會(huì )降低響應時(shí)間,這時(shí)就呆以采用定時(shí)器驅動(dòng)的巡回服務(wù)系統。
在定時(shí)器的中斷服務(wù)程序中檢測外部事件是否發(fā)生,如果發(fā)生就進(jìn)行處理。下面是程序的框架:
main()
{
/* 系統初始化 */
/* 設置定時(shí)器 */
while (1)
enter_low_power();
}
isr_timer() /* 定時(shí)器的中斷處理程序 */
{
action1(); /* 執行事件1的處理 */
action2(); /* 執行事件2的處理 */
...
actionn(); /* 執行事件n的處理 */
}
2、
有操作系統的嵌入式系統設計
(1)
分時(shí)系統
分時(shí)系統是由分時(shí)操作系統、多個(gè)任務(wù)組成的應用軟件構成。分時(shí)操作系統使用定時(shí)器來(lái)調度任務(wù)的運行,它按時(shí)間片均勻地分配給每個(gè)任務(wù)。像一般的嵌入式Linux操作系統和WinCE都是分時(shí)系統。
(2)
實(shí)時(shí)系統
分時(shí)系統的缺點(diǎn)是無(wú)法體現任務(wù)的重要性即優(yōu)先級。與分時(shí)系統不同,實(shí)時(shí)系統把系統處理的事件根據輕重緩急進(jìn)行分類(lèi),并賦予優(yōu)先級。高優(yōu)先級任務(wù)先得到處理器處理,只有高優(yōu)先級任務(wù)處理完成,才輪到低優(yōu)先級任務(wù)運行。
根據任務(wù)的調度策略的不同,實(shí)時(shí)系統的設計方法有兩種:搶占式和非搶占式。
非搶占式系統的優(yōu)點(diǎn)是操作系統的設計比較簡(jiǎn)單,從而系統的總開(kāi)銷(xiāo)也就??;但其缺點(diǎn)卻也是顯而易見(jiàn)的,如果低優(yōu)先級的任務(wù)不放棄CPU,就不會(huì )引起系統的重新調度,這樣高優(yōu)先級的任務(wù)就得不到及時(shí)的處理,這也就違背了實(shí)時(shí)系統設計的初衷。
與非搶占式系統相比,搶占式系統時(shí)刻保證最高優(yōu)先級的任務(wù)得到運行。在運行低優(yōu)先級任務(wù)過(guò)程中,如果高優(yōu)先級的任務(wù)就緒,即使低優(yōu)先級的任務(wù)不主動(dòng)放棄CPU,也會(huì )引起系統的重新調度。不過(guò),搶占式系統的開(kāi)銷(xiāo)比較大,因為經(jīng)常要進(jìn)行任務(wù)切換。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。