一般的嵌入式系統在主程序執行之前都需要執行一些初始化的過程以創造嵌入式程序運行的環境,尤其是一些高級的嵌入式系統,由于核心芯片使用內存映射、內存保護等機制以及編程使用高級語言 C,C++ 甚至 JAVA 語言,都需要先創建一個適合程序運行的硬件環境,然后初始化或者配置或者剪裁 run-time library, 這些工作都必須在主程序運行前完成,所以一個 startup 程序或者程序組對于一個嵌入式系統來說是非常重要的。要編寫 startup 程序,需要對編譯器、鏈接器和匯編器的細節有一定的了解,同時對 ARM 芯片硬件本身的地址分配以及 memory mapping 機制也需要有一些了解。
2 ARM 程序的工作過程
首先由各種 source file 經過編譯產生 object 文件,然后 object 文件經過鏈接生成 Image 文件,然后通過 ICE 的方法,根據描述文件的指定下載到目標板上的固態存儲器指定地址當中,比如 flash , EEPROM, ROM 等等。在程序執行之前,根據某些描述文件,將需要讀寫數據的部分讀出放入動態存儲器比如 RAM 當中,然后程序從 ROM 開始執行;蛘哂袝r為了提高程序的運行速度,也可以將所有的程序 ( 有一些 root 的部分除外,以后會提及 ) 通過一個描述文件放入指定的 RAM 當中,然后程序從 RAM 開始執行,但是這樣會耗費大量的動態存儲器,所以大部分程序會取折中的方法,將需要快速運行的部分和要讀寫的部分放入 RAM 中 ( 一般讀固態存儲器的過程和動態存儲器的過程是一樣的,但是寫就不同了,所以讀寫的部分一定要放到 RAM 中 ) ,而只讀的部分和對速度要求不是那么高的部分放入固態存儲器。同時 ARM 結構的異常向量表規定放在地址為 0x00000000 開始的地址空間上,而一般的 CPU 為了提高異常相應速度,會將這個向量段 remap 到其他的 RAM 當中,所以在描述文件當中必須精確指定異常向量跳轉程序的地址到 remap 的地方。在 application 程序執行前,還需要由一些文件描述 application 程序執行的環境。比如系統工作時鐘,總線頻率,F在一般嵌入式編程語言為 C,C++ 等。如果在使用它們的時候使用的 runtime-library ,那么在程序執行前還需要為這些庫函數初始化 heap 。然后 ARM 可能工作在不同的模式,還需要為不同的工作模式設置 stack 。這樣,描述鏈接地址的文件,以及在 application 運行前所有的初始化程序就是 startup 程序組
3 STARTUP 分類
這樣,將 startup 程序所完成的功能分類。一類是鏈接地址描述,一類是各種初始化的程序。根據不同的應用,描述文件和初始化程序的內容以及結構和復雜程度都會不同。但是基本上,它們都必須實現以下功能。
3.1 描述文件實現功能
描述文件可以是鏈接命令行上簡單的幾個字符,也可以是一個非常復雜的文件,但是它必須完成如下功能:
; 指定程序下載的地址
; 指定程序執行的地址
3.2 初始化程序實現的功能
初始化程序根據不同的應用,其結構和復雜度也不同,但是它必須完成如下基本功能:
; 異常向量初始化
; 內存環境初始化
; 其他硬件環境初始化
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/