(4)硬實時和軟實時
有些嵌入式系統(tǒng)對時間的要求較高,稱之為實時系統(tǒng)。有兩種類型的實時系統(tǒng):硬實時系統(tǒng)和軟實時系統(tǒng)。軟實時系統(tǒng)并不要求限定某一任務必須在一定的時間內(nèi)完成,只要求各任務運行得越快越好;硬實時系統(tǒng)對系統(tǒng)響應時間有嚴格要求,一旦系統(tǒng)響應時間不能滿足,就可能會引起系統(tǒng)崩潰或致命的錯誤,一般在工業(yè)控制中應用較多。
(5)內(nèi)存管理
針對有內(nèi)存管理單元(MMU)的處理器設計的一些桌面操作系統(tǒng),如Windows、Linux,使用了虛擬存儲器的概念。虛擬內(nèi)存地址被送到MMU。在這里,虛擬地址被映射為物理地址,實際存儲器被分割為相同大小的頁面,采用分頁的方式載入進程。一個程序在運行之前,沒有必要全部裝入內(nèi)存,而是僅將那些當前要運行的部分頁面裝入內(nèi)存運行。 大多數(shù)嵌入式系統(tǒng)針對沒有MMU的處理器設計,不能使用處理器的虛擬內(nèi)存管理技術(shù),采用的是實存儲器管理策略。因而對于內(nèi)存的訪問是直接的,它對地址的訪問不需要經(jīng)過MMU,而是直接送到地址線上輸出,所有程序中訪問的地址都是實際的物理地址;而且,大多數(shù)嵌入式操作系統(tǒng)對內(nèi)存空間沒有保護,各個進程實際上共享一個運行空間。一個進程在執(zhí)行前,系統(tǒng)必須為它分配足夠的連續(xù)地址空間,然后全部載入主存儲器的連續(xù)空間。
由此可見,嵌入式系統(tǒng)的開發(fā)人員不得不參與系統(tǒng)的內(nèi)存管理。從編譯內(nèi)核開始,開發(fā)人員必須告訴系統(tǒng)這塊開發(fā)板到底擁有多少內(nèi)存;在開發(fā)應用程序時,必須考慮內(nèi)存的分配情況并關注應用程序需要運行空間的大小。另外,由于采用實存儲器管理策略,用戶程序同內(nèi)核以及其它用戶程序在一個地址空間,程序開發(fā)時要保證不侵犯其它程序的地址空間,以使得程序不至于破壞系統(tǒng)的正常工作,或?qū)е缕渌绦虻倪\行異常;因而,嵌入式系統(tǒng)的開發(fā)人員對軟件中的一些內(nèi)存操作要格外小心。
(6)內(nèi)核加載方式
嵌入式操作系統(tǒng)內(nèi)核可以在Flash上直接運行,也可以加載到內(nèi)存中運行。Flash的運行方式,是把內(nèi)核的可執(zhí)行映像燒寫到Flash上,系統(tǒng)啟動時從Flash的某個地址開始執(zhí)行。這種方法實際上是很多嵌入式系統(tǒng)所采用的方法。內(nèi)核加載方式是把內(nèi)核的壓縮文件存放在Flash上,系統(tǒng)啟動時讀取壓縮文件在內(nèi)存里解壓,然后開始執(zhí)行。這種方式相對復雜一些,但是運行速度可能更快,因為RAM的存取速率要比Flash高。
由于嵌入式系統(tǒng)的內(nèi)存管理機制,嵌入式操作系統(tǒng)對用戶程序采用靜態(tài)鏈接的形式。在嵌入式系統(tǒng)中,應用程序和操作系統(tǒng)內(nèi)核代碼編譯、鏈接生成一個二進制影像文件來運行。
2 嵌入式系統(tǒng)開發(fā)相關技術(shù)
相對于在Windows環(huán)境下的開發(fā)應用程序,嵌入式系統(tǒng)開發(fā)有著很多的不同。不同的硬件平臺和操作系統(tǒng)帶來了許多附加的開發(fā)復雜性。 2.1 嵌入式開發(fā)過程
在嵌入式開發(fā)過程中有宿主機和目標機的角色之分:宿主機是執(zhí)行編譯、鏈接、定址過程的計算機;目標機指運行嵌入式軟件的硬件平臺。首先須把應用程序轉(zhuǎn)換成可以在目標機上運行的二進制代碼。這一過程包含三個步驟:編譯、鏈接、定址。編譯過程由交叉編譯器實現(xiàn)。所謂交叉編譯器就是運行在一個計算機平臺上并為另一個平臺產(chǎn)生代碼的編譯器。常用的交叉編譯器有GNU C/C++(gcc)。編譯過程產(chǎn)生的所有目標文件被鏈接成一個目標文件,稱為鏈接過程。定址過程會把物理存儲器地址指定給目標文件的每個相對偏移處。該過程生成的文件就是可以在嵌入式平臺上執(zhí)行的二進制文件。 嵌入式開發(fā)過程中另一個重要的步驟是調(diào)試目標機上的應用程序。嵌入式調(diào)試采用交叉調(diào)試器,一般采用宿主機-目標機的調(diào)試方式,它們之間由串行口線或以太網(wǎng)或BDM線相連。交叉調(diào)試有任務級、源碼級和匯編級的調(diào)試,調(diào)試時需將宿主機上的應用程序和操作系統(tǒng)內(nèi)核下載到目標機的RAM中或直接燒錄到目標機的ROM中。目標監(jiān)控器是調(diào)試器對目標機上運行的應用程序進行控制的代理(Debugger Agent),事先被固化在目標機的Flash、ROM中,在目標機上電后自動啟動,并等待宿主機方調(diào)試器發(fā)來的命令,配合調(diào)試器完成應用程序的下載、運行和基本的調(diào)試功能,將調(diào)試信息返回給宿主機。 2.2 向嵌入式平臺移植軟件
大部分嵌入式開發(fā)人員選用的軟件開發(fā)模式是先在PC機上編寫軟件,再進行軟件的移植工作。在PC機上編寫軟件時,要注意軟件的可移植性,選用具有較高移植性的編程語言(如C語言),盡量少調(diào)用操作系統(tǒng)函數(shù),注意屏蔽不同硬件平臺帶來的字節(jié)順序、字節(jié)對齊等問題。以下是我們在移植協(xié)議棧過程中的一些體會。
2.2.1 字節(jié)順序
字節(jié)順序是指占內(nèi)存多于一個字節(jié)類型的數(shù)據(jù)在內(nèi)存中的存放順序,通常有小端、大端兩種字節(jié)順序。小端字節(jié)序指低字節(jié)數(shù)據(jù)存放在內(nèi)存低地址處,高字節(jié)數(shù)據(jù)存放在內(nèi)存高地址處;大端字節(jié)序是高字節(jié)數(shù)據(jù)存放在低地址處,低字節(jié)數(shù)據(jù)存放在高地址處;赬86平臺的PC機是小端字節(jié)序的,而有的嵌入式平臺則是大端字節(jié)序的。因而對int、uint16、uint32等多于1字節(jié)類型的數(shù)據(jù),在這些嵌入式平臺上應該變換其存儲順序。通常我們認為,在空中傳輸?shù)淖止?jié)的順序即網(wǎng)絡字節(jié)序為標準順序,考慮到與協(xié)議的一致以及與同類其它平臺產(chǎn)品的互通,在程序中發(fā)數(shù)據(jù)包時,將主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡字節(jié)序,收數(shù)據(jù)包處將網(wǎng)絡字節(jié)序轉(zhuǎn)換為主機字節(jié)序。
更多軟考資料請訪問:考試吧軟件水平考試欄目
希望與更多網(wǎng)友交流,請進入考試吧軟件水平考試論壇