嵌入式系統(tǒng)程序設(shè)計(jì)_第1頁(yè)
嵌入式系統(tǒng)程序設(shè)計(jì)_第2頁(yè)
嵌入式系統(tǒng)程序設(shè)計(jì)_第3頁(yè)
嵌入式系統(tǒng)程序設(shè)計(jì)_第4頁(yè)
嵌入式系統(tǒng)程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩128頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

任課教師:栗華課號(hào):0123305810-100嵌入式系統(tǒng)原理及應(yīng)用教程第四章嵌入式系統(tǒng)程序設(shè)計(jì)本章包含嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)介紹,嵌入式匯編程序設(shè)計(jì),嵌入式C語(yǔ)言程序設(shè)計(jì)及混合編程。本章內(nèi)容4.1嵌入式系統(tǒng)開(kāi)發(fā)流程4.2ARM開(kāi)發(fā)軟件及實(shí)用工具介紹4.3ARM匯編語(yǔ)言程序設(shè)計(jì)根底4.4ARMC語(yǔ)言程序設(shè)計(jì)及混合編程1、嵌入式系統(tǒng)開(kāi)發(fā)根本流程嵌入式開(kāi)發(fā)的具體過(guò)程:系統(tǒng)定義與需求分析階段方案設(shè)計(jì)階段詳細(xì)設(shè)計(jì)階段軟硬件集成測(cè)試階段系統(tǒng)功能性能測(cè)試及可靠性測(cè)試階段4.1嵌入式系統(tǒng)開(kāi)發(fā)流程開(kāi)發(fā)流程圖2.嵌入式軟件開(kāi)發(fā)環(huán)境嵌入式開(kāi)發(fā)環(huán)境組成交叉開(kāi)發(fā)環(huán)境軟件模擬環(huán)境目標(biāo)板與評(píng)估板

交叉開(kāi)發(fā)環(huán)境嵌入式系統(tǒng)應(yīng)用軟件的開(kāi)發(fā)屬于跨平臺(tái)開(kāi)發(fā),因此需要一個(gè)交叉開(kāi)發(fā)環(huán)境。交叉開(kāi)發(fā)是指在一臺(tái)通用計(jì)算機(jī)上進(jìn)行軟件的編輯編譯,然后下載到嵌入式設(shè)備中運(yùn)行調(diào)試的開(kāi)發(fā)方式,它通常采用宿主機(jī)/目標(biāo)機(jī)模式。用來(lái)開(kāi)發(fā)的通用計(jì)算機(jī)可以選用比較常見(jiàn)的PC機(jī)等,運(yùn)行通用的Windows等操作系統(tǒng)。開(kāi)發(fā)計(jì)算機(jī)一般稱宿主機(jī),嵌入式設(shè)備稱為目標(biāo)機(jī),在宿主機(jī)上編譯好的程序,下載到目標(biāo)機(jī)上運(yùn)行,交叉開(kāi)發(fā)環(huán)境提供調(diào)試工具對(duì)目標(biāo)機(jī)上運(yùn)行的程序進(jìn)行調(diào)試。交叉開(kāi)發(fā)環(huán)境交叉開(kāi)發(fā)環(huán)境一般由運(yùn)行于宿主機(jī)上的交叉開(kāi)發(fā)軟件、宿主機(jī)到目標(biāo)機(jī)的調(diào)試通道組成。運(yùn)行于宿主機(jī)上的交叉開(kāi)發(fā)軟件最少必須包含編譯調(diào)試模塊,其編譯器為交叉編譯器。作為宿主機(jī)的一般為基于x86體系的桌上型計(jì)算機(jī),而編譯出的代碼必須在目標(biāo)機(jī)處理器體系結(jié)構(gòu)上運(yùn)行,這就是所謂的交叉編譯了。在宿主機(jī)上編譯好目標(biāo)代碼后,通過(guò)宿主機(jī)到目標(biāo)機(jī)的調(diào)試通道將代碼下載到目標(biāo)機(jī),然后由運(yùn)行于宿主機(jī)的調(diào)試軟件控制代碼在目標(biāo)機(jī)上運(yùn)行調(diào)試。遠(yuǎn)程調(diào)試結(jié)構(gòu)圖3.嵌入式應(yīng)用軟件開(kāi)發(fā)的根本流程

嵌入式軟件開(kāi)發(fā)流程圖鏈接器命令文件編譯預(yù)處理編譯器匯編器Archive工具鏈接器和定位器頭文件(*.h,*.hpp)可重定位目標(biāo)文件庫(kù)文件(*.a,*.lib)頭文件(*.h,*.hpp)C/C++源代碼匯編源代碼源文件列表源文件列表源代碼編輯階段

源文件編

譯階段鏈接與重定位調(diào)試與下載階段重定位文件表(*.o,*.a)共享目標(biāo)文件(*.o,*.a)可執(zhí)行映象(*.elf,*.coff)鏈接映射文件(*.map)設(shè)備程序員目標(biāo)開(kāi)發(fā)系統(tǒng)軟件模擬環(huán)境也稱為指令集模擬器IIS〔InstructionSetSimulator〕,在很多時(shí)候?yàn)楸WC工程進(jìn)度,硬件和軟件開(kāi)發(fā)往往同時(shí)進(jìn)行,這時(shí)作為目標(biāo)機(jī)的硬件環(huán)境還沒(méi)有建立起來(lái),軟件的開(kāi)發(fā)就需要一個(gè)模擬環(huán)境來(lái)進(jìn)行調(diào)試。模擬開(kāi)發(fā)環(huán)境建立在交叉開(kāi)發(fā)環(huán)境根底之上,是對(duì)交叉開(kāi)發(fā)環(huán)境的補(bǔ)充。這時(shí),除了宿主機(jī)和目標(biāo)機(jī)之外,還需要提供一個(gè)在宿主機(jī)上模擬目標(biāo)機(jī)的環(huán)境,使得開(kāi)發(fā)好的程序直接在這個(gè)環(huán)境里運(yùn)行調(diào)試。軟件模擬環(huán)境應(yīng)用目標(biāo)板是系統(tǒng)最終的電路板。評(píng)估板(EVM板〕一般用來(lái)作為開(kāi)發(fā)者使用的學(xué)習(xí)板、實(shí)驗(yàn)板,可以作為應(yīng)用目標(biāo)板出來(lái)之前的軟件測(cè)試、硬件調(diào)試的電路板。開(kāi)發(fā)評(píng)估電路板并不是嵌入式應(yīng)用開(kāi)發(fā)必須的,對(duì)于有經(jīng)驗(yàn)的工程師完全可以自行獨(dú)立設(shè)計(jì)自己的應(yīng)用電路板和根據(jù)開(kāi)發(fā)需要設(shè)計(jì)實(shí)驗(yàn)板。好的評(píng)估電路板一般文檔齊全,對(duì)處理器的常用功能模塊和主流應(yīng)用都有硬件實(shí)現(xiàn),并提供電路原理圖和相關(guān)開(kāi)發(fā)例程與源代碼供用戶設(shè)計(jì)自己的應(yīng)用目標(biāo)板和應(yīng)用程序作參考。目標(biāo)板與評(píng)估板在嵌入式軟件的開(kāi)發(fā)過(guò)程中,在確保軟件的正確性、實(shí)時(shí)性的前提下,必須關(guān)注軟件的可移植性和可重用性。??梢浦残院涂芍赜眯缘某潭葢?yīng)該根據(jù)實(shí)際的應(yīng)用情況來(lái)考慮。因?yàn)榍度胧綉?yīng)用軟件有自身的許多特點(diǎn)。追求過(guò)高的可移植性和可重用性可能會(huì)惡化應(yīng)用軟件的實(shí)時(shí)性能和增加軟件的代碼量,這對(duì)于資源有限的嵌入式應(yīng)用環(huán)境是得不償失的。我們可以在資源有限、滿足系統(tǒng)的需求的情況下盡可能把可移植性和可重用性作為第二目標(biāo),致力于開(kāi)發(fā)正確性、實(shí)時(shí)性能、代碼量、可移植性和可重用性相對(duì)均衡的嵌入式應(yīng)用軟件。4.嵌入式軟件開(kāi)發(fā)的可移植性和可重用性

4.嵌入式軟件開(kāi)發(fā)的可移植性和可重用性提高應(yīng)用軟件的可移植性和可重用性的方法:多用高級(jí)語(yǔ)言少用匯編語(yǔ)言將不可移植局部局域化提高代碼的可重用性提高代碼的可重用性一、編譯器介紹1、ADS1.2

2、ARM

REALVIEW

DEVELOPER

SUITE3、IAR

EWARM4、KEIL

ARM-MDKARM5、WINARM

(GCCARM)二、相關(guān)開(kāi)發(fā)工具介紹1、簡(jiǎn)易的JTAG制作2、H-JTAG調(diào)試代理3、LPC2000系列ISP工具4、Macraigor

Systems

Wiggler

調(diào)試工具5、J-LINK6、U-LINK

4.21、ADS1.2

ADS〔ARMDeveloperSuite〕,是在1993年由Metrowerks公司開(kāi)發(fā)是ARM處理器下最主要的開(kāi)發(fā)工具。他的前身是SDT,SDT是ARM公司幾年前的開(kāi)發(fā)環(huán)境軟件,目前SDT早已經(jīng)不再升級(jí)。ADS包括了四個(gè)模塊分別是:SIMULATOR;C

編譯器;實(shí)時(shí)調(diào)試器;應(yīng)用函數(shù)庫(kù)。ADS對(duì)匯編、C/C++、java支持的均很好,是目前最成熟的ARM開(kāi)發(fā)工具。很多ARM開(kāi)發(fā)軟件〔例如Keil〕也是借用的ADS的編譯器。ADS在2006年版本已經(jīng)發(fā)布到2.2。但國(guó)內(nèi)大局部開(kāi)發(fā)者使用的均是1.2版本一、編譯器介紹ADS1.2提供完整的WINDOWS界面開(kāi)發(fā)環(huán)境。C編譯器效率高,支持c

以及c++。提供軟件模擬仿真功能,使沒(méi)有Emulators的學(xué)習(xí)者也能夠熟悉ARM的指令系統(tǒng)。配合FFT-ICE使用,ADS1.2提供強(qiáng)大的實(shí)時(shí)調(diào)試跟蹤功能,片內(nèi)運(yùn)行情況盡在掌握。ADS1.2需要硬件支持才能發(fā)揮強(qiáng)大功能。目前支持的硬件調(diào)試器有Multi-ICE以及兼容Multi-ICE的調(diào)試工具如FFT-ICE。版本:ADS1.2

軟件大?。?30M

下載地址:ARMRealViewDeveloperSuite(RVDS)是ARM公司繼ARMDeveloperSuite(ADS1.2)之后推出的新一代開(kāi)發(fā)工具,是業(yè)界公認(rèn)最好的ARM編譯器之一。它由RealView編譯器(RVCT),以及RealView調(diào)試器〔RVDebugger〕,CodeWarrior集成開(kāi)發(fā)環(huán)境和ARMulator指令集仿真器組成。可以支持所有標(biāo)準(zhǔn)ARM架構(gòu)和內(nèi)核,針對(duì)特定處理器進(jìn)行代碼優(yōu)化,有多種可以靈活配置的優(yōu)化選項(xiàng)以取得最小的代碼尺寸和最好的性能。2、ARMRealViewDeveloperSuite(RVDS)

RealViewICE主要特點(diǎn):高性能的調(diào)試控制通過(guò)RealViewDebugger代碼下載速度可達(dá)1300Kbytes/秒高速單步執(zhí)行,每秒可達(dá)100支持JTAG調(diào)試通信通道(DCC)支持多種JTAG時(shí)鐘頻率,從2KH~50MHZ更低的JTAG時(shí)鐘頻率(低于1KHZ),支持ASIC外圍電路調(diào)試寬電壓支持1.0~5.0V支持多核處理器調(diào)試,同步控制

配合RealViewTrace模塊插件可捕獲支持ETM跟蹤數(shù)據(jù)

通過(guò)JTAG訪問(wèn)ETB跟蹤數(shù)據(jù)

兼容GDB與KGDB調(diào)試支持USB1.1與2.0連接

支持網(wǎng)絡(luò)連接調(diào)試10/100baseT

支持的ARM處理器:ARM7TM,ARM9TM,ARM9ETM,ARM10TM,ARM11TM和CortexTM

RealViewTrace主要特性:

非插入式的實(shí)時(shí)指令跟蹤與數(shù)據(jù)跟蹤,跟蹤頻率可高達(dá)250MHZ,高達(dá)8百萬(wàn)幀深度的跟蹤緩沖區(qū)〔高達(dá)4百萬(wàn)幀深度的timestamp緩沖區(qū)〕48位timestamp,10納秒分辨率,支持最長(zhǎng)連續(xù)32天數(shù)據(jù)跟蹤4/8/16位數(shù)據(jù)寬度跟蹤端口外部事件同步觸發(fā)器完全可變的觸發(fā)位置快速on-the-fly跟蹤數(shù)據(jù)上傳與主機(jī)共享RealViewICE連接支持ETM跟蹤端口模式支持v1.x,v2.x,v3.xforETM7TMETM9TM,ETM10TM與ETM11TM等ETM協(xié)議單邊沿和雙邊沿時(shí)鐘觸發(fā)普通與多元的端口

庫(kù)創(chuàng)立工具內(nèi)容豐富的在線文檔版本:ARMRealViewDeveloper2.2軟件大?。?00M下載地址:://mcu123/down/view.asp?id=52

Embedded

Workbench

for

ARM

是IAR

Systems

公司為ARM

微處理器開(kāi)發(fā)的一個(gè)集成開(kāi)發(fā)環(huán)境(下面簡(jiǎn)稱IAR

EWARM)。比較其他的ARM

開(kāi)發(fā)環(huán)境,IAR

EWARM

具有入門(mén)容易、使用方便和代碼緊湊等特點(diǎn)。EWARM

中包含一個(gè)全軟件的模擬程序(simulator)。用戶不需要任何硬件支持就可以模擬各種ARM

內(nèi)核、外部設(shè)備甚至中斷的軟件運(yùn)行環(huán)境。從中可以了解和評(píng)估IAR

EWARM

的功能和使用方法。最新版本是:IAR

Embedded

Workbench

for

ARM

version

4.30。

3、IAREWARMIAR

EWARM

的主要特點(diǎn)如下:1、高度優(yōu)化的IAR

ARM

C/C++

Compiler

2、IAR

ARM

Assembler3、一個(gè)通用的IAR

XLINK

Linker4、IAR

XAR

和XLIB

建庫(kù)程序和IAR

DLIB

C/C++運(yùn)行庫(kù)5、功能強(qiáng)大的編輯器6、工程管理器7、命令行實(shí)用程序8、IAR

C-SPY

調(diào)試器(先進(jìn)的高級(jí)語(yǔ)言調(diào)試器)版本:IAR

EWARM

4.40a

軟件大小:93M

下載地址:Keil公司已從事MCS-51開(kāi)發(fā)平臺(tái)uVision著名。近年來(lái),Keil公司也將自己的領(lǐng)域擴(kuò)展到了ARM的開(kāi)發(fā)工具,即:keilarm,再后來(lái)keil真的被arm收購(gòu)了,他的arm開(kāi)發(fā)工具這一塊就是現(xiàn)在的MDK系列。

Keil

uVision調(diào)試器可以幫助用戶準(zhǔn)確地調(diào)試ARM器件的片內(nèi)外圍功能(I2C、CAN、UART、SPI、中斷、I/O口、A/D轉(zhuǎn)換器、D/A轉(zhuǎn)換器和PWM模塊等功能)。KeilMDK-ARM最新版本4.54,安裝包500多兆,包括ARM的編譯器和uVision4集成開(kāi)發(fā)環(huán)境。

4、KEILARM-MDKARMMDK-ARM具有四種版本:MDK-Lite、MDK根底版、MDK標(biāo)準(zhǔn)版和MDK專業(yè)版。所有版本都提供完整的C/C++開(kāi)發(fā)環(huán)境,MDK專業(yè)版包括豐富的中間件庫(kù)。Project/Target/Group/File的重疊管理模式,并可逐級(jí)設(shè)置;高度智能彩色語(yǔ)法顯示;

4、KEILARM-MDKARM特點(diǎn)完全支持ARMCortex?-M系列、Cortex-R4、ARM7?和ARM9?設(shè)備行業(yè)領(lǐng)先的ARMC/C++編譯工具鏈μVision4IDE、調(diào)試器和模擬環(huán)境支持來(lái)自20多個(gè)供給商的1200多種設(shè)備特點(diǎn)KeilRTX確定性、占用空間小的實(shí)時(shí)操作系統(tǒng)〔具有源代碼〕TCP/IP網(wǎng)絡(luò)套件提供多個(gè)協(xié)議和各種應(yīng)用程序USB設(shè)備和USB主機(jī)堆棧配備標(biāo)準(zhǔn)驅(qū)動(dòng)程序類ULINKpro支持對(duì)正在運(yùn)行的應(yīng)用程序進(jìn)行即時(shí)分析并記錄執(zhí)行的每條Cortex-M指令有關(guān)程序執(zhí)行的完整代碼覆蓋率信息執(zhí)行性能分析器和性能分析器支持程序優(yōu)化大量例如工程可幫您快速熟悉強(qiáng)大的內(nèi)置功能符合CMSISCortex微控制器軟件接口標(biāo)準(zhǔn)多種流行編譯工具選擇

Keil高效率C編譯器;ARM公司的ADS/RealView

編譯器;GNU

GCC

編譯器;后續(xù)廠商的編譯器。官方keil

WINARM

是一個(gè)免費(fèi)的開(kāi)發(fā)工具。

WinARM

可以在://siwawi.arubi.uni-kl.de/avr_projects/arm_projects/

下載得到,里面除了包含

C/C++

編譯器——GCC,匯編、連接器——Binutils,調(diào)試器——GDB等工具,也包括了通過(guò)

GDB

使用

Wiggler

JTAG

的軟件——OCDRemote。所以,所需要的工具都包括在了這個(gè)

WinARM

發(fā)行版中,就可以比較省心了。

官方發(fā)布://siwawi.arubi.uni-kl.de/avr_projects/arm_projects/

軟件大小:90M

下載地址:WinARM

20060606

zip-Archive

here

://siwawi.arubi.uni-kl.de/avr_projects/arm_projects/WinARM-20060606.zip

WINARM簡(jiǎn)易使用說(shuō)明:5、WINARM-GCCARM1、JTAG仿真器

JTAG(JointTestActionGroup;聯(lián)合測(cè)試行動(dòng)小組)是一種國(guó)際標(biāo)準(zhǔn)測(cè)試協(xié)議〔IEEE1149.1兼容〕,主要用于芯片內(nèi)部測(cè)試及對(duì)系統(tǒng)進(jìn)行仿真、調(diào)試。JTAG技術(shù)是一種嵌入式調(diào)試技術(shù),它在芯片內(nèi)部封裝了專門(mén)的測(cè)試電路TAP〔TestAccessPort,測(cè)試訪問(wèn)口〕,通過(guò)專用的JTAG測(cè)試工具對(duì)內(nèi)部節(jié)點(diǎn)進(jìn)行測(cè)試。JTAG接口還常用于實(shí)現(xiàn)ISP〔In-SystemProgrammer,在系統(tǒng)編程〕,對(duì)FLASH等器件進(jìn)行編程。二、相關(guān)開(kāi)發(fā)工具1、JTAG仿真器

通常所說(shuō)的JTAG大致分兩類,一類用于測(cè)試芯片的電氣特性,檢測(cè)芯片是否有問(wèn)題;一類用于Debug,一般支持JTAG的CPU內(nèi)都包含了這兩個(gè)模塊。一個(gè)含有JTAGDebug接口模塊的CPU,只要時(shí)鐘正常,就可以通過(guò)JTAG接口訪問(wèn)CPU的內(nèi)部存放器和掛在CPU總線上的設(shè)備,如FLASH,RAM,SOC〔比方4510B,44Box,AT91M系列〕內(nèi)置模塊的存放器,象UART,Timers,GPIO等等的存放器。現(xiàn)在多數(shù)的高級(jí)器件都支持JTAG協(xié)議,如:新型單片機(jī)如MSP430、ARM、DSP、FPGA器件等。標(biāo)準(zhǔn)的JTAG接口是4線:TMS、TCK、TDI、TDO,分別為模式選擇、時(shí)鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出線。二、相關(guān)開(kāi)發(fā)工具標(biāo)準(zhǔn)的JTAG接口是4線:TMS、TCK、TDI、TDO,分別為測(cè)試模式選擇、測(cè)試時(shí)鐘、測(cè)試數(shù)據(jù)輸入和測(cè)試數(shù)據(jù)輸出。如今JTAG接口的連接有兩種標(biāo)準(zhǔn),即14針接口和20針接口,其定義分別如下所示。14針的JTAG接口為老式接口。引腳信號(hào)說(shuō)明SAMSUNGARM7S3C44B0開(kāi)發(fā)套件中的JTAG編程板電路如圖PC并口引腳:2

3

4

8JTAG引腳:TCK

TMSnSRSTTDI引腳對(duì)應(yīng)關(guān)系:S3C2440的官方JTAG編程板PC并口引腳:2

3

4

11JTAG引腳:TCK

TDI

TMS

TDO引腳對(duì)應(yīng)關(guān)系:J-Link是SEGGER公司為支持仿真ARM內(nèi)核芯片推出的采用USB接口的JTAG仿真器。配合IAREWAR,ADS,KEIL,WINARM,RealView等集成開(kāi)發(fā)環(huán)境支持所有ARM7/ARM9/ARM11,CortexM0/M1/M3/M4,CortexA4/A8/A9等內(nèi)核芯片的仿真,與IAR,Keil等編譯環(huán)境無(wú)縫連接,操作方便、連接方便、簡(jiǎn)單易學(xué),是學(xué)習(xí)開(kāi)發(fā)ARM最好最實(shí)用的開(kāi)發(fā)工具。

2、

J-LINK仿真調(diào)試器J-LinkARM主要特點(diǎn):IAREWARM集成開(kāi)發(fā)環(huán)境無(wú)縫連接的JTAG仿真器。支持CPUs:AnyARM7/9/11,Cortex-A5/A8/A9,Cortex-M0/M1/M3/M4,Cortex-R4,RX610,RX621,RX62N,RX62T,RX630,RX631,RX63N。下載速度高達(dá)1MByte/s。最高JTAG速度15MHz。目標(biāo)板電壓范圍1.2V–3.3V,5V兼容。自動(dòng)速度識(shí)別功能。監(jiān)測(cè)所有JTAG信號(hào)和目標(biāo)板電壓。完全即插即用。使用USB電源〔但不對(duì)目標(biāo)板供電〕帶USB連接線和20芯扁平電纜。支持多JTAG器件串行連接。標(biāo)準(zhǔn)20芯JTAG仿真插頭。選配14芯JTAG仿真插頭。選配用于5V目標(biāo)板的適配器。帶J-LinkTCP/IPserver,允許通過(guò)TCP/IP網(wǎng)絡(luò)使用J-Link。KeilULINKUSB接口仿真器,是一款多功能ARM調(diào)試工具,可以通過(guò)JTAG或CODS接口連接到目標(biāo)系統(tǒng),進(jìn)行仿真或下載程序,目前已經(jīng)成為國(guó)內(nèi)主流的ARM開(kāi)發(fā)工具。KeilULINK的軟件環(huán)境為KeiluVisionKeil系列軟件具有良好的調(diào)試界面,優(yōu)秀的編譯效果,豐富的使用資料。使其深受國(guó)內(nèi)嵌入式開(kāi)發(fā)工程師的喜愛(ài)。目前,ULINK已經(jīng)停產(chǎn),新用戶推薦選擇ULINK2或ULINKPro仿真器。3、

U-LINK仿真調(diào)試器ULINK2是ARM公司最新推出的配套R(shí)ealViewMDK使用的仿真器,是ULink仿真器的升級(jí)版本。ULINK2不僅具有ULINK仿真器的所有功能,還增加了串行調(diào)試〔SWD〕支持,返回時(shí)鐘支持和實(shí)時(shí)代理等功能。開(kāi)發(fā)工程師通過(guò)結(jié)合使用RealViewMDK的調(diào)試器和ULINK2,可以方便的在目標(biāo)硬件上進(jìn)行片上調(diào)試(使用on-chipJTAG,SWD和OCDS)、Flash編程.3、

U-LINK仿真調(diào)試器支持ARM7,ARM9,Cortex-M,8051和C166設(shè)備JTAG速度高達(dá)10MHz支持Cortex-M串行查看器〔SWV〕數(shù)據(jù)和時(shí)間跟蹤,速度高達(dá)1Mbit/s〔UART模式〕執(zhí)行、端口仿真和串行調(diào)試輸出時(shí)的存儲(chǔ)器讀寫(xiě)實(shí)時(shí)代理與KeilμVisionIDE和Debugger無(wú)縫隙集成寬目標(biāo)電壓,從2.7V–5.5V可用USB供電〔無(wú)須電源〕使用標(biāo)準(zhǔn)WindowsUSB設(shè)備,即插即用安裝目標(biāo)連接器ULINK2特點(diǎn):ULINK是KEIL公司開(kāi)發(fā)的仿真器,專用于KEIL平臺(tái)下使用,ADS,IAR下不能使用JLINK是通用的開(kāi)發(fā)工具,可以用于KEIL,IAR,ADS等平臺(tái)速度,效率,功能均比ULINK強(qiáng)ULINK2的下載速度和調(diào)試速度確實(shí)沒(méi)有JLINK的快。ULINK和JLINK的比較4.3ARM匯編語(yǔ)言程序設(shè)計(jì)根底ARM匯編語(yǔ)言的偽操作、宏指令與偽指令A(yù)RM7匯編語(yǔ)言程序設(shè)計(jì)步驟ARM7匯編語(yǔ)言程序設(shè)計(jì)4.3.1ARM匯編語(yǔ)言的偽操作、宏指令與偽指令A(yù)RM匯編語(yǔ)言源程序中語(yǔ)句一般由指令、偽操作、宏指令和偽指令組成偽操作是ARM匯編語(yǔ)言程序里的一些特殊指令助記符,它的作用主要是為完成匯編程序做各種準(zhǔn)備工作,在源程序進(jìn)行匯編時(shí)由匯編程序處理,而不是在計(jì)算機(jī)運(yùn)行期間由機(jī)器執(zhí)行。3.3.1ARM匯編語(yǔ)言的偽操作、宏指令與偽指令宏指令是一段獨(dú)立的程序代碼,可以插在源程序中,它通過(guò)偽操作來(lái)定義。宏在被使用之前必須提前定義好,宏之間可以互相調(diào)用,也可以自己遞歸調(diào)用。通過(guò)直接書(shū)寫(xiě)宏名來(lái)使用宏,并根據(jù)宏指令的格式設(shè)置相應(yīng)的輸入?yún)?shù)。宏定義本身不會(huì)產(chǎn)生代碼,只是在調(diào)用它時(shí)把宏體插入到源程序中。偽指令也是ARM匯編語(yǔ)言程序里的特殊指令助記符,也不在處理器運(yùn)行期間由機(jī)器執(zhí)行,它們?cè)趨R編時(shí)將被適宜的機(jī)器指令代替成ARM或Thumb指令,從而實(shí)現(xiàn)真正指令操作。兩種編譯模式的集成開(kāi)發(fā)環(huán)境IDE介紹ADS/SDTIDE開(kāi)發(fā)環(huán)境它由ARM公司開(kāi)發(fā),使用了CodeWarrior公司的編譯器;集成了GNU開(kāi)發(fā)工具的IDE開(kāi)發(fā)環(huán)境它由GNU的匯編器as、交叉編譯器gcc、和鏈接器ld等組成。ADS編譯環(huán)境下的ARM偽操作和宏指令A(yù)DS編譯環(huán)境下的偽操作有如下幾種:符號(hào)定義〔SymbolDefinition〕偽操作數(shù)據(jù)定義〔DataDefinition〕偽操作匯編控制〔AssemblyControl〕偽操作框架描述〔FrameDescription〕偽操作信息報(bào)告〔Reporting〕偽操作其他〔Miscellaneous〕偽操作4.3.1.1符號(hào)定義偽操作1.全局變量定義偽指令GBLA、GBLL、GBLS2.局部變量定義偽指令LCLA、LCLL、LCLS3.變量賦值偽指令SETA、SETL、SETS4.存放器列表定義偽指令RLIST1.GBLA,GBLL及GBLSGBLA,GBLL及GBLS偽操作用于聲明一個(gè)ARM程序中的全局變量并在默認(rèn)情況下將其初始化。GBLA偽操作聲明一個(gè)全局的算術(shù)變量,并將其初始化成0GBLL偽操作聲明一個(gè)全局的邏輯變量,并將其初始化成{FALSE}GBLS偽操作聲明一個(gè)全局的字符串變量,并將其初始化成空串“〞語(yǔ)法格式<GBLX>Variable其中:<GBLX>是GBLA,GBLL或GBLS3種偽操作之一;Variable是全局變量的名稱。在其作用范圍內(nèi)必須惟一,即同一個(gè)變量名只能在作用范圍內(nèi)出現(xiàn)一次。使用例如GBLAA1;定義一個(gè)全局的數(shù)值變量,變量名為A1A1SETA0x0F;將該變量賦值為0x0F

GBLLA2;定義一個(gè)全局的邏輯變量,變量名為A2A2SETL{TRUE};將該變量賦值為真

GBLSA3;定義一個(gè)全局的字符串變量,變量名為A3A3SETS“Testing〞;將該變量賦值為“Testing〞2.LCLA,LCLL及LCLSLCLA,LCLL及LCLS偽操作用于聲明一個(gè)ARM程序中的局部變量,并在默認(rèn)情況下將其初始化。LCLA偽操作聲明一個(gè)局部的算術(shù)變量,并將其初始化成0。LCLL偽操作聲明一個(gè)局部的邏輯變量,并將其初始化成{FALSE}LCLS偽操作聲明一個(gè)局部的串變量,并將其初始化成空串“〞語(yǔ)法格式<LCLX>Variable其中:<LCLX>是LCLA,LCLL或LCLS3種偽操作之一;Variable是局部變量的名稱。在其作用范圍內(nèi)必須唯一,即同一個(gè)變量名只能在作用范圍內(nèi)出現(xiàn)一次。使用例如:LCLATest4;聲明一個(gè)局部的數(shù)值變量,變量名為T(mén)est4Test4SETA0xaa;將該變量賦值為0xaa

LCLLTest5;聲明一個(gè)局部的邏輯變量,變量名為T(mén)est5Test5SETL{TRUE};將該變量賦值為真LCLSTest6;定義一個(gè)局部的字符串變量,變量名為T(mén)est6Test6SETS“Testing〞;將該變量賦值為“Testing〞3.SETA,SETL及SETSSETA,SETL及SETS偽操作用于給一個(gè)ARM程序中的全局或局部變量賦值。SETA偽操作給一個(gè)全局或局部算術(shù)變量賦值SETL偽操作給一個(gè)全局或局部邏輯變量賦值SETS偽操作給一個(gè)全局或局部字符串變量賦值語(yǔ)法格式<SETX>Variableexpr

其中:<SETX>是SETA,SETL或SETS3種偽操作之一;Variable是使用GBLA,GBLL,GBLS,LCLA,LCLL或LCLS定義的變量的名稱,在其作用范圍內(nèi)必須唯一;expr為表達(dá)式,即賦予變量的值。4存放器列表定義偽指令RLIST格式:名稱 RLIST{通用存放器列表}功能:用于對(duì)一個(gè)通用存放器列表定義名稱,reglistRLIST{R0-R3,R8,R12} … STMFD SP!,reglist ;將列表reglist存儲(chǔ)到堆棧中 … LDMIA R4,reglist ;將列表reglist加載到R4中4.3.1.2數(shù)據(jù)定義偽操作1.定義字節(jié)存儲(chǔ)單元偽操作DCB2.定義半字存儲(chǔ)單元偽操作DCW〔DCWU〕3.定義字存儲(chǔ)單元偽操作DCD〔DCDU〕4.為單精度浮點(diǎn)數(shù)定義字存儲(chǔ)單元偽操作DCFS〔DCFSU〕5.為雙精度浮點(diǎn)數(shù)定義字存儲(chǔ)單元偽操作DCFD〔DCFDU〕6.內(nèi)存單元分配偽操作SPACE7.定義結(jié)構(gòu)化內(nèi)存表首地址偽操作MAP8.定義結(jié)構(gòu)化內(nèi)存表中數(shù)據(jù)域偽操作FIELD9.定義文字池偽操作LTORG1.DCB格式:標(biāo)號(hào)DCB表達(dá)式功能:DCB偽操作用于分配一片連續(xù)的字節(jié)存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。其中,表達(dá)式可以為0~255的數(shù)值或字符串。DCB也可用“=〞代替

2.DCW(DCWU)格式:標(biāo)號(hào)DCW〔或DCWU〕表達(dá)式功能:DCW〔或DCWU〕偽操作用于分配一片連續(xù)的半字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。其中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)值表達(dá)式。用DCW分配的字存儲(chǔ)單元是半字對(duì)齊的,而用DCWU分配的字存儲(chǔ)單元并不嚴(yán)格按照半字對(duì)齊。3.DCD〔或DCDU〕格式:標(biāo)號(hào)DCD〔或DCDU〕表達(dá)式功能:DCD〔或DCDU〕偽操作用于分配一片連續(xù)的字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。其,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)值表達(dá)式。DCD也可用“&〞代替。用DCD分配的字存儲(chǔ)單元是字對(duì)齊的,而用DCDU分配的字存儲(chǔ)單元并不嚴(yán)格按照字對(duì)齊。

使用例如:StrDCB“Thisisatest!〞;分配一片連續(xù)的字節(jié)存儲(chǔ)單元并初始化。DataTestDCW1,2,3;分配一片連續(xù)的半字存儲(chǔ)單元并初始化。DataTestDCD4,5,6;分配一片連續(xù)的字存儲(chǔ)單元并初始化。4、DCFD〔或DCFDU〕

語(yǔ)法格式:

標(biāo)號(hào)DCFD〔或DCFDU〕表達(dá)式

DCFD〔或DCFDU〕偽操作用于為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。每個(gè)雙精度的浮點(diǎn)數(shù)占據(jù)兩個(gè)字單元

如:FDataTestDCFD2E115,-5E7;分配一片連續(xù)的字存儲(chǔ)單元并初始化為指定的雙精度數(shù)。5、DCFS〔或DCFSU〕

語(yǔ)法格式:

標(biāo)號(hào)DCFS〔或DCFSU〕表達(dá)式

DCFS〔或DCFSU〕偽操作用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。每個(gè)單精度的浮點(diǎn)數(shù)占據(jù)一個(gè)字單元。6、DCQ(或DCQU〕

語(yǔ)法格式:

標(biāo)號(hào)DCQ〔或DCQU〕表達(dá)式

DCQ〔或DCQU〕偽操作用于分配一片以8個(gè)字節(jié)為單位的連續(xù)存儲(chǔ)區(qū)域并用偽操作中指定的表達(dá)式初始化。如:DataTestDCQ100;分配一片連續(xù)的存儲(chǔ)單元并初始化為指定的值。

7、SPACE

語(yǔ)法格式:

標(biāo)號(hào)SPACE表達(dá)式

SPACE偽指令用于分配一片連續(xù)的存儲(chǔ)區(qū)域并初始化為0。其中,表達(dá)式為要分配的字節(jié)數(shù)。

SPACE也可用“%〞代替。

使用例如:

DataSpaceSPACE100;分配連續(xù)100字節(jié)的存儲(chǔ)單元并初始化為0。8、MAP

語(yǔ)法格式:

MAP表達(dá)式{,基址存放器}

MAP偽指令用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址。MAP也可用“^〞代替。

表達(dá)式可以為程序中的標(biāo)號(hào)或數(shù)學(xué)表達(dá)式,基址存放器為可選項(xiàng),當(dāng)基址存放器選項(xiàng)不存在時(shí),表達(dá)式的值即為內(nèi)存表的首地址,當(dāng)該選項(xiàng)存在時(shí),內(nèi)存表的首地址為表達(dá)式的值與基址存放器的和。

MAP偽操作通常與FIELD偽指令配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。

使用例如:

MAP0x100,R0;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0x100+R0。9、FIELD

語(yǔ)法格式:

標(biāo)號(hào)FIELD表達(dá)式

FIELD偽指令用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。FILED也可用“#〞代替。

表達(dá)式的值為當(dāng)前數(shù)據(jù)域在內(nèi)存表中所占的字節(jié)數(shù)。

MAP偽操作定義內(nèi)存表的首地址,F(xiàn)IELD偽操作定義內(nèi)存表中的各個(gè)數(shù)據(jù)域,并可以為每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)供其他的指令引用。注意MAP和FIELD偽指令僅用于定義數(shù)據(jù)結(jié)構(gòu),并不實(shí)際分配存儲(chǔ)單元。

使用例如:

MAP0x100;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0x100。

AFIELD16;定義A的長(zhǎng)度為16字節(jié),位置為0x100

BFIELD32;定義B的長(zhǎng)度為32字節(jié),位置為0x110

SFIELD256;定義S的長(zhǎng)度為256字節(jié),位置為0x130

10、LTORGLTORG用于聲明一個(gè)數(shù)據(jù)緩沖池〔也稱為文字池〕的開(kāi)始。在使用偽操作LDR時(shí),常常需要在適當(dāng)?shù)牡胤絽⒓覮TORG聲明數(shù)據(jù)緩沖池,LDR加載的數(shù)據(jù)暫時(shí)放于數(shù)據(jù)緩沖池。語(yǔ)法格式LTORG使用說(shuō)明當(dāng)程序中使用LDR之類的指令時(shí),數(shù)據(jù)緩沖池的使用可能越界。為防止越界發(fā)生可以使用LTORG偽操作定義數(shù)據(jù)緩沖池。通常大的代碼段可以使用多個(gè)數(shù)據(jù)緩沖池。ARM匯編編譯器一般把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個(gè)代碼段開(kāi)始之前,或者END偽操作之前?!纠匡@示定義文字池例如AREA

Example,CODE,READONLY;

//聲明一個(gè)代碼段,名稱為Example,屬性為只讀Start

BL

funcl

;codefuncl

//子程序

;code

LDR

R1,=0x800

//將0X800加載到R1

MOV

PC,lr

//子程序結(jié)束LTORG

//定義數(shù)據(jù)緩沖池data

SPACE4200

//從當(dāng)前開(kāi)始分配40字節(jié)的內(nèi)存單元并初始化為0END

//程序結(jié)束

0x800的值被編譯器暫時(shí)放在了data[0-3]字段中。

4.3.1.3ARM7匯編控制偽操作

1.IF、ELSE、ENDIF條件編譯偽操作2.WHILE、WEND條件編譯偽操作3.MACRO、MEND宏定義偽操作4.MEXIT宏退出偽操作〔1〕IF、ELSE、ENDIF

語(yǔ)法格式:

IF邏輯表達(dá)式

指令序列1

ELSE

指令序列2

ENDIF

IF、ELSE、ENDIF偽操作能根據(jù)條件的成立與否決定是否執(zhí)行某個(gè)指令序列。當(dāng)IF后面的邏輯表達(dá)式為真,那么執(zhí)行指令序列1,否那么執(zhí)行指令序列2。其中,ELSE及指令序列2可以沒(méi)有,此時(shí),當(dāng)IF后面的邏輯表達(dá)式為真,那么執(zhí)行指令序列1,否那么繼續(xù)執(zhí)行后面的指令。

IF、ELSE、ENDIF偽操作可以嵌套使用。

使用例如:

GBLLTest;聲明一個(gè)全局的邏輯變量,變量名為T(mén)est……

IFTest=TRUE

指令序列1

ELSE

指令序列2

ENDIF

語(yǔ)法格式:

WHILE邏輯表達(dá)式

指令序列

WEND

WHILE、WEND偽操作能根據(jù)條件的成立與否決定是否循環(huán)執(zhí)行某個(gè)指令序列。當(dāng)WHILE后面的邏輯表達(dá)式為真,那么執(zhí)行指令序列,該指令序列執(zhí)行完畢后,再判斷邏輯表達(dá)式的值,假設(shè)為真那么繼續(xù)執(zhí)行,一直到邏輯表達(dá)式的值為假。

WHILE、WEND偽指令可以嵌套使用。

使用例如:

GBLACounter;聲明一個(gè)全局的數(shù)學(xué)變量,變量名為Counter

CounterSETA3;由變量Counter控制循環(huán)次數(shù)

……

WHILECounter<10

指令序列

WEND

〔2〕WHILE、WEND

3、MACRO、MEND

語(yǔ)法格式:

$標(biāo)號(hào)宏名$參數(shù)1,$參數(shù)2,……

指令序列

MEND

MACRO、MEND偽指令可以將一段代碼定義為一個(gè)整體,稱為宏指令,然后就可以在程序中通過(guò)宏指令屢次調(diào)用該段代碼。其中,$標(biāo)號(hào)在宏指令被展開(kāi)時(shí),標(biāo)號(hào)會(huì)被替換為用戶定義的符號(hào),宏指令可以使用一個(gè)或多個(gè)參數(shù),當(dāng)宏指令被展開(kāi)時(shí),這些參數(shù)被相應(yīng)的值替換。

宏指令的使用方式和功能與子程序有些相似,子程序可以提供模塊化的程序設(shè)計(jì)、節(jié)省存儲(chǔ)空間并提高運(yùn)行速度。但在使用子程序結(jié)構(gòu)時(shí)需要保護(hù)現(xiàn)場(chǎng),從而增加了系統(tǒng)的開(kāi)銷,因此,在代碼較短且需要傳遞的參數(shù)較多時(shí),可以使用宏指令代替子程序。

包含在MACRO和MEND之間的指令序列稱為宏定義體,在宏定義體的第一行應(yīng)聲明宏的原型〔包含宏名、所需的參數(shù)〕,然后就可以在匯編程序中通過(guò)宏名來(lái)調(diào)用該指令序列。在源程序被編譯時(shí),匯編器將宏調(diào)用展開(kāi),用宏定義中的指令序列代替程序中的宏調(diào)用,并將實(shí)際參數(shù)的值傳遞給宏定義中的形式參數(shù)。

MACRO、MEND偽操作可以嵌套使用。MACRO、MENDMACRO偽操作標(biāo)識(shí)宏定義的開(kāi)始,MEND標(biāo)識(shí)宏定義的結(jié)束。用MACRO和MEND定義的一段代碼,稱為宏定義體,這樣在程序中就可以通過(guò)宏名屢次調(diào)用該代碼段來(lái)完成相應(yīng)的功能。語(yǔ)法格式 MACRO {$label}macroname{$parameter{,$parameter}…} … ;宏代碼 MENDmacroname為所定義的宏的名稱;$label在宏指令被展開(kāi)時(shí),label可被替換成相應(yīng)的符號(hào),通常是一個(gè)標(biāo)號(hào)?!苍谝粋€(gè)符號(hào)前使用$表示程序被匯編時(shí)將使用相應(yīng)的值來(lái)替代$后的符號(hào)〕;$parameter為宏指令的參數(shù),當(dāng)宏指令被展開(kāi)時(shí)將被替換成相應(yīng)的值,類似于函數(shù)中的形式參數(shù)??梢栽诤甓x時(shí)為參數(shù)指定相應(yīng)的默認(rèn)值。宏的定義體:

MACRO

$PM

DELAY

$CanShu

$PM

LDR

R7,=$CanShu

;

;LDR

R7,[R7]

;此時(shí)參數(shù)是一個(gè)立即數(shù)

如果是變量的話是會(huì)用到這一句

$PM.LOOP

SUBS

R7,R7,#0X01

BNE

$PM.LOOP

MEND在程序段中的使用:〔使用兩次〕...AA

DELAY

0X000005F0...BB

DELAY

0X00000FF0...此時(shí)調(diào)用屢次,編譯器就不會(huì)出現(xiàn)問(wèn)題,例子中的AA和BB僅僅是一個(gè)標(biāo)號(hào),用戶可以自行書(shū)寫(xiě),因?yàn)樵诤曛噶顔h展開(kāi)時(shí),這個(gè)符號(hào)在匯編時(shí)將使用相應(yīng)的值替代0x00000FF0是一個(gè)參數(shù)在此處是一個(gè)立即數(shù),用戶可自行使用為變量等4、MEXIT

語(yǔ)法格式:

MEXIT

MEXIT用于從宏定義中跳轉(zhuǎn)出去。如:

MACRO

$abcmacroabc$param1,$param2

;code

WHILEcondition1

;code

IFcondition2

;code

MEXIT<----直接退出宏

ELSE

;code

ENDIF

WEND4.3.1.4雜項(xiàng)匯編器偽指令1.AREA2.ALIGN3.CODE16和CODE324.ENTRY5.ENDEQU7.EXPORT和GLOBAL8.IMPORT9.EXTERN10.GET和INCLUDE11.INCBIN12.RN13.ROUT1.AREA格式:AREA段名屬性1,屬性2,…… 功能:AREA偽操作用于定義一個(gè)代碼段、數(shù)據(jù)段或特定屬性的段。其中,段名假設(shè)以數(shù)值開(kāi)頭,那么該段名需用“|〞括起來(lái),如|1_test|,用C的編譯器產(chǎn)生的代碼一般也用“|〞括起來(lái)。屬性字段表示該代碼段〔或數(shù)據(jù)段〕的相關(guān)屬性,多個(gè)屬性用逗號(hào)分隔。使用例如:AREAInit,CODE,READONLY;定義段Init,代碼段,只讀ENTRY;程序入口…;指令序列BSTART1

AREASTOCK,DATA,READWRITE;定義段STOCK,數(shù)據(jù)段,讀/寫(xiě)SAVESPACE20;分配數(shù)據(jù)空間AREAInit,CODE,READONLY;定義段Init,代碼段,只讀START1ADDR1,R2,R3…;指令序列BSTART12.CODE16、CODE32格式:CODE16〔或CODE32〕功能:(1)CODE16偽操作通知編譯器,其后的指令序列為16位的Thumb指令。(2)CODE32偽操作通知編譯器,其后的指令序列為32位的ARM指令。使用例如:AREAInit,CODE,READONLY…CODE32;通知編譯器其后的指令為32位的ARM指令LDRR0,=NEXT+1;將跳轉(zhuǎn)地址放入存放器R0BXR0;程序跳轉(zhuǎn)到新的位置執(zhí)行,;并將處理器切換到Thumb工作狀態(tài)…CODE16;通知編譯器其后的指令為16位的Thumb指令NEXTLDRR3,=0x3FF …END;程序結(jié)束

3.ENTRY格式:ENTRY功能:ENTRY偽操作用于指定匯編程序的入口點(diǎn)。一個(gè)程序可由一個(gè)或多個(gè)源文件組成,一個(gè)源文件由一個(gè)或多個(gè)程序段組成。一個(gè)程序至少有一個(gè)入口,在只有一個(gè)入口時(shí),編譯程序會(huì)把這個(gè)入口的地址定義為系統(tǒng)復(fù)位后的程序的起始點(diǎn)。使用例如:AREAInit,CODE,READONLYENTRY;指定應(yīng)用程序的入口點(diǎn)…4.END格式:END功能:END偽操作用于通知編譯器已經(jīng)到了源程序的結(jié)尾。例4.33使用例如:AREAInit,CODE,READONLY……END;指定應(yīng)用程序的結(jié)尾

5.EQU格式:名稱EQU表達(dá)式{,類型}功能:EQU偽操作用于為程序中的常量、標(biāo)號(hào)等定義一個(gè)等效的字符名稱,類似于C語(yǔ)言中的#define。使用例如:TestEQU50;定義標(biāo)號(hào)Test的值為50AddrEQU0x55;定義Addr的值為0x556.EXPORT〔或GLOBAL〕格式:EXPORT標(biāo)號(hào)[,WEAK]功能:EXPORT偽操作用于在程序中聲明一個(gè)全局的標(biāo)號(hào),該標(biāo)號(hào)可在其它的文件中引用。使用例如:AREAInit,CODE,READONLYEXPORTStest;聲明一個(gè)可全局引用的標(biāo)號(hào)Stest……END7.IMPORT格式:IMPORT標(biāo)號(hào)[,WEAK]功能:IMPORT偽操作用于通知編譯器要使用的標(biāo)號(hào)在其它的源文件中定義,但要在當(dāng)前源文件中引用,而且無(wú)論當(dāng)前源文件是否引用該標(biāo)號(hào),該標(biāo)號(hào)均會(huì)被參加到當(dāng)前源文件的符號(hào)表中。標(biāo)號(hào)在程序中區(qū)分大小寫(xiě)。使用例如:

AREAInit,CODE,READONLYIMPORTMain…END通知編譯器當(dāng)前文件要引用標(biāo)號(hào)Main,但Main在其它源文件中定義8.GET〔或INCLUDE〕格式:GET文件名功能:GET偽操作用于將一個(gè)源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置進(jìn)行匯編處理??梢允褂肐NCLUDE代替GET。使用例如:AREAInit,CODE,READONLYGETa1.s;通知編譯器當(dāng)前源文件包含源文件a1.sGETC:\a2.s;通知編譯器當(dāng)前源文件包含源文件C:\a2.s…END

9.INCBIN格式:INCBIN文件名功能:INCBIN偽操作用于將一個(gè)目標(biāo)文件或數(shù)據(jù)文件包含到當(dāng)前的源文件中,被包含的文件不作任何變動(dòng)地存放在當(dāng)前文件中,編譯器從其后開(kāi)始繼續(xù)處理。使用例如:AREAInit,CODE,READONLYGETa1.sINCBINC:\a2.txt…

END分析:使用GET包含文件時(shí),由于必須對(duì)包含文件進(jìn)行編譯,所以被包含的文件只能是源文件。而使用INCBIN包含文件時(shí),可以是其它類型的文件。 ;通知編譯器當(dāng)前源文件包含文件a1.s,并編譯;通知編譯器當(dāng)前源文件包含文件c:\a2.txt,不編譯10.RN格式:名稱RN表達(dá)式功能:RN偽操作用于給一個(gè)存放器定義一個(gè)別名。采用這種方式可以方便程序員記憶該存放器的功能。其中,名稱為給存放器定義的別名,表達(dá)式為存放器的編碼。

使用例如:TempRNR0;將R0定義一個(gè)別名TempARM7匯編語(yǔ)言程序框架段:ARM匯編程序由段組成〔程序段、數(shù)據(jù)段〕;段是由匯編器偽指令A(yù)REA定義的相對(duì)獨(dú)立程序塊;段的屬性:READONLY〔只讀〕或READWRITE〔讀寫(xiě)〕分別用于定義一個(gè)代碼段或數(shù)據(jù)段;ARM7匯編語(yǔ)言程序框架;文件名:TEST1.S;功能:實(shí)現(xiàn)字符串拷貝功能;說(shuō)明:使用ARMulate軟件仿真調(diào)試 AREA Example1,CODE,READONLY;聲明代碼段Example1numEQU20 ;設(shè)置拷貝字的個(gè)數(shù) ENTRY ;標(biāo)識(shí)程序入口 CODE32 ;聲明32位ARM指令START LDR R0,=src;R0指向源數(shù)據(jù)塊 LDR R1,=dst;R1指向目的數(shù)據(jù)塊 MOV R2,#num;R2需要拷貝的數(shù)據(jù)個(gè)數(shù)wordcopy LDR R3,[R0],#4;從源數(shù)據(jù)塊中取一個(gè)字,放入R3中, ;R0=R0+4 STR R3,[R1],#4 ;將R3中的數(shù)據(jù)存入R1指向的存儲(chǔ) ;單元中,R1=R1+4 SUBS R2,R2,#1 ;R2計(jì)數(shù)器減1 BNE wordcopy ;如果R2不為0,那么轉(zhuǎn)向wordcopy處使用“;〞進(jìn)行注釋標(biāo)號(hào)頂格寫(xiě)程序代碼段ARM7匯編語(yǔ)言程序框架stop MOV R0,#0x18 ;程序運(yùn)行結(jié)束返回編譯器調(diào)試環(huán)境

LDR R1,=0x20026 SWI 0x123456

AREABlockData,DATA,READWRITE ;數(shù)據(jù)段的名字BlockDataSrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4Dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 AREA|.extra|,NOINIT,READWRITE ;未初始數(shù)據(jù)段的名字.extradata SPACE 1024 END ;文件結(jié)束

聲明文件結(jié)束4.3.2ARM7匯編語(yǔ)言程序設(shè)計(jì)步驟

ARM7匯編語(yǔ)言程序的設(shè)計(jì)步驟

編輯匯編語(yǔ)言源程序

聯(lián)編匯編語(yǔ)言源程序

調(diào)試可執(zhí)行映像文件4.3.2.1ARM匯編語(yǔ)言程序的設(shè)計(jì)步驟匯編語(yǔ)言程序的設(shè)計(jì)步驟分為編輯、匯編、連接和調(diào)試。4.3.2.2編輯匯編語(yǔ)言源程序基于Windows操作系統(tǒng)平臺(tái)的ARMADS〔ARMDeveloperSuite〕軟件下進(jìn)行的,該軟件是由ARM公司提供的專門(mén)用于ARM處理器應(yīng)用開(kāi)發(fā)和調(diào)試的綜合性工具軟件,目前使用的ADS1.2版本。ADS1.2主要包含CodeWarriorIDE、AXD兩局部;CodeWarriorIDE工具主要用于工程的管理配置、源程序的編輯、編譯和鏈接;AXD主要用于工程的下載和調(diào)試。1.建立工程文件2.創(chuàng)立源文件3.添加源文件到工程中4.3.2.3聯(lián)編匯編語(yǔ)言源程序4.3.2.4調(diào)試可執(zhí)行映像文件4.3.3ARM7匯編語(yǔ)言程序設(shè)計(jì)

匯編語(yǔ)言程序設(shè)計(jì)的步驟

順序程序設(shè)計(jì)

分支程序設(shè)計(jì)

循環(huán)程序設(shè)計(jì)

子程序設(shè)計(jì)4.3.3.1匯編語(yǔ)言程序設(shè)計(jì)的步驟使用計(jì)算機(jī)通過(guò)編程序解決某一問(wèn)題時(shí),通常按以下步驟進(jìn)行:分析問(wèn)題,建立數(shù)學(xué)模型;確定算法;設(shè)計(jì)程序流程圖;合理分配存放器、存儲(chǔ)空間和外設(shè)資源;編制程序;調(diào)試程序;形成文檔;研討目標(biāo)系統(tǒng)的本質(zhì)特性,用數(shù)學(xué)方法對(duì)其本質(zhì)特性進(jìn)行抽象描述,建立目標(biāo)系統(tǒng)的數(shù)學(xué)表示模型

在已建立的目標(biāo)系統(tǒng)數(shù)學(xué)表示模型上,進(jìn)一步研討目標(biāo)系統(tǒng)的內(nèi)在規(guī)那么,設(shè)計(jì)相應(yīng)處理法那么方案〔算法分析與描述〕把解題的方法、步驟用框圖形式表示。如果問(wèn)題比較復(fù)雜,那么可以逐步細(xì)化,直到每一框圖可以容易編程為止。流程圖不僅便于程序的編制,且對(duì)程序邏輯正確性也比較容易查找和修改。①合理地分配存儲(chǔ)器資源,將前述的目標(biāo)系統(tǒng)‘?dāng)?shù)據(jù)結(jié)構(gòu)模型’表示到各存儲(chǔ)器單元。②CPU存放器數(shù)量有限,在程序中,大多數(shù)操作都要使用存放器;并且有的操作使用特定的存放器〔如堆棧操作使用SP/R13等〕,程序中要合理分配各存放器的用途。用計(jì)算機(jī)語(yǔ)言,對(duì)數(shù)據(jù)結(jié)構(gòu)模型和流程圖表示的算法進(jìn)行準(zhǔn)確地描述。①語(yǔ)法調(diào)試:排除程序中的語(yǔ)法錯(cuò)誤。②功能調(diào)試:保證程序的邏輯功能正確性。用文檔形式記錄說(shuō)明程序的功能、使用方法、程序結(jié)構(gòu)、算法流程等每一個(gè)階段的工作。4.3.3.2順序程序設(shè)計(jì)順序程序是一種最簡(jiǎn)單的程序結(jié)構(gòu),也稱為直線程序,它的執(zhí)行自始自終按照語(yǔ)句的先后順序進(jìn)行。這種結(jié)構(gòu)的流程圖,除了有一個(gè)起始框,一個(gè)終止框外,就是假設(shè)干執(zhí)行框。例試編制一程序,完成10+3的操作。 AREAARMex,CODE,READONLY ;代碼段名ARMex ENTRY ;程序的入口 CODE32start MOV R0, #10 ;將立即數(shù)10存入存放器R0 MOV R1, #3 ;將立即數(shù)3存入存放器R1 ADD R0, R0, R1 ;R0=R0+R1stop MOV R0, #0x18 ;這三條指令是ADS調(diào)試環(huán)境特約 LDR R1, =0x20026 ;程序運(yùn)行結(jié)束返回編譯器調(diào)試環(huán)境 SWI 0x123456 END ;結(jié)束4.3.3.3分支程序設(shè)計(jì)許多實(shí)際問(wèn)題需要根據(jù)不同的情況作出不同的處理。在程序中,針對(duì)不同的情況把不同的處理方法編制成各自的處理程序段,運(yùn)行時(shí)由機(jī)器根據(jù)當(dāng)時(shí)的條件自動(dòng)作出判斷,選擇執(zhí)行相應(yīng)的處理程序段。這樣的程序結(jié)構(gòu)中,計(jì)算機(jī)不再完全按指令存儲(chǔ)的順序執(zhí)行,稱之為分支。分支程序使用轉(zhuǎn)移指令B、子程序調(diào)用指令BL或帶狀態(tài)轉(zhuǎn)移指令BX來(lái)實(shí)現(xiàn)。例4?2給定以下符號(hào)函數(shù):

任意給定值,假定為-25,存放在x單元,函數(shù)值存放在y單元;要求根據(jù)x中的值來(lái)確定y的值。

R3=-1R3=0 AREAsymbol,CODE,READONLY ;代碼段的名字symbol ENTRY ;程序的入口 CODE32start LDRR0,=x ;加載數(shù)據(jù)段中的變量x地址,存入R0 LDRR1,=y ;加載數(shù)據(jù)段中的變量y地址,存入R1 LDR R2,[R0] ;加載變量x的值,存入R2compare CMP R2,#0 ;將R2的值與0作比較 BEQ ZERO ;如果R2等于0,那么轉(zhuǎn)向標(biāo)號(hào)ZERO處 BGT PLUS ;如果R2大于0,那么轉(zhuǎn)向標(biāo)號(hào)PLUS處 MOV R3,#-1 ;否那么,R2小于0,將-1存入R3中 B stopZERO MOV R3,#0 ;R2等于0,將0存入R3中 B stopPLUS MOV R3,#1 ;R2大于0,將1存入R3中;續(xù)上段代碼stop STR R3,[R1]

MOV R0,#0x18 LDR R1,=0x20026 SWI 0x123456

AREAData,DATA,READWRITEx DCD -25y DCD 0 END4.3.3.5循環(huán)程序設(shè)計(jì)順序程序和分支程序中的指令每次運(yùn)行最多只執(zhí)行一次。在實(shí)際應(yīng)用中重復(fù)地做某些事的情況很多,這也是計(jì)算機(jī)最擅長(zhǎng)的工作方式。重復(fù)地執(zhí)行某些指令,最好用循環(huán)程序來(lái)實(shí)現(xiàn)。循環(huán)程序的結(jié)構(gòu)---重復(fù)地執(zhí)行同一種運(yùn)算,直到某種條件滿足。初始化循環(huán)體修改判斷判斷結(jié)束循環(huán)程序的主體業(yè)務(wù)代碼,可以是一個(gè)順序程序、分支程序或另一個(gè)循環(huán)程序。例如:計(jì)數(shù)控制循環(huán);通過(guò)計(jì)數(shù)循環(huán)次數(shù),判斷是否已到達(dá)預(yù)定次數(shù),控制循環(huán)。條件控制循環(huán):通過(guò)判斷循環(huán)終止條件是否已成立,控制循環(huán)。建立循環(huán)初始值。如設(shè)置地址指針、計(jì)數(shù)器、其他循環(huán)參數(shù)的起始值等。判斷循環(huán)結(jié)束條件是否成立,決定是否繼續(xù)循環(huán)。對(duì)循環(huán)結(jié)束進(jìn)行適當(dāng)處理;有的循環(huán)程序可以沒(méi)有這局部。為執(zhí)行下一個(gè)循環(huán)而修改某些參數(shù),尤其循環(huán)控制變量的修改等。

用計(jì)數(shù)控制循環(huán) 適用于循環(huán)次數(shù)的循環(huán)程序設(shè)計(jì)例4?4從x單元開(kāi)始的30個(gè)連續(xù)字單元中存放有30個(gè)無(wú)符號(hào)數(shù),從中找出最大者送入y單元中。分析:根據(jù)題意,把第一個(gè)數(shù)先送入Rx存放器,將Rx中的數(shù)與后面的29個(gè)數(shù)逐個(gè)進(jìn)行比較,如果Rx中的數(shù)較小,那么將該較大的數(shù)送入Rx;繼續(xù)與余下的數(shù)據(jù)逐個(gè)比較。在比較過(guò)程中,Rx中始終保持較大的數(shù),共計(jì)比較29次,那么最終Rx中保存了最大數(shù),最后把Rx中的數(shù)〔最大者〕送入y單元。 AREAmax,CODE,READONLY ;代碼段的名字max ENTRY ;程序的入口 CODE32num EQU 29;比較的次數(shù)start LDR R0,=x;R0指向源數(shù)據(jù)塊x LDR R1,=y;R1指向單元y LDR R2,=num;R2作為計(jì)數(shù)器 LDR R3,[R0];將源數(shù)據(jù)塊x中第一個(gè)數(shù)加載到R3中compare ADD R0,R0, #;每進(jìn)行一次比較,將R0指針地址加4 LDR R4,[R0];依次將源數(shù)據(jù)塊x中下一個(gè)數(shù)加載到R4中 CMP R3,R4;比較R3和R4中數(shù)的大小 MOVCCR3,R4;如果R3小于R4,那么將較大的數(shù)送入R3中 SUBS R2,R2,#;計(jì)數(shù)器值減1 BNE compare;如果不為0,那么繼續(xù)跳到compare執(zhí)行 STREQ R3,[R1];如果為0,那么循環(huán)比較結(jié)束,R3是最大的數(shù) ;并且將R3中的數(shù)加載到R1指向的單元〔即y〕中stop MOV r0,#0x18 LDR r1,=0x20026 SWI 0x123456 AREAData,DATA,READWRITEx DCD 73,59,61,34,81,107,225,231,54,43 DCD 100,35,1,42,222,254,34,71,100,31 DCD 33,119,13,44,18,147,55,244,97,3y DCD 0 END② 適用于循環(huán)條件的循環(huán)程序設(shè)計(jì)適用于無(wú)法確定循環(huán)次數(shù),但知道循環(huán)結(jié)束的條件例4?5從自然數(shù)1開(kāi)始累加,直到累加和大于1000為止,統(tǒng)計(jì)被累加的自然數(shù)的個(gè)數(shù),并把統(tǒng)計(jì)的個(gè)數(shù)送入n單元,把累加和送入sum單元。分析:根據(jù)題意,被累加的自然數(shù)的個(gè)數(shù)事先未知,因此不能用計(jì)數(shù)方法控制循環(huán)。但題目中給定一個(gè)條件,即累加和大于1000那么停止累加,因此,可以根據(jù)這一條件控制循環(huán)。我們用R3存放器放累加和,用R4存放器放每次取得的自然數(shù),其中它的值也是統(tǒng)計(jì)自然數(shù)的個(gè)數(shù)。AREASUM,CODE,READONLY ;代碼段的名字SUMENTRY ;程序的入口CODE32startLDRR0,=n;將數(shù)據(jù)段中自然數(shù)的個(gè)數(shù)n的地址加載到R0存放器LDRR1,=sum;將數(shù)據(jù)段中自然數(shù)的累加和sum的地址加載到R1存放器LDRR3,=0;R3存放自然數(shù)的累加和LDRR4,=0;R4用于循環(huán)個(gè)數(shù)的統(tǒng)計(jì)/每次取得的自然數(shù)LDRR5,=1000;R5用于循環(huán)結(jié)束的界限值continueADD R4,R4, #1;取下一個(gè)自然數(shù)ADD R3,R3, R4;累加自然數(shù)CMP R3,R5;比較累加和是否超過(guò)了1000BCC continue;如果小于1000,那么跳到compare執(zhí)行STRCSR3,[R1];如果大于1000,那么將累加和存儲(chǔ)到R1所指向的單元中STRCSR4,[R0];如果大于1000,那么將已累加的自然數(shù)個(gè)數(shù)值存儲(chǔ) ;到R0所指向的單元中stopMOVr0,#0x18LDRr1,=0x20026 SWI0x123456

AREAData,DATA,READWRITEn DCD 0 ;定義累加的自然數(shù)的個(gè)數(shù)sum DCD 0 ;定義自然數(shù)的累加和

END4.3.3.6子程序設(shè)計(jì)子程序概念

如果在一個(gè)程序中的多處用到同一段程序代碼,那么可以把這段共同的程序代碼抽取出來(lái),寫(xiě)成一個(gè)相對(duì)獨(dú)立的程序段,每當(dāng)需要執(zhí)行這段代碼時(shí),就調(diào)用這個(gè)程序段,執(zhí)行完這個(gè)程序段后,再返回原來(lái)調(diào)用它的程序。這樣編寫(xiě)程序時(shí),就不必重復(fù)寫(xiě)這段代碼了,而這樣的程序段稱為子程序或子過(guò)程。子程序的調(diào)用與返回主程序中使用BL指令實(shí)現(xiàn)子程序的調(diào)用

BL 子程序名在子程序結(jié)束處,使用如下指令返回到主程序中。

MOV PC, LR主程序與子程序之間的參數(shù)傳遞

主程序調(diào)用子程序時(shí),可以向子程序傳遞一些參數(shù);同樣,子程序運(yùn)行后也可把一些結(jié)果參數(shù)傳回給主程序。主程序與子程序之間的這種信息傳遞稱為參數(shù)傳遞。三種參數(shù)傳遞方式 ①存放器傳遞參數(shù)方式 ②存儲(chǔ)區(qū)域傳遞參數(shù)方式 ③堆棧傳遞參數(shù)方式存放器傳遞參數(shù)方式技術(shù)思想:主程序?qū)⒋齻鬟f的數(shù)據(jù)直接寫(xiě)入約定的通用存放器,在子程序中直接使用;或子程序返回后,主程序直接從約定的通用存放器中獲得子程序的結(jié)果數(shù)據(jù)。應(yīng)用特點(diǎn):這種方式適合于傳遞較少參數(shù)的應(yīng)用場(chǎng)合。例4?5用子程序?qū)崿F(xiàn)內(nèi)存區(qū)里的字符串拷貝功能,即將存儲(chǔ)單元中源字符串對(duì)應(yīng)拷貝到目的字符串中。解題思路:通過(guò)設(shè)定兩個(gè)地址指針,分別指向存儲(chǔ)區(qū)中的源字符串和目的字符串;然后通過(guò)加載和存儲(chǔ)指令〔LDR和STR〕的存放器間接尋址方式,依次從源字符串讀取一個(gè)字符數(shù)據(jù),寫(xiě)入到目的字符串的對(duì)應(yīng)字符位置中,直到遇到源字符串的結(jié)束標(biāo)志’\0’為止。

AREAStrCopy,CODE,READONLYENTRYCODE32startLDRR1,=srcstr;R1指向數(shù)據(jù)區(qū)的源字符串

LDRR0,=dststr;R0指向數(shù)據(jù)區(qū)的目的字符串

BLstrcopy;調(diào)用子程序strcopy,完成字符串拷貝stopMOVR0,#0x18 ;程序結(jié)束返回編譯器調(diào)試環(huán)境

LDRR1,=0x20026SWI0x123456strcopyLDRBR2,[R1],#1;將R1指向的單元內(nèi)容加載到R2中

STRBR2,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論