arm開發(fā)經(jīng)驗!(適合初學(xué)者入門)
前一段時間做了arm的一些開發(fā),主要是編寫了arm的啟動軟件和移植了uCOS-II到arm7。我做事情喜歡深入簡出,及從最簡單,最原理的方面先做一個框架,然后在這個框架里面進行補充。我還是一個很喜歡和別人討論的人,希望有人可以給我提出意見和建議。我的這個心得很初級,都是一些基本的東西。現(xiàn)在拿出來和大家分享,希望在我畢業(yè)之前能給大家留一些紀(jì)念。^_^
由于這些東西發(fā)paper實在是沒有價值,但是我感覺可以作為arm開發(fā)的入門。由于我的水平和經(jīng)驗有限,錯誤也是難免的。但是如果不拿出來和大家分享, 就算有錯誤我也發(fā)現(xiàn)不了,是么?呵呵。我現(xiàn)試試發(fā)連載的第一篇,看看有多少價值,如果大家覺得有價值,我會繼續(xù)連載的。
連載一:
前言
這個文檔是我學(xué)習(xí)ARM編程的總結(jié)和心得。閱讀這個文檔的人應(yīng)當(dāng)首先閱讀ADS1.2的幫助文檔及相關(guān)內(nèi)容。這個文檔不會對編譯器及連接器做出詳細的說明, 在需要的時候會指出具體內(nèi)容在相關(guān)資料的章節(jié)。同時閱讀這個文檔的人需要了解ARM指令集和一些ARM匯編的基本內(nèi)容以及C和C++的相關(guān)編程內(nèi)容。同時還需要了解ARM的流水線結(jié)構(gòu)及一些基本的編程知識。同時為了方便查閱英文文檔,所有的相關(guān)術(shù)語都使用英文原文
第一章 STARTUP
1 ARM的啟動
一般的嵌入式系統(tǒng)在主程序執(zhí)行之前都需要執(zhí)行一些初始化的過程以創(chuàng)造嵌入式程序運行的環(huán)境,尤其是一些高級的嵌入式系統(tǒng),由于核心芯片使用內(nèi)存映射、內(nèi)存保護等機制以及編程使用高級語言C,C++甚至JAVA語言,都需要先創(chuàng)建一個適合程序運行的硬件環(huán)境,然后初始化或者配置或者剪裁run-time library, 這些工作都必須在主程序運行前完成,所以一個startup程序或者程序組對于一個嵌入式系統(tǒng)來說是非常重要的。要編寫startup程序,需要對編譯器、鏈接器和匯編器的細節(jié)有一定的了解,同時對ARM芯片硬件本身的地址分配以及memory mapping機制也需要有一些了解。
2 ARM 程序的工作過程
首先由各種source file經(jīng)過編譯產(chǎn)生object文件,然后object文件經(jīng)過鏈接生成Image文件,然后通過ICE的方法,根據(jù)描述文件的指定下載到目標(biāo)板上的固態(tài)存儲器指定地址當(dāng)中,比如flash,EEPROM, ROM等等。在程序執(zhí)行之前,根據(jù)某些描述文件,將需要讀寫數(shù)據(jù)的部分讀出放入動態(tài)存儲器比如RAM當(dāng)中,然后程序從ROM開始執(zhí)行?;蛘哂袝r為了提高程序的運行速度,也可以將所有的程序(有一些root的部分除外,以后會提及)通過一個描述文件放入指定的RAM當(dāng)中,然后程序從RAM開始執(zhí)行,但是這樣會耗費大量的動態(tài)存儲器,所以大部分程序會取折中的方法,將需要快速運行的部分和要讀寫的部分放入RAM中(一般讀固態(tài)存儲器的過程和動態(tài)存儲器的過程是一樣的,但是寫就不同了,所以讀寫的部分一定要放到RAM中),而只讀的部分和對速度要求不是那么高的部分放入固態(tài)存儲器。同時ARM結(jié)構(gòu)的異常向量表規(guī)定放在地址為0x00000000開始的地址空間上,而一般的CPU為了提高異常相應(yīng)速度,會將這個向量段remap到其他的RAM當(dāng)中,所以在描述文件當(dāng)中必須精確指定異常向量跳轉(zhuǎn)程序的地址到remap的地方。在application程序執(zhí)行前,還需要由一些文件描述application程序執(zhí)行的環(huán)境。比如系統(tǒng)工作時鐘,總線頻率?,F(xiàn)在一般嵌入式編程語言為C,C++等。如果在使用它們的時候使用的runtime-library,那么在程序執(zhí)行前還需要為這些庫函數(shù)初始化heap。然后ARM可能工作在不同的模式,還需要為不同的工作模式設(shè)置stack。這樣,描述鏈接地址的文件,以及在 application運行前所有的初始化程序就是startup程序組
3 STARTUP分類
這樣,將startup程序所完成的功能分類。一類是鏈接地址描述,一類是各種初始化的程序。根據(jù)不同的應(yīng)用,描述文件和初始化程序的內(nèi)容以及結(jié)構(gòu)和復(fù)雜程度都會不同。但是基本上,它們都必須實現(xiàn)以下功能。
3.1 描述文件實現(xiàn)功能
描述文件可以是鏈接命令行上簡單的幾個字符,也可以是一個非常復(fù)雜的文件,但是它必須完成如下功能:
; 指定程序下載的地址
; 指定程序執(zhí)行的地址
3.2 初始化程序?qū)崿F(xiàn)的功能
初始化程序根據(jù)不同的應(yīng)用,其結(jié)構(gòu)和復(fù)雜度也不同,但是它必須完成如下基本功能:
; 異常向量初始化
; 內(nèi)存環(huán)境初始化
; 其他硬件環(huán)境初始化