



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、 收稿日期:2002 - 05 - 10。姜換新,碩士,主研領域:數(shù)字通信、嵌入 式及網(wǎng)絡編程。 ARM嵌入式系統(tǒng)C語言編程 姜換新 (惠普中國軟件研發(fā)中心 上海202106) 摘 要 無操作系統(tǒng)支持的嵌入式系統(tǒng)軟件 ,包括系統(tǒng)引導(BOOT)、驅(qū)動程序、動態(tài)內(nèi)存管理、IPO、通 信以及應用軟件等方面。 本文詳細介紹了嵌入式平臺上用 C語言編寫系統(tǒng)軟件和應用軟件的方法。 雖然是針對ARM平臺介紹的,但基 本經(jīng)驗和算法也適 合于其他嵌入式平臺的軟件設計。 關(guān)鍵詞 嵌入式系統(tǒng) 軟件 C語言 ARM PROGRAMMING C ON ARM EMBEDDED PLATFORM Jiang Huanx
2、in (China Software Solutions Center , Hewlett - Packard Company , Shanghai 202106) Abstract Programming C on ARM embedded platform is a complicated project.Modules including system boot ,drivers ,dynamic memory manage 2 ment ,I pO interface ,communications and applications should be considered caref
3、ully.With an excellent experience on ARM embedded system ,the au 2 thor gives a detailed description in this paper on the methods and algorithms about programming ARM. Though ARM is the only discussed item ,this paper is useful for programming on any other embedded platforms. Keywords Embedded syste
4、m Software C programming language ARM 1 引言 無操作系統(tǒng)支持的嵌入式軟件包括系統(tǒng)引導 (BOOT)、外 圍驅(qū)動程序、存儲管理、系統(tǒng)IPO、通信、應用程序等方面,需要 結(jié)合采用匯編語言(約占10 %)和C語言(約占90 %)。本文結(jié) 合作者實踐,詳細介紹ARM嵌入式平臺的C編程方法??紤] 到通信軟件涉及范圍較大,本文不進行討論。 2 系統(tǒng)引導與main函數(shù) 通常C語言是從main函數(shù)開始的。main函數(shù)的原型是: int main(int argc,char 3 3 argv) 其中argc是參數(shù)的個數(shù),argv是指向各參數(shù)的指針的數(shù)組。 main函數(shù)由操
5、作系統(tǒng)內(nèi)核啟動,操作系統(tǒng)內(nèi)核完成函數(shù)所需的 變量初始化工作,并在調(diào)用結(jié)束后檢查 main函數(shù)的返回值,假設 返回值為0,說明程序運行正常,否那么說明程序運行出錯。在嵌 入式系統(tǒng)中,由于沒有操作系統(tǒng)內(nèi)核存在,對main函數(shù)的初始 化工作只能由系統(tǒng)引導(BOOT)模塊完成。 系統(tǒng)引導(BOOT)局部完成系統(tǒng)初始化工作,用匯編語言 實現(xiàn)。它的工作包括硬件初始化、棧存放器的設置、全局變量 的初始化或清0、RAM中運行的模塊的加載、堆參數(shù)的初始化 等。完成這些工作后,再把控制權(quán)交給C的main函數(shù)。顯然, 對嵌入式系統(tǒng)的main而言,argc和argv這兩個參數(shù)及返回值都 是沒有意義的如果返回,說明系統(tǒng)
6、出現(xiàn)嚴重錯誤。另外,為 了防止產(chǎn)生混淆,我們還必須給main函數(shù)另外取一個名字,比 如Main。否那么,編譯器將會給main函數(shù)生成一大堆初始化代 碼,導致C程序的主入口與系統(tǒng)引導模塊的接口錯誤。 系統(tǒng)引導模塊完成各種初始化工作后,用一條跳轉(zhuǎn)指令進 入C的主入口 Main ,控制權(quán)從此移交給了 C應用程序。 3 存儲管理 存儲管理是一個復雜的課題。從廣義的角度來說 ,磁盤文 件系統(tǒng)、內(nèi)存、片內(nèi)高速Cache等都屬于這個范疇。嵌入式系統(tǒng) 中,較有意義的是內(nèi)存的動態(tài)分配與釋放及 Flash存儲器管理 兩方面。本文要介紹的是我們在嵌入式系統(tǒng)中實現(xiàn)的動態(tài)內(nèi) 存管理。 C語言中動態(tài)內(nèi)存分配與釋放主要由
7、malloc和free兩個標 準庫函數(shù)實現(xiàn)。malloc從系統(tǒng)空閑內(nèi)存中分配適宜的內(nèi)存塊 , free函數(shù)完成內(nèi)存塊的回收。這兩個函數(shù)一般需要操作系統(tǒng)內(nèi) 核的支持,在ARM裸平臺上,不能直接調(diào)用。為此,我們編寫 了 m alloc和m free兩個函數(shù),實現(xiàn)動態(tài)存儲管理的功能。 典型應用程序內(nèi)存映象分成代碼區(qū)、數(shù)據(jù)區(qū)和棧區(qū) ,三個 區(qū)從低地址到高地址依次分布。代碼區(qū)從最低地址開始 ,棧區(qū) -15 - ? 1995-2004 Tsinghua Tongfang Optical Disc Co.,Ltd. All rights reserved. 那么占據(jù)最高地址。代碼區(qū)和數(shù)據(jù)區(qū)可以相連 ,也可以
8、分開。嵌 入式系統(tǒng)里,代碼區(qū)位于只讀存儲器如Flash中,數(shù)據(jù)區(qū)和棧 區(qū)那么位于RAM中,因此代碼區(qū)和數(shù)據(jù)區(qū)一般并不相連 1 o數(shù)據(jù) 區(qū)和棧區(qū)是分開的,它們之間的空隙稱作堆。 堆作為一個連續(xù)的可利用空間,是系統(tǒng)的初始可分配塊。 每次應用程序申請內(nèi)存,m alloc便從堆中分割出一塊從低地 址開始給它。隨著申請次數(shù)的增加,原來一個完整的內(nèi)存塊 便被分割為多個獨立的塊分配給應用程序。由于內(nèi)存釋放的 先后順序是隨機的,因此一定時間后,系統(tǒng)中將存在多個互不 相連的內(nèi)存塊。這就使得整個內(nèi)存區(qū)呈現(xiàn)出占用塊和空閑塊 犬牙交錯的狀態(tài),如圖1所示。圖中灰色局部表示內(nèi)存被占 用,白色局部表示未被占用。 圖1 動態(tài)
9、存儲管理過程中的內(nèi)存狀態(tài) 為了進行內(nèi)存動態(tài)管理,需要維護兩張全局表,一張是可 利用空間表avail list,管理空閑內(nèi)存塊的信息,另一張是已 分配空間表used list,管理占用內(nèi)存塊。這兩張表都用雙向 循環(huán)鏈表實現(xiàn)。隨著系統(tǒng)的運行,可利用空間表中往往會有多 個空閑塊存在,究竟分配哪一塊呢?文1介紹了三種不同的 分配策略,即首次擬合法、最正確擬合法和最差擬合法,各有優(yōu)缺 點。筆者實現(xiàn)的是首次擬合法。 可利用空間表和已分配空間表采用相同的“表元數(shù)據(jù)結(jié) 構(gòu),定義如下: struct mblock struct mblock 3 next ; struct mblock 3 prev ; siz
10、e t size ; char 3 space ; ; 在系統(tǒng)初始化時,整個可分配內(nèi)存塊是一個連續(xù)的存儲 區(qū),可利用空間表的元素只有一個。 m alloc函數(shù)每次分配內(nèi) 存時,先檢查size m alloc的參數(shù)是否合法 如是否超出堆的 范圍,假設合法,再將其與32 - bit字對齊,然后從avail list中搜 索適宜的內(nèi)存塊,并將其分配給應用程序。如果內(nèi)存塊的大小 比size大得較多,那么對內(nèi)存塊進行分裂,低地址的一塊分配給 應用程序,高地址的一塊仍然放入avail list中。如果搜索不到 適宜的空閑塊,m alloc返回void 3 0。 m free函數(shù)釋放內(nèi)存時,根據(jù)參數(shù)addr
11、給定的地址,在 used list中搜索相應的表元,找到后,將它標識的內(nèi)存塊釋放, 并插入到avail list中去。然后,在avail list中檢查是否有相 鄰的空閑塊,并進行空閑塊的合并。有三種不同的情況要分 別 處理:1左相鄰:相鄰塊在當前釋放塊的低地址端。 2右相 鄰:相鄰塊在當前釋放塊的高地址端。 3左右相鄰:當前釋放 塊的低地址端和局地址端都有相鄰塊。 在具體的分配算法上,文1 介紹了邊界標識法和伙伴系 統(tǒng)。前者直接將鏈表管理信息插入到內(nèi)存塊的前端和后端 ,回 收算法效率較高,但如果應用程序改寫了超出它所申請范圍的 內(nèi)存區(qū),那么會破壞整個數(shù)據(jù)結(jié)構(gòu),魯棒性差一些。后者是筆者 采用的
12、算法之一,但使用下來發(fā)現(xiàn)它沒有本文所描述的算法的 效率高,且容易形成很多內(nèi)存碎片。 4 LCD終端系統(tǒng)IP O LCD終端軟件是系統(tǒng)I/ O范疇的重要內(nèi)容,主要包括LCD 字符顯示英文8 X 16點陣,漢字16 X 16點陣,LCD繪圖點、 線、圓、面、位圖、圖形旋轉(zhuǎn)等 。320 X 240象素的LCD顯示器, 能顯示15行X 40列英文字符 或15行X 20列漢字字符,并基 本實現(xiàn)有較好分辨率的圖形/圖像的顯示。 LCD顯示的最根本程序是畫點程序,其原型如下: void LCDPixel int x , int y,char color 其中,x和y是點的坐標,坐標原點在左上角,color是
13、點的灰度。 字符和位圖的顯示利用了點陣方式。線、圓和面那么利用相 應的算法實現(xiàn)。圖形旋轉(zhuǎn)需要使用坐標變換函數(shù)。 這里要詳細介紹的是把LCD作為 英文字符型終端時的 相應軟件設計。把LCD作為字符型終端時,一個關(guān)鍵點是定義 好光標: static unsigned CurrentLine,CurrentColumn 這里CurrentLine和CurrentColumn分別定義了光標的橫坐 標和縱坐標坐標原點在左上角,取值范圍分別是0 39和 0 14,對應于橫行40個字符和縱列15個字符。 定義好光標后,每次向屏幕輸出字符時,總是從光標處開 始,這樣就保證了輸出的有序性和連貫性。 向屏幕輸出字
14、符串的根本函數(shù)是 Printf,其原型如下: void Printf (const char 3 fmt , ?) 這是一個可變參數(shù)函數(shù),功能上與printf標準庫函數(shù)完全相似。 為了實現(xiàn)可變參數(shù)的處理,要使用stdarg. h中定義一些宏。 Printf分析每個格式字符,并對各轉(zhuǎn)義字符(如 n, t, b , r , v等)進行相應處理。在屏幕的適宜位置打印格式化后的字 符串。Printf還調(diào)用一個滾屏函數(shù) ScreenScroll ,當光標位于末行 時讓屏幕向上滾動假設干行。 Printf函數(shù)不僅為LCD作為字符型終端提供了一個好的手 段,同時也為程序的調(diào)試提供了便利。我們可以在程序可能出
15、 錯的地方用Printf函數(shù)打印一些信息,這為我們對程序的跟蹤 提供了相當大的方便。Printf函數(shù)在嵌入式系統(tǒng)編程中使用是 十清楚顯的。 1) 使用ARM720T內(nèi)核中的MMU(內(nèi)存管理單元),可以把各物理上 分開的內(nèi)存塊映射成邏輯上連續(xù)的內(nèi)存空間。這樣,從編程角度看內(nèi) 存布局是連續(xù)的。這實際上是虛擬存儲的概念。 5 驅(qū)動程序設計 驅(qū)動程序包括最底層的中斷處理程序設計和建立在其上 的驅(qū)動程序設計兩個局部,其實現(xiàn)與具體的外圍設備有關(guān),復 雜性較大。這里只介紹用 C語言設計驅(qū)動程序時需要注意的 一些方面。 外圍硬件設備一般通過中斷與 CPU進行通信。中斷是一 種外部異步事件。在處理與中斷相關(guān)的變
16、量時 ,需要小心。通 常,編譯器的優(yōu)化選項翻開后,對變量的操作,將盡量安排在寄 (下轉(zhuǎn)第53頁) -16 - ? 1995-2004 Tsinghua Tongfang Optical Disc Co.,Ltd. All rights reserved. Energy3dlibInitialize(); MlfEnergy3d(pr Height,pr Width,pr Space,pr Intensity); mxDestroyArray(pr Length); mxDestroyArray(pr Space); mxDestroyArray(pr Intensity) ; ? 其中CSpo
17、t是為了方便分析而寫的描述微光斑各個屬性的 C+ 類。Energy3dlibTerminate()在 CMyApp 類的重載函數(shù) ExitIn 2 stance ()中調(diào)用。 要特別注意:1)傳遞的矩陣大小必須相匹配,要不然運行 時會出錯。2)注意數(shù)據(jù)數(shù)組下標,MATLAB 數(shù)組是按列存儲 的,而VC中是按行存儲的。 2) 微光斑能量分布圖 上述代碼繪制的微光斑某個截面和三維能量分布圖見圖 3、圖 4。 圖3微光斑截面能量分布圖圖4微光斑三維能量分布圖 5 結(jié)論 由微光斑分析軟件的實例可以看出本文提出的用 Microsoft Visual C+編寫光學測量分析軟件的主要局部,而經(jīng)常涉及到 的光
18、能量二維及三維分布圖那么由 VC調(diào)用MATLAB 編寫、編譯 生成的C/ C+ Shared Library(DLL) 繪制的方法不僅可以完全脫 離MATLAB 運行環(huán)境,可以根據(jù)需要傳遞參數(shù),而且確實非常 簡單方便、可視性強,從而也有利于光學分析。同時這種方法 也可以應用于光學以外的其它領域,提高編程速度,縮短開發(fā) 周期。 參考文獻 1 MathWorks 公司主頁, : II mathworks. com. 2潘衛(wèi)明、趙敏、張進芳,VC+下如何利用MATLAB工具箱進行數(shù)字 信號處理 ,計算機與信息技術(shù)?,2000 ,91 3 齊波、董能力“,通過VC+調(diào)用MATLAB ,計算機世界?,2
19、000 ,291 4 亓波、董能力“,實現(xiàn)Visual C+ 610與MATLAB的混合編程 ,電腦 編程技巧與維護1 2000 ,12 :621 5 薛定宇,科學運算語言MATLAB5 13程序設計與應用,北京:清華大 學出版社,20001 (上接第16頁)存器中。中斷效勞程序常常通過改變一些全 局變量來通知應用程序某個外部事件已經(jīng)發(fā)生 ,這些全局變量 是不應該被優(yōu)化的。解決的方法是在聲明變量時加上 volatile 修飾符,以通知編譯器這是一個可能被異步事件改變的量。這 個問題看似簡單,但如果不注意,實際運行時,程序?qū)⒊霈F(xiàn)錯 誤,且調(diào)試時很難定位故障。 運行效率是設計驅(qū)動程序的另外一個問題
20、。中斷比擬頻 繁的外設,其中斷處理程序的速度對整個系統(tǒng)的性能影響是很 大的。這些模塊應該直接用匯編語言編寫,并盡可能優(yōu)化算 法。 C語言的編寫風格也要為效率考慮。例如對數(shù)組元素的 操作 “ Array idx P4 = & 1 ;就不如改為 “ Array idx 2 = & 1 ;這里。 是移位運算,有相應的機器指令,而“/ 是除 法運算,算法要復雜得多。當然,先進的編譯器一般能優(yōu)化這 類的語句,但不能保證所有編譯器都有此功能。 6 應用程序設計 嵌入式裸平臺上的應用程序設計也有與 PC機上的應用程 序設計不同的地方,需要格外注意。 首先,但凡由需操作系統(tǒng)支持的標準庫函數(shù)均不
21、能使用 , 除非自己編寫(如m alloc和m free)。 其次,由于內(nèi)存資源有限,棧容量有限且不能自動擴展,使 用時要格外小心。常常能見到這樣的局部變量的應用 : int buf 2048 其目的是要申請一個2048word(8192Byte)的緩沖區(qū),對于嵌 入式系統(tǒng)來說,開銷過于龐大。同時,??臻g中用于嵌套調(diào)用 的開銷是不可見的,在嵌套層數(shù)較多時尤其如此。一下子申請 這么大的棧空間,對系統(tǒng)是一個大的挑戰(zhàn),搞不好系統(tǒng)會崩潰。 我們可以采用類似于下面的替代方式 : int 3 buf ; if ( (buf = m alloc (2048 3 sizeof (int) ) ) = = NULL) return ERROR; P3 other processing3P m free (buf); ? 堆的操作比棧
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 肉牛投放協(xié)議書
- 船只安全協(xié)議書
- 聯(lián)勤保障協(xié)議書
- 有機肥授權(quán)銷售協(xié)議書
- 碰壞東西協(xié)議書
- 繼母分錢協(xié)議書
- 花園修剪協(xié)議書
- 肉雞飼養(yǎng)協(xié)議書
- 地下室拆模合同協(xié)議書
- 聯(lián)合展覽協(xié)議書
- 成人患者營養(yǎng)不良診斷與應用指南(2025版)解讀課件
- 十五五時期經(jīng)濟社會發(fā)展座談會十五五如何謀篇布局
- 遵義市購房合同協(xié)議
- 2024年四川省天全縣事業(yè)單位公開招聘醫(yī)療衛(wèi)生崗筆試題帶答案
- 【7語期中】合肥市包河區(qū)2024-2025學年七年級下學期4月期中語文試題
- (三診)成都市2022級高中高三畢業(yè)班第三次診斷性檢物理試卷(含答案)
- 香港借貸合同協(xié)議
- 酒店消防安全知識培訓
- 經(jīng)營崗位筆試題目及答案
- 農(nóng)行反洗錢與制裁合規(guī)知識競賽考試題庫大全-上下
- DGTJ08-202-2020鉆孔灌注樁施工規(guī)程 上海市
評論
0/150
提交評論