教材:嵌入式系統及應用,羅蕾、李允、陳麗蓉等,電子工業出版社
ARM 程序設計
- 由於 C 語言便於理解,有大量的支持庫,所以它是當前 ARM 程序設計所使用的主要編程語言
- 對硬件系統的初始化、CPU 狀態設定、中斷使能、主頻設定以及 RAM 控制參數初始化等 C 程序力所不能及的底層操作,還是要由彙編語言程序來完成
- ARM 程序通常是 C/C++ 語言和彙編語言的混合程序
ARM 工程
- 一個ARM工程應由多個文件組成,其中包括
- 擴展名為 .S 的彙編語言源文件
- 擴展名為 .C 的C語言源文件
- 擴展名為 .CPP 的C++源文件
- 擴展名為 .H 的頭文件等
- 各種源文件之間的關係
- ARM 編譯器生成的文件
- 各種源文件先由編譯器和彙編器將它們分別編譯或彙編成彙編語言文件及目標文件
- 鏈接器負責將所有目標文件連接成一個文件並確定各指令的確定地址,從而形成最終可執行文件
- 鏈接器的功能
- 生成與地址相關的代碼,把所有文件連接成一個可執行文件
- 根據程序員所指定的選項,為程序分配地址空間
- 給出鏈接信息,以説明鏈接過程和結果
ARM 程序框架
- 通常彙編語言部分完成系統硬件的初始化;高級語言部分完成用户的應用
- 執行時,首先執行初始化部分,然後再跳轉到 C/C++部分
初始化程序部分
- 完成初始化任務的彙編語言程序中需要在特權模式下做一些諸如修改 CPSR 等特權操作
- 初始化過程經理經歷的模式變化
- 這部分代碼也稱為啓動代碼
初始化部分與主應用程序部分的銜接
- 當所有的系統初始化工作完成之後,就需要把程序流程轉入主應用程序
- 最簡單的方法是,在彙編語言程序末尾使用跳轉指令 B 或 BL 直接從啓動代碼轉移到 C/C++ 程序入口,如
BL main - 符號
main是C文件中定義的函數名,故在彙編文件中需要用 IMPORT 加以聲明 - 目標符號也不一定是
main,可以是用户定義的其他符號 - 銜接的彙編程序
IMPORT main ;聲明外部引用符號
AREA Init, CODE, READONLY ;代碼段
ENTRY ;程序入口
LDR R0, = 0X3FF0000 ;初始化寄存器
LDR R1, = 0XE7FFFF80
STR R1, [R0]
LDR SP, = 0X3EE1000 ;初始化用户堆棧段
BL main ;跳轉main處的C/C++代碼
END ;彙編結束
- 銜接的C程序
void main()
{
....
}
ARM 開發環境提供的程序框架
- 為方便工程開發,ARM 公司的開發環境 ARM ADS 為用户提供了一個可以選用的應用程序框架
- 該框架把為用户程序做準備工作的程序分成了啓動代碼和應用程序初始化兩部分
- 用於硬件初始化的彙編語言部分叫做啓動代碼
- 用於應用程序初始化的 C 部分叫做初始化部分
_main()主要完成庫函數的初始化,且該函數中聲明瞭用户函數名為main,故用户程序的函數名必須為main
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。