官术网_书友最值得收藏!

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。

主站蜘蛛池模板: 隆化县| 乐昌市| 嘉兴市| 固安县| 华池县| 抚松县| 本溪| 乌海市| 肥西县| 彩票| 伊川县| 河北省| 玉环县| 浠水县| 龙胜| 广昌县| 安西县| 拉孜县| 衢州市| 沙洋县| 克山县| 特克斯县| 安吉县| 松原市| 榆社县| 司法| 会理县| 普宁市| 鸡西市| 贡觉县| 临颍县| 泰顺县| 陵水| 界首市| 重庆市| 九江县| 图木舒克市| 天峨县| 漠河县| 嵊州市| 香格里拉县|