- 深入理解嵌入式Linux設(shè)備驅(qū)動(dòng)程序
- 曹國(guó)輝 曾志鵬
- 1729字
- 2018-12-29 12:02:38
1.1 嵌入式ARM系統(tǒng)開發(fā)概述
嵌入式ARM系統(tǒng)開發(fā)是指在ARM裸機(jī)上進(jìn)行開發(fā),在ARM上沒(méi)有“跑”任何操作系統(tǒng)和驅(qū)動(dòng),全部由自己編程實(shí)現(xiàn),相當(dāng)于把ARM當(dāng)做高級(jí)單片機(jī)來(lái)使用。下面介紹嵌入式ARM系統(tǒng)開發(fā)的一些基礎(chǔ)知識(shí)。
1.1.1 ARM系統(tǒng)可執(zhí)行映像文件格式
ARM系統(tǒng)的可執(zhí)行映像文件格式主要有ELF(.elf)、AXF(.axf),和BIN(.bin),下面對(duì)這三種映像格式文件分別進(jìn)行介紹。
ELF:Linux操作系統(tǒng)下可執(zhí)行映像文件格式,在Linux環(huán)境下用GCC編譯器生成的可執(zhí)行映像文件格式即為ELF格式,在Linux操作系統(tǒng)下可直接運(yùn)行。
AXF:ARM的調(diào)試文件,由ARM集成開發(fā)工具ADS生成,除了包括可執(zhí)行代碼外,還包括其他調(diào)試信息,用于ADS調(diào)試。
BIN:真正的可執(zhí)行文件,包括ARM可執(zhí)行的指令和數(shù)據(jù),可以使用相關(guān)工具(Objcopy)從ELF文件中生成,寫到FLASH或RAM中可直接運(yùn)行。
ARM中的各種源文件(包括匯編文件、C語(yǔ)言程序及C++程序等)經(jīng)過(guò)ARM編譯器編譯后生成ELF(Executable and Linking Format)格式的目標(biāo)文件。這些目標(biāo)文件和相應(yīng)的C/C++運(yùn)行時(shí)所用到的庫(kù)經(jīng)過(guò)ARM連接器處理后,生成ELF格式的映像文件(Image),這種ELF格式的映像文件是一種可執(zhí)行文件。
BIN文件是真正的可執(zhí)行文件。AXF文件是ARM的調(diào)試文件,除了包含BIN的內(nèi)容之外,還附加了其他的調(diào)試信息。這些調(diào)試信息加在可執(zhí)行的二進(jìn)制數(shù)據(jù)的前面,所以把AXF文件寫到ARM的指令執(zhí)行地址(一般是0x0)將不能運(yùn)行;因?yàn)樵诖说刂非皫资畟€(gè)字節(jié)的數(shù)據(jù)不是可執(zhí)行的二進(jìn)制數(shù)據(jù),而是頭部的調(diào)試信息。而BIN文件正是去掉了調(diào)試信息的可以執(zhí)行的“精華”部分。
可執(zhí)行映像文件主要分為3個(gè)段,即RO段、RW段和ZI段,如下圖所示。

· RO段:只讀代碼段;
· RW段:RW區(qū)域放的是已賦值(賦0除外)的全局變量;
· ZI段:ZI區(qū)域放的是未賦值的全局變量或初始化為0的全局變量。
1.1.2 ARM開發(fā)調(diào)試工具
ARM公司為ARM系統(tǒng)的開發(fā)提供了圖形化的集成開發(fā)環(huán)境——ADS,目前使用的版本是ADS1.2; ADS提供了項(xiàng)目代碼管理、編輯、編譯等功能。關(guān)于ADS的使用,讀者可參考其他相關(guān)資料,這里主要介紹一些ARM的調(diào)試系統(tǒng)框架及基本原理。
ARM芯片本身提供了在線調(diào)試功能,這使得我們可以在線進(jìn)行實(shí)時(shí)調(diào)試,不需要再像其他單片機(jī)那樣使用仿真器進(jìn)行開發(fā)調(diào)試。ARM CPU提供了JTAG接口,通過(guò)JTAT接口我們可以給ARM發(fā)送調(diào)試命令,實(shí)現(xiàn)訪問(wèn)ARM內(nèi)部的指令寄存器和數(shù)據(jù)寄存器,暫停程序的執(zhí)行等調(diào)試功能。同時(shí)通過(guò)JTAG接口,我們可以燒寫程序到系統(tǒng)的Nor FLASH或Nand FLASH上。ARM的在線調(diào)試功能正是通過(guò)JTAG口來(lái)實(shí)現(xiàn)的,典型的ARM系統(tǒng)調(diào)試框圖如下圖所示。

典型的ARM調(diào)試系統(tǒng)主要分為三部分:調(diào)試主機(jī)、協(xié)議轉(zhuǎn)換器(調(diào)試代理)、目標(biāo)機(jī)系統(tǒng)(調(diào)試目標(biāo))。調(diào)試主機(jī)一般是一臺(tái)運(yùn)行調(diào)試軟件(如ADS)的計(jì)算機(jī)。調(diào)試主機(jī)可以發(fā)出一些高層的調(diào)試命令,如設(shè)置斷點(diǎn)、訪問(wèn)內(nèi)存等。
協(xié)議轉(zhuǎn)換器(如MULTI-ICE)用來(lái)將調(diào)試主機(jī)發(fā)出的高層調(diào)試命令轉(zhuǎn)換為底層的ARM JTAG調(diào)試命令。
調(diào)試目標(biāo)一般就是指基于ARM內(nèi)核MCU目標(biāo)開發(fā)板。經(jīng)過(guò)協(xié)議轉(zhuǎn)換器進(jìn)行命令解釋,主機(jī)上運(yùn)行的調(diào)試軟件就可以通過(guò)JTAG接口直接和ARM內(nèi)核對(duì)話。通過(guò)掃描鏈,可以把ARM/THUMB指令插入到ARM的指令流水線當(dāng)中去執(zhí)行。通過(guò)插入特定的ARM指令,我們可以檢查、保存或者改變內(nèi)核和系統(tǒng)的狀態(tài)。為了支持底層的調(diào)試,ARM處理器提供了硬件上的調(diào)試擴(kuò)展。這些調(diào)試擴(kuò)展包括:
· 停止程序的運(yùn)行;
· 檢查和修改ARM920T的內(nèi)核狀態(tài);
· 觀察和修改內(nèi)存;
· 恢復(fù)程序的運(yùn)行。
1.1.3 加載地址和運(yùn)行地址
由于ARM系統(tǒng)開發(fā)的應(yīng)用程序在運(yùn)行和沒(méi)有運(yùn)行時(shí)所在的位置可能不一樣,例如,應(yīng)用程序沒(méi)有運(yùn)行時(shí)存放在Nand FLASH中,運(yùn)行時(shí)被搬到RAM中執(zhí)行,所以就引出了加載地址(應(yīng)用程序的加載)和運(yùn)行地址(應(yīng)用程序的運(yùn)行)的概念。
· 加載地址:映像文件位于存儲(chǔ)器(還沒(méi)有運(yùn)行,一般在ROM中,也可以在RAM中)時(shí)的地址;
· 運(yùn)行地址:映像文件運(yùn)行時(shí)的地址。
應(yīng)用程序的加載和運(yùn)行地址在應(yīng)用程序鏈接時(shí)通過(guò)鏈接選項(xiàng)指定,如下圖所示。

看看ADS開發(fā)文檔ARM Developer suite 1.2中的ADS_CodeWarriorIDEGuide.pdf怎么說(shuō)的:
RO Base This text field sets both the load address and execution address of the region containing the RO
section. If you do not enter a value, the value defaults to 0x8000。
從ADS的幫助文檔知道,RO Base設(shè)置的是加載地址和運(yùn)行地址,在這里加載地址和運(yùn)行地址是一致的,通過(guò)ADS調(diào)試裸機(jī)程序時(shí),映像文件首先要加載到目標(biāo)板的內(nèi)存中。
ADS鏈接器預(yù)定義如下變量來(lái)表示應(yīng)用程序運(yùn)行時(shí)的地址,ADS的預(yù)定義變量和含義分別如下:
· |Image$$RO$$Base| :RO段起始地址;
· |Image$$RO$$Limit| :RO段結(jié)束地址加1;
· |Image$$RW$$Base| :RW段起始地址;
· |Image$$RW$$Limit| :RW段結(jié)束地址加1;
· |Image$$ZI$$Base| :ZI段起始地址;
· |Image$$ZI$$Limit| :ZI段結(jié)束地址加1。
- Windows Server 2019 Cookbook
- Implementing Cisco UCS Solutions
- Linux操作系統(tǒng)基礎(chǔ)
- Mobile-first Bootstrap
- Extending Bootstrap
- Linux就該這么學(xué)
- 移動(dòng)應(yīng)用UI設(shè)計(jì)模式(第2版)
- 嵌入式系統(tǒng)原理及開發(fā)
- 精解Windows 10
- Hadoop Real-World Solutions Cookbook
- 完美應(yīng)用Ubuntu(第2版)
- 電腦辦公(Windows 10 + Office 2016)入門與提高(超值版)
- Mastering Azure Serverless Computing
- 每天5分鐘玩轉(zhuǎn)Docker容器技術(shù)
- BuddyPress Theme Development