嵌入式開發(fā)中多任務(wù)操作系統(tǒng)設(shè)計
嵌入式開發(fā)就是指在嵌入式操作系統(tǒng)下進行開發(fā),包括在系統(tǒng)化設(shè)計指導下的硬件和軟件以及綜合研發(fā)。除暫且分離硬件的EDA研發(fā)以外,側(cè)重的就是在一定硬件條件下的系統(tǒng)化設(shè)計和軟件研發(fā)。
嵌入式開發(fā)是指利用分立元件或集成器件進行電路設(shè)計、結(jié)構(gòu)設(shè)計,再進行軟件編程(通常是高級語言),實驗,經(jīng)過多輪修改設(shè)計、制作,最終完成整個系統(tǒng)的開發(fā)。這種嵌入式開發(fā),適用于未來產(chǎn)品比較單一,產(chǎn)量比較大,產(chǎn)品開發(fā)周期比較長,成本控制比較嚴格的系統(tǒng)。嵌入式技術(shù)不是單純的軟件技術(shù),也不是單純的硬件技術(shù),是一門如何在一個特定的硬件環(huán)境上開發(fā)與構(gòu)建特定的可編程軟件系統(tǒng)的綜合技術(shù)。嵌入式技術(shù)是在嵌入式系統(tǒng)的發(fā)展中應(yīng)運而生的,它是依附于嵌入式系統(tǒng),并推動嵌入式系統(tǒng)不斷向前發(fā)展的核心動力。
嵌入式是一種專用的計算機系統(tǒng),作為裝置或設(shè)備的一部分。通常,嵌入式系統(tǒng)是一個控制程序存儲在ROM中的嵌入式處理器控制板。事實上,所有帶有數(shù)字接口的設(shè)備,如手表、微波爐、錄像機、汽車等,都使用嵌入式系統(tǒng),有些嵌入式系統(tǒng)還包含操作系統(tǒng),但大多數(shù)嵌入式系統(tǒng)都是是由單個程序?qū)崿F(xiàn)整個控制邏輯。嵌入式技術(shù)近年來得到了飛速的發(fā)展,但是嵌入式產(chǎn)業(yè)涉及的領(lǐng)域非常廣泛,彼此之間的特點也相當明顯。例如,很多行業(yè):手機、PDA、車載導航、工控、軍工、多媒體終端、網(wǎng)關(guān)、數(shù)字電視等。
0、前言
在嵌入式軟件開發(fā),包括單片機開發(fā)中,軟件架構(gòu)對于開發(fā)人員是一個必須認真考慮的問題。軟件架構(gòu)對于系統(tǒng)整體的穩(wěn)定性和可靠性是非常重要的,一個合適的軟件架構(gòu)不僅結(jié)構(gòu)清晰,并且便于開發(fā)。
我相信在嵌入式或單片機軟件開發(fā)的初期大多數(shù)開發(fā)者采用的都是簡單的前后臺順序執(zhí)行架構(gòu)(我就是這樣的)。
在嵌入式軟件開發(fā)中,程序架構(gòu)主要分為三種,本篇文章將對這三種程序架構(gòu)做出詳解。
1、軟件架構(gòu)存在的意義
可以說一個好的程序架構(gòu),是一個有經(jīng)驗的工程師和一個初學者的分水嶺。軟件架構(gòu)對于開發(fā)人員是友好的,你希望先執(zhí)行什么任務(wù)后執(zhí)行什么任務(wù),或者這一個時間點執(zhí)行什么任務(wù)下一個執(zhí)行什么任務(wù),又或者什么事件會同步到某個任務(wù)等等,在不同的軟件架構(gòu)下,解決上述問題的具體方法都是有所區(qū)別的。軟件架構(gòu)對開發(fā)者最大的幫助是:幫助開發(fā)者掌控整個工程的框架,當你熟練使用其中某一個程序架構(gòu)后,對于系統(tǒng)中出現(xiàn)的bug你一定能夠快速的定位并解決。當然,我建議要根據(jù)需要選擇合適的軟件架構(gòu)進行開發(fā),具體原因在文章后面會進行介紹。
2、深入介紹三種不同的程序架構(gòu)
三種常用的軟件架構(gòu)有:順序執(zhí)行的前后臺系統(tǒng)、時間片輪詢系統(tǒng)和多任務(wù)操作系統(tǒng)。為了讓大家有一個更為清晰的認識,我分別用三種軟件架構(gòu)對一個實例進行介紹說明。這個實例如下:它有4個任務(wù),這4個任務(wù)為按鍵掃描、聲光報警、顯示屏刷新和超聲波測距。這個實例的具體功能是通過按鍵設(shè)置測量距離的閾值,當測距距離低于設(shè)置的閾值時,觸發(fā)聲光報警并且將測量距離實時顯示在顯示屏上(這個應(yīng)用是汽車倒車雷達的具體體現(xiàn))。
順序執(zhí)行的前后臺系統(tǒng)
在順序執(zhí)行的前后臺系統(tǒng)中,我會把鍵盤掃描用查詢的方式放在while(1)中,而顯示屏刷新和超聲波測距使用中斷,在中斷服務(wù)函數(shù)中獲取測量距離后進行顯示,在主函數(shù)的循環(huán)中進行按鍵的檢測,聲光處理也放在主循環(huán)中。這樣整個程序就以變量標志的同步方式在主循環(huán)和后臺中斷中執(zhí)行,對應(yīng)的程序代碼如圖所示:
順序執(zhí)行前后臺系統(tǒng)的主函數(shù)
順序執(zhí)行前后臺系統(tǒng)的中斷服務(wù)函數(shù)這種架構(gòu)的優(yōu)點是使用簡單易于理解,而缺點是每個任務(wù)所占的CPU時間過長的話,會導致程序的實時性能差,就比如按鍵的檢測等。
時間片輪詢系統(tǒng)和多任務(wù)操作系統(tǒng)
時間片輪詢法實際上通常出現(xiàn)在操作系統(tǒng)中,也就是說他屬于操作系統(tǒng),但在這里所說的是基于前后臺系統(tǒng)的時間片輪詢。時間片輪詢法的實質(zhì)其實就是選出一個定時器,沒進一次定時中斷對計數(shù)值進行自加,在主循環(huán)中根據(jù)這個計數(shù)值執(zhí)行任務(wù),這個計數(shù)值也就是任務(wù)輪詢的時間片。在這個實例中,如果采用時間片輪詢系統(tǒng)的話,首先選用主控芯片的任一定時器,定時器定時時間周期由我們決定,為了保證實時性和運行效率,這個值通常取10ms、30ms、50ms等,我會將按鍵掃描輪值值設(shè)置為20ms,因為按鍵抖動的時長一般為20ms,這樣處理既達到了消抖的目的,又不會漏掉按鍵的檢測;而顯示屏的刷新設(shè)置為30ms,如果你覺得刷新反應(yīng)慢了也可以修改這一輪詢值得到改善;而超聲波測距的輪詢值設(shè)置為100ms,即每隔100模式觸發(fā)測距一次,這個測距頻率已經(jīng)能夠滿足大多數(shù)的情況了。程序代碼如下:
時間片輪詢系統(tǒng)的主函數(shù)
時間片輪詢系統(tǒng)的定時器中斷函數(shù)可以看出時間片輪詢法相比順序執(zhí)行還是有很大優(yōu)勢的,既有順序執(zhí)行法的優(yōu)點,也有操作系統(tǒng)的部分優(yōu)點。
多任務(wù)操作系統(tǒng)
操作系統(tǒng)的本身是一個比較復(fù)雜的東西,任務(wù)的管理和調(diào)度實現(xiàn)的底層是很復(fù)雜和困難的。但是呢,我們一般都是把操作系統(tǒng)本身作為一個工具一個平臺,我們的目的是使用它的功能而不是開發(fā)一個操作系統(tǒng)。
我使用過ucos和freertos小型的實時操作系統(tǒng),也使用過Linux大型的操作系統(tǒng),有了操作系統(tǒng),不管是對于程序的穩(wěn)定性和開發(fā)的效率都會好很多。我們在使用操作系統(tǒng)的時候更多的需要去學習和理解它的一些調(diào)度和通信的方式。
實際上真正能使用操作系統(tǒng)的人并不多,反而是跑裸機的占大多數(shù),這也和產(chǎn)品的具體要求有關(guān),很多簡單的系統(tǒng)只需要裸機即可滿足。
在這里本我不過多的介紹操作系統(tǒng)本身,因為操作系統(tǒng)確實挺復(fù)雜的,下面圖例中的代碼是在freertos中創(chuàng)建按鍵控制LED亮滅的程序結(jié)構(gòu),大家可以對比一下:
freertos多任務(wù)系統(tǒng)中主函數(shù)
freertos多任務(wù)操作系統(tǒng)中的任務(wù)回調(diào)函數(shù)