基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應(yīng)用課件_第1頁
基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應(yīng)用課件_第2頁
基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應(yīng)用課件_第3頁
基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應(yīng)用課件_第4頁
基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應(yīng)用課件_第5頁
已閱讀5頁,還剩257頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

基于s3c44B0X嵌入式uCLinux系統(tǒng)原理及應(yīng)用主講人:李巖哈爾濱理工大學(xué)計(jì)算機(jī)學(xué)院基于s3c44B0X嵌入式uCLinux系1本章主要內(nèi)容:(1)GCC編譯過程(2)C/C++交叉編譯器arm-elf-gcc(3)交叉匯編器arm-elf-as(4)交叉連接器arm-elf-ld(5)工程管理器make(6)匯編語言編程(7)混合編程本章主要內(nèi)容:(1)GCC編譯過程2

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld3.1需求分析★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設(shè)計(jì)★8混合語言編程第3章目錄★1GNUGCC簡介3

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld3.1需求分析★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設(shè)計(jì)★8混合語言編程第3章目錄★1GNUGCC簡介43.1GNUGCC簡介

GNU集成編譯環(huán)境GCC(GNUCompilerCollection)是一種面向嵌入式領(lǐng)域、支持多種編程語言、支持多種CPU的交叉編譯工具。

輸出預(yù)處理后的C/C++源程序(展開頭文件和替換宏)輸出C/C++源程序的匯編代碼輸出二進(jìn)制目標(biāo)文件生成靜態(tài)庫生成可執(zhí)行程序轉(zhuǎn)換文件格式GNUGCC的基本功能3.1GNUGCC簡介GNU集成編譯環(huán)境53.1GNUGCC簡介GCC組成--------------C/C++交叉編譯器arm-elf-gccarm-elf-gcc是編譯的前端程序,它通過調(diào)用其他程序來實(shí)現(xiàn)將程序源文件編譯成目標(biāo)文件的功能。

arm-elf-gcc具有豐富的命令選項(xiàng),可以控制編譯的各個階段,滿足用戶的各種編譯需求。3.1GNUGCC簡介GCC組成------------63.1GNUGCC簡介GCC組成--------------匯編器arm-elf-as

arm-elf-as將匯編語言程序轉(zhuǎn)換為ELF(ExecutableandLinkingFormat,執(zhí)行時鏈接文件格式)格式的可重定位目標(biāo)代碼,這些目標(biāo)代碼同其它目標(biāo)模塊或函數(shù)庫易于定位和鏈接。說明:arm-elf-as產(chǎn)生一個交叉參考表和一個標(biāo)準(zhǔn)的符號表,產(chǎn)生的代碼和數(shù)據(jù)能夠放在多個區(qū)(Section)中。3.1GNUGCC簡介GCC組成------------73.1GNUGCC簡介GCC組成--------------連接器arm-elf-ld

arm-elf-gcc是編譯的前端程序,arm-elf-ld根據(jù)鏈接定位文件Linkcmds中的代碼區(qū)、數(shù)據(jù)區(qū)、BSS區(qū)和棧區(qū)等定位信息,將可重定位的目標(biāo)模塊鏈接成一個單一的、絕對定位的目標(biāo)程序。3.1GNUGCC簡介GCC組成------------83.1GNUGCC簡介GCC組成--------------庫管理器arm-elf-ar

arm-elf-ar將多個可重定位的目標(biāo)模塊歸檔為一個函數(shù)庫文件。3.1GNUGCC簡介GCC組成------------93.1GNUGCC簡介GCC組成--------------工程管理器MAKE

arm-elf-gccMake是用于自動編譯、鏈接程序的實(shí)用工具,使用make后就不需要手工的編譯每個程序文件。要使用make,首先要編寫makefile。

Makefile描述程序文件之間的依賴關(guān)系,并提供更新文件的命令。3.1GNUGCC簡介GCC組成------------103.1GNUGCC簡介GCC組成-------------其他實(shí)用程序

arm-elf-objcopy目標(biāo)文件格式轉(zhuǎn)換工具等;3.1GNUGCC簡介GCC組成------------113.1GNUGCC簡介GCC編譯程序的基本過程

arm-elf-gcc根據(jù)輸入文件的后綴來確定文件的類型,然后根據(jù)用戶的編譯選項(xiàng)(包括優(yōu)化選項(xiàng)、調(diào)試信息選項(xiàng)等)將其編譯成相應(yīng)的匯編臨時文件(后綴為.s);

arm-elf-as將該匯編文件編譯成目標(biāo)文件(后綴為.o);

arm-elf-ld根據(jù)用戶的鏈接選項(xiàng)(包括指定鏈接命令文件等)將目標(biāo)文件和各種庫鏈接起來生成可執(zhí)行文件。程序的編譯過程3.1GNUGCC簡介GCC編譯程序的基本過程12C/C++源文件Arm-elf-gcc頭文件匯編文件Arm-elf-as目標(biāo)文件源文件列表生成庫連接命令文件可重定位模塊Arm-eif-ldArm-elf-ar用戶庫庫列表可執(zhí)行程序C/C++源文件Arm-elf-gcc頭文件匯編文件Arm-13

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld3.1需求分析★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設(shè)計(jì)★8混合語言編程第3章目錄★1GNUGCC簡介14概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令格式

arm-elf-gcc[options]file…在命令arm-elf-gcc后面跟一個或多個選項(xiàng),選項(xiàng)間用空格隔開,然后跟一個或多個目標(biāo)文件。例如,將test.c編譯成目標(biāo)文件test.o并且生成調(diào)試信息:arm-elf-gcc–g–c–otest.otest.c概述3.2C/C++交叉編譯器arm-elf-gcc---15概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-c 將輸入的源文件編譯成目標(biāo)文件-S 將C/C++文件生成匯編文件-ofile將輸出內(nèi)容存于文件file-pipe在編譯的不同階段之間采用管道通訊方式-v 打印出編譯過程中執(zhí)行的命令-xlanguage 說明文件的輸入類型為language輸出控制選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---16概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-ansi支持所有ANSIC程序C語言選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---17概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-w關(guān)閉所有警告-Wall打開所有警告-Wimplicit如果有隱含申明,顯示警告信息-Wno-implicit不顯示對隱含申明的警告警告選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---18概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-g在文件中產(chǎn)生調(diào)試信息(調(diào)試信息的文件格式有stabs、COFF、XCOFF、DWARF)調(diào)試選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---19概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-O0不優(yōu)化-O1一級優(yōu)化-O2二級優(yōu)化-O3三級優(yōu)化優(yōu)化選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---20概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-E運(yùn)行C的預(yù)處理器-C在運(yùn)用-E進(jìn)行預(yù)處理時不去掉注釋-Dmacro定義宏macro為1-Dmacro=defn定義宏macro為defn預(yù)處理選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---21概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-Wa,option將選項(xiàng)option傳遞給匯編器匯編選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---22概述3.2C/C++交叉編譯器arm-elf-gcc------------------命令選項(xiàng)列表-Idir設(shè)置搜索路徑為dir-I-指定只對#include“file”,有效的頭文件搜索目錄搜索路徑選項(xiàng):概述3.2C/C++交叉編譯器arm-elf-gcc---23概述3.2C/C++交叉編譯器arm-elf-gcc------------------源文件類型的識別*.c ——C源文件*.i ——經(jīng)過預(yù)處理后的C源文件*.h ——C頭文件*.ii ——經(jīng)過預(yù)處理后的C++源文件*.cc ——C++源文件*.cxx ——C++源文件*.cpp ——C++源文件*.C ——C++源文件*.s ——不需要預(yù)處理的匯編文件*.S ——需要預(yù)處理的匯編文件arm-elf-gcc能夠自動根據(jù)文件名后綴識別文件類型.概述3.2C/C++交叉編譯器arm-elf-gcc---24命令使用3.2C/C++交叉編譯器arm-elf-gcc例如,將test.c編譯成匯編程序并存放于文件test.txt:arm-elf-gcc–S–otest.txttest.c-ofile將輸出內(nèi)容存于文件file,僅適用于只有一個輸出文件時。-----------輸出文件名的指定命令使用3.2C/C++交叉編譯器arm-elf-gcc例25命令使用3.2C/C++交叉編譯器arm-elf-gcc例如,

將test.c編譯成test.o:arm-elf-gcc–c–otest.otest.c-c將輸入的源文件編譯成目標(biāo)文件。-----------目標(biāo)文件的生成命令使用3.2C/C++交叉編譯器arm-elf-gcc例26命令使用3.2C/C++交叉編譯器arm-elf-gcc例如,將test.c編譯生成匯編文件test.s:arm-elf-gcc–S–otest.stest.c-S將C/C++文件生成匯編文件。---------將C/C++文件生成匯編文件命令使用3.2C/C++交叉編譯器arm-elf-gcc例27命令使用3.2C/C++交叉編譯器arm-elf-gcc例如,對test.c進(jìn)行預(yù)處理并將結(jié)果輸出到屏幕:arm-elf-gcc–Etest.c-E只對源文件進(jìn)行預(yù)處理并且缺省輸出到標(biāo)準(zhǔn)輸出。---------預(yù)處理文件的生成命令使用3.2C/C++交叉編譯器arm-elf-gcc例28命令使用3.2C/C++交叉編譯器arm-elf-gcc頭文件的引用有兩種形式:一種是#include“filename”,一種是#include<filename>。 前一種形式的路徑搜索順序是:當(dāng)前目錄、指定的搜索路徑;后一種形式只搜索指定路徑。-Idir將目錄dir添加到頭文件搜索目錄列表的第一項(xiàng)。-I--I-以前用-I指定的頭文件搜索目錄只對#include“file”有效,對#include<file>無效;-I-以后指定的頭文件搜索目錄對以上兩種形式的頭文件都有效。---------設(shè)置頭文件搜索路徑命令使用3.2C/C++交叉編譯器arm-elf-gcc頭29命令使用3.2C/C++交叉編譯器arm-elf-gcc頭文件的引用有兩種形式:一種是#include“filename”,一種是#include<filename>。 前一種形式的路徑搜索順序是:當(dāng)前目錄、指定的搜索路徑;后一種形式只搜索指定路徑。-Idir-I----------設(shè)置頭文件搜索路徑例如,編譯test.c,在當(dāng)前目錄和/include中搜索test.c所包含的頭文件:arm-elf-gcc–I./–I/include–ctest.c命令使用3.2C/C++交叉編譯器arm-elf-gcc頭30命令使用3.2C/C++交叉編譯器arm-elf-gcc例如,如果有隱含申明,顯示警告信息:arm-elf-gcc–c–Wimplicittest.c不顯示對隱含申明的警告:arm-elf-gcc–c–Wno–implicittest.c常用的警告選項(xiàng)有:-w關(guān)閉所有警告信息。-Wall打開所有警告信息。可以使用以-W開頭的不同選項(xiàng)對特定警告進(jìn)行設(shè)定。對于每種警告類型都有相應(yīng)以-Wno-開始的選項(xiàng)關(guān)閉警告。---------控制警告產(chǎn)生命令使用3.2C/C++交叉編譯器arm-elf-gcc例31命令使用3.2C/C++交叉編譯器arm-elf-gcc-O1可以部分減小代碼尺寸,對運(yùn)行速度有一定的提高。較多地使用了寄存器變量,提高指令的并行度。-O2除了解循環(huán)、函數(shù)插裝和靜態(tài)變量優(yōu)化,幾乎包含arm-elf-gcc所有優(yōu)化選項(xiàng)。一般在生成固化代碼時使用該選項(xiàng)較為適宜。-O3包含-O2的所有優(yōu)化,并且還包含了解循環(huán)、函數(shù)插裝和靜態(tài)變量優(yōu)化。通常情況下,該級優(yōu)化生成的代碼執(zhí)行速度最快,但是代碼尺寸比-O2大一些。

arm-elf-gcc支持多種優(yōu)化選項(xiàng),總體上劃分為三級優(yōu)化:---------實(shí)現(xiàn)優(yōu)化命令使用3.2C/C++交叉編譯器arm-elf-gcc-32命令使用3.2C/C++交叉編譯器arm-elf-gcc例如:編譯test.c并且預(yù)定義宏RUN_CACHE值為1:arm-elf-gcc–c–DRUN_CACHEtest.c編譯test.c并且預(yù)定義宏RUN_CACHE值為0:arm-elf-gcc–c–DRUN_CACHE=0test.c-Dmacro 定義宏macro為1。-Dmacro=defn 定義宏macro為defn。---------在命令行定義命令使用3.2C/C++交叉編譯器arm-elf-gcc例33

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld

★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設(shè)計(jì)★8混合語言編程第3章目錄★1GNUGCC簡介34概述3.2交叉連接器arm-elf-ld

---------命令格式arm-elf-ld[option]file…命令行后跟選項(xiàng)和可重定位的目標(biāo)文件名。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接的庫為libxxx.a,生成內(nèi)存映象文件map.txt,鏈接定位文件為linkcmds,則命令如下:arm-elf-ld-Mapmap.txt-Tlinkcmds-L./lib–odemo.elfdemo.o–lxxx概述3.2交叉連接器arm-elf-ld--------35概述3.2交叉連接器arm-elf-ld

---------命令選項(xiàng)列表-eentry 指定程序入口-M 輸出鏈接信息-lar 指定鏈接庫-Ldir 添加搜索路徑-o 設(shè)置輸出文件名-Tcommandfile 指定鏈接命令文件-v 顯示版本信息-Map 制定輸出映像文件概述3.2交叉連接器arm-elf-ld--------36命令使用3.2交叉連接器arm-elf-ld

---------程序入口地址-eentry以符號entry作為程序執(zhí)行的入口地址,而不從默認(rèn)的入口地址開始。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接定位文件為linkcmds,將入口地址設(shè)為_start,命令如下:arm-elf-ld–Tlinkcmds–e_start–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----37命令使用3.2交叉連接器arm-elf-ld

---------輸出鏈接信息-M在標(biāo)準(zhǔn)端口打印出符號映象表和內(nèi)存分布信息。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,在標(biāo)準(zhǔn)端口打印出符號映象表和內(nèi)存分布信息,命令如下:arm-elf-ld–M–odemo.elfdemo.o如果標(biāo)準(zhǔn)輸出設(shè)置為顯示器,運(yùn)行命令后將在顯示器上顯示內(nèi)存映象信息和符號映象表。

命令使用3.2交叉連接器arm-elf-ld-----38命令使用3.2交叉連接器arm-elf-ld

---------輸出鏈接信息-Mapmapfile將鏈接的符號映象表和內(nèi)存分布信息輸出到文件mapfile里。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,將鏈接的符號映象表和內(nèi)存分布信息輸出到文件map.txt里,命令如下:arm-elf-ld–Mapmap.txt–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----39命令使用3.2交叉連接器arm-elf-ld

---------指定鏈接的庫出-lar指定庫文件libar.a為鏈接的庫??梢灾貜?fù)使用-l來指定多個鏈接的庫。例如:鏈接的輸入文件為demo.o,指定libxxx.a為鏈接的庫,輸出文件為demo.elf,命令如下:arm-elf-ld–odemo.elfdemo.o–lxxx命令使用3.2交叉連接器arm-elf-ld-----40命令使用3.2交叉連接器arm-elf-ld

---------添加庫和腳本文件的搜索路徑-Ldir將dir添加到搜索路徑。例如:例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,將/lib添加到庫的搜索路徑,命令如下:arm-elf-ld-L./lib–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----41命令使用3.2交叉連接器arm-elf-ld

---------設(shè)置輸出文件的名字-ooutput將輸出文件名字設(shè)定為output。如果不指定輸出文件名,arm-elf-ld生成文件名默認(rèn)為a.out。例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,命令如下:arm-elf-ld–odemo.elfdemo.o命令使用3.2交叉連接器arm-elf-ld-----42linkcmds連接命令文件3.2交叉連接器arm-elf-ld

-----調(diào)用linkcmds首先寫一個鏈接命令文件linkcmds,然后在arm-elf-ld的命令中使用-Tlinkcmds參數(shù),就能在鏈接時自動調(diào)用linkcmds文件.例如:鏈接的輸入文件為demo.o,輸出文件為demo.elf,鏈接定位文件為linkcmds,則命令如下:arm-elf-ld–Tlinkcmds–odemo.elfdemo.olinkcmds連接命令文件3.2交叉連接器arm-elf43linkcmds連接命令文件3.2交叉連接器arm-elf-ld

-----編寫linkcmds

arm-elf-ld的命令語言是一種描述性的腳本語言,它主要應(yīng)用于控制:有哪些輸入文件、文件的格式怎樣、輸出文件中的模塊怎樣布局、分段的地址空間怎樣分布、以及未初始化的數(shù)據(jù)段怎樣處理等。

用命令語言寫成的文件(通常稱為linkcmds)具有可重用性,不必每次在命令行輸入一大堆命令選項(xiàng).并且對于不同的應(yīng)用,只需對linkcmds進(jìn)行簡單的修改就可以使用。linkcmds連接命令文件3.2交叉連接器arm-elf44linkcmds連接命令文件3.2交叉連接器arm-elf-ld

-----編寫linkcmds(1)arm-elf-ld命令語言(2)表達(dá)式(3)linkcmds的結(jié)構(gòu)(4)對程序入口的說明(5)對程序頭的說明(6)對內(nèi)存布局的說明(7)對分段的說明(8)注釋linkcmds連接命令文件3.2交叉連接器arm-elf45

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設(shè)計(jì)★8混合語言編程第3章目錄★1GNUGCC簡介463.3工程管理器make

概述---------命令格式

make[-fmakefile][option][target]… make命令后跟-f選項(xiàng),指定makefile的名字為makefile;option表示make的一些選項(xiàng);target是make指定的目標(biāo),在3.4.3將詳細(xì)說明。例如:makefile的名字是my_hello_make: make–fmy_hello_make3.3工程管理器make概述---------命令格式473.3工程管理器make

概述---------命令選項(xiàng)列表-f 指定makefile-e 使環(huán)境變量優(yōu)先于makefile的變量-Idir 設(shè)定搜索目錄-i 忽略make過程中所有錯誤-n 只顯示執(zhí)行過程,而不真正執(zhí)行-r 使隱含規(guī)則無效-w 顯示工作目錄-Cdir 讀取makefile設(shè)置的工作目錄-s 不顯示執(zhí)行的命令

3.3工程管理器make概述---------命令選項(xiàng)483.3工程管理器make

命令使用---------指定makefile-fmakefile用該選項(xiàng)指定makefile的名字為makefile。如果make中多次使用-f指定多個makefile,則所有makefile將鏈接起來作為最后的makefile。如果不指定makefile,make默認(rèn)的makefile依次為“makefile”、“Makefile”。例如:make–fmy_hello_make3.3工程管理器make命令使用---------指定493.3工程管理器make

命令使用---------指定環(huán)境變量優(yōu)先于makefile文件中的變量-e使環(huán)境變量優(yōu)先于makefile文件中的變量。例如:

make–e3.3工程管理器make命令使用---------指定503.3工程管理器make

命令使用---------指定包含文件的搜索路徑-Idir指定在解析makefile文件中的.include時的搜索路徑為dir。如果有多個路徑,將按輸入順序依次查找。例如:

make–I/include/mk3.3工程管理器make命令使用---------指定513.3工程管理器make

命令使用---------忽略錯誤-i忽略make執(zhí)行過程中的所有錯誤。例如:

make–i3.3工程管理器make命令使用---------忽略523.3工程管理器make

命令使用---------顯示命令的執(zhí)行過程-n只顯示命令的執(zhí)行過程而不真正執(zhí)行。例如:

make–n3.3工程管理器make命令使用---------顯示533.3工程管理器make

命令使用---------使隱含規(guī)則無效-r使make的隱含規(guī)則無效,清除后綴名規(guī)則中默認(rèn)的后綴清單。例如:

make–r3.3工程管理器make命令使用---------使隱543.3工程管理器make

命令使用---------顯示執(zhí)行過程中的工作目錄-w顯示make執(zhí)行過程中的工作目錄。例如:

make–w3.3工程管理器make命令使用---------顯示553.3工程管理器make

命令使用---------讀取makefile文件前設(shè)置工作目錄-Cdir在讀取makefile文件以前將工作目錄改變?yōu)閐ir,完成make后改回原來的目錄。例如:

make–Cbsp3.3工程管理器make命令使用---------讀取563.3工程管理器make

命令使用---------不顯示所執(zhí)行的命令-s運(yùn)行make時用選項(xiàng)-s可以不顯示執(zhí)行的命令,只顯示生成的結(jié)果文件。例如:

make–s3.3工程管理器make命令使用---------不顯573.3工程管理器make

編寫一個makefile---------makefile的結(jié)構(gòu)makefile文件包含:顯式規(guī)則隱含規(guī)則變量定義指令注釋3.3工程管理器make編寫一個makefile--583.3工程管理器make

編寫一個makefile---------編寫makefile中的規(guī)則targets:dependencies command … 或者 targets:dependencies;command command …指定目標(biāo)名,通常是一個程序產(chǎn)生的目標(biāo)文件名,也可能是執(zhí)行一個動作的名字,名字之間用空格隔開。描述產(chǎn)生target所需的文件,一個target通常依賴于多個dependency。用于指定該規(guī)則的命令。3.3工程管理器make編寫一個makefile--593.3工程管理器make

編寫一個makefile例如:smcinit:smc.oconfig.oarm-elf-ar–ruvs–osmcinit.asmc.oconfig.osmc.o:smc.cinclude.harm-elf-gcc–c–osmc.osmc.cconfig.o:config.cinclude.harm-elf-gcc–c–oconfig.oconfig.cclean:rm*.o表示目標(biāo)名的有smcinit、smc.o、config.o。smcinit依賴于smc.o和config.o,而smc.o又依賴于smc.c和include.h,config.o依賴于config.o和include.h.各目標(biāo)分別由命令arm-elf-ar–ruvs–osmcinit.asmc.oconfig.o;arm-elf-gcc–c–osmc.osmc.c;arm-elf-gcc–c–oconfig.oconfig.c來生成。clean為一動作名,刪除所有后綴為.o的文件。

---------編寫makefile中的規(guī)則3.3工程管理器make編寫一個makefile例如603.3工程管理器make

編寫一個makefile---------makef調(diào)用makefile中的規(guī)則在默認(rèn)情況下,make運(yùn)行不是以“.”開頭的第一條規(guī)則。在上面的例子中,make默認(rèn)執(zhí)行的是規(guī)則smcinit,此時只需要輸入命令:makemake將讀入makefile,然后執(zhí)行第一條規(guī)則,例子中該規(guī)則是鏈接目標(biāo)文件生成庫,因此必須執(zhí)行規(guī)則smcinit依賴的規(guī)則smc.o和config.o。在執(zhí)行過程中將自動更新他們所依賴的文件。有些規(guī)則不是被依賴的規(guī)則,需要make指定才能被運(yùn)行,如上面的例子中的clean規(guī)則可以這樣執(zhí)行:makeclean這兩種方式的結(jié)果一樣。只是第一種方式?jīng)]指明目標(biāo)名,第二種方式指明了目標(biāo)名。3.3工程管理器make編寫一個makefile--613.3工程管理器make

編寫一個makefile--------設(shè)置makefile中文件的搜索路徑在makefile中,可以通過給VPATH賦值來設(shè)置規(guī)則中目標(biāo)文件和依賴文件的搜索目錄。make首先搜索當(dāng)前目錄,如果未找到依賴的文件,make將按照VPATH中給的目錄依次搜索。3.3工程管理器make編寫一個makefile--623.3工程管理器make

編寫一個makefile--------如何定義變量在makefile中變量可以被這樣定義: CC=arm-elf-gcc AS:=arm-elf-as AR=arm-elf-ar LIBPATH:=./lib從上面的定義中可以看出,有兩種定義變量的形式:變量名=值變量名:=值為了簡化makefile以及減少不必要的錯誤,可以用變量的形式來代表目標(biāo)文件名或字符串,在需要使用時直接調(diào)用變量。3.3工程管理器make編寫一個makefile--633.3工程管理器make

編寫一個makefile--------引用變量有兩種方式:${VarName}$(VarName)

兩種方式的效果一樣。VarName表示變量名。3.3工程管理器make編寫一個makefile--643.3工程管理器make

編寫一個makefile--------make提供的常用變量例如:demo.o:demo.cdemo.h${CC}${CFLAGS}$<-o$@$<的值為demo.c,$@的值為demo.o,而$^的值為demo.cdemo.h。

$@——表示目標(biāo)名$^——表示所有的依賴文件$<——第一個依賴文件3.3工程管理器make編寫一個makefile--653.3工程管理器make

編寫一個makefile--------make里的常用函數(shù)常用的函數(shù)有:(1)$(substfrom,to,text)將字text中的from子串替換為to子串。(2)$(patsubstpattern,replacement,text)按模式pattern替換text中的字串。函數(shù)的使用方式有兩種:$(functionarguments)${functionarguments}

3.3工程管理器make編寫一個makefile--663.3工程管理器make

編寫一個makefile--------隱含規(guī)則實(shí)際上使用的隱含規(guī)則如下所示:對*.c-->*.o的隱含規(guī)則為:%.o:%.c${CC}${CFLAGS}$<-o$@對于*.s-->*.o的隱含規(guī)則為:%.o:%.s${AS}${ASFLAGS}$<-o$@隱含規(guī)則是指由make自定義的規(guī)則,常用的有:由*.c的文件生成*.o的文件由*.s的文件生成*.o的文件3.3工程管理器make編寫一個makefile--67

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設(shè)計(jì)★8混合語言編程第3章目錄★1GNUGCC簡介683.5交叉匯編器arm-elf-as概述---------命令格式arm-elf-as[option…][asmfile…]在命令arm-elf-as后面跟一個或多個選項(xiàng),以及該選項(xiàng)的子選項(xiàng),選項(xiàng)間用空格隔開,然后跟匯編源文件名。例如:將demo.s編譯成目標(biāo)文件,并且設(shè)置頭文件的搜索目錄為C:\demo\include:arm-elf-as–I//c/demo/includedemo.s3.5交叉匯編器arm-elf-as概述--------693.5交叉匯編器arm-elf-as概述---------命令選項(xiàng)列表-a[dhlns] 顯示arm-elf-as信息-f 不進(jìn)行預(yù)處理-Ipath 設(shè)置頭文件搜索路徑-o 設(shè)定輸出文件名-v 顯示版本信息-W 不顯示警告提示-Z 不顯示錯誤提示3.5交叉匯編器arm-elf-as概述--------703.5交叉匯編器arm-elf-as命令使用---------生成目標(biāo)文件每次運(yùn)行arm-elf-as只輸出一個目標(biāo)文件,默認(rèn)狀態(tài)下名字為a.out??梢酝ㄟ^-o選項(xiàng)指定輸出文件名字,通常都以.o為后綴。例如:編譯demo.s輸出目標(biāo)文件demo.o: arm-elf-as–odemo.odemo.s3.5交叉匯編器arm-elf-as命令使用------713.5交叉匯編器arm-elf-as命令使用---------設(shè)置頭文件搜索路徑-Ipath添加路徑path到arm-elf-as的搜索路徑,搜索.include”file”指示的文件。-I可以被使用多次以添加多個目錄,當(dāng)前工作目錄將最先被搜索,然后從左到右依次搜索-I指定的目錄。例如:編譯demo.s時指定兩個搜索目錄,當(dāng)前目錄和C:\demo\include:arm-elf-as–I../–I//c/demo/includedemo.s3.5交叉匯編器arm-elf-as命令使用------723.5交叉匯編器arm-elf-as命令使用---------顯示arm-elf-as信息內(nèi)容-a[dhlns]打開arm-elf-as信息顯示。dhlns為其子選項(xiàng),分別表示:d ——不顯示調(diào)試信息h ——顯示源碼信息l ——顯示匯編列表n ——不進(jìn)行格式處理s ——顯示符號列表3.5交叉匯編器arm-elf-as命令使用------733.5交叉匯編器arm-elf-as命令使用---------設(shè)置目標(biāo)文件名字-Ipath添加路徑path到arm-elf-as的搜索路徑,搜索.include”file”指示的文件。-I可以被使用多次以添加多個目錄,當(dāng)前工作目錄將最先被搜索,然后從左到右依次搜索-I指定的目錄。例如:編譯demo.s時指定兩個搜索目錄,當(dāng)前目錄和C:\demo\include:arm-elf-as–I../–I//c/demo/includedemo.s3.5交叉匯編器arm-elf-as命令使用------743.5交叉匯編器arm-elf-as命令使用---------如何取消警告內(nèi)容-W加選項(xiàng)-W以后,運(yùn)行arm-elf-as就不輸出警告信息。例如:編譯demo.s輸出目標(biāo)文件demo.o,不輸出警告信息:arm-elf-as–W–odemo.odemo.s

3.5交叉匯編器arm-elf-as命令使用------753.5交叉匯編器arm-elf-as命令使用---------設(shè)置是否進(jìn)行預(yù)處理arm-elf-as內(nèi)部的預(yù)處理程序,完成以下工作:調(diào)整并刪除多余空格,刪除注釋,將字符常量改成對應(yīng)的數(shù)值。例如:編譯demo.s輸出目標(biāo)文件demo.o,并且編譯時不進(jìn)行預(yù)處理,則命令如下:arm-elf-as–f–odemo.odemo.s

3.5交叉匯編器arm-elf-as命令使用------76

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設(shè)計(jì)★8混合語言編程第3章目錄★1GNUGCC簡介773.6匯編語言編程匯編語言---------基本元素(1)字符集匯編中使用下列字符組成源程序的各種語法元素:大寫字母A~Z;小寫字母a~z;數(shù)字0~9;符號+-*/=[]();,.:‘@$&#<>{}%_“\-|^?!。其中大小寫字母作用不同。3.6匯編語言編程匯編語言---------基本元素(1)783.6匯編語言編程匯編語言---------基本元素(2)約定的名字包括寄存器名、指令名字和偽操作符。每一個偽操作符表示一定功能的操作。3.6匯編語言編程匯編語言---------基本元素(2)793.6匯編語言編程匯編語言---------基本元素(2)約定的名字偽操作符可以分為六類:數(shù)據(jù)定義偽操作符符號定義偽操作符程序結(jié)構(gòu)偽操作符條件匯編偽操作符宏偽操作符其他偽操作符3.6匯編語言編程匯編語言---------基本元素(2)803.6匯編語言編程匯編語言---------基本元素(3)定義的名字匯編程序中的標(biāo)號、分段名、宏定義名都是用戶可以定義的名字。①標(biāo)號標(biāo)號只能由a~z、A~Z、0~9、.、_等字符組成,標(biāo)號的長度不受限制,大小寫字母有區(qū)別。3.6匯編語言編程匯編語言---------基本元素(3)813.6匯編語言編程匯編語言---------基本元素(3)定義的名字匯編程序中的標(biāo)號、分段名、宏定義名都是用戶可以定義的名字。②分段名匯編系統(tǒng)中預(yù)定義的分段名有:.text.bss.data.sdata.sbss等,但是用戶可以自己定義段名,語法如下: .sectionsection_nameattribute3.6匯編語言編程匯編語言---------基本元素(3)823.6匯編語言編程匯編語言---------基本元素(3)定義的名字匯編程序中的標(biāo)號、分段名、宏定義名都是用戶可以定義的名字。②分段名匯編系統(tǒng)中預(yù)定義的分段名有:.text.bss.data.sdata.sbss等,但是用戶可以自己定義段名,語法如下: .sectionsection_nameattribute例如:定義一個可以執(zhí)行的代碼段.mytext .section".mytext","ax" mycode …3.6匯編語言編程匯編語言---------基本元素(3)833.6匯編語言編程匯編語言---------基本元素(3)定義的名字匯編程序中的標(biāo)號、分段名、宏定義名都是用戶可以定義的名字。③宏定義名宏定義的語法如下:.macromacro_nameparm1…parmNmacrobody.endm3.6匯編語言編程匯編語言---------基本元素(3)843.6匯編語言編程匯編語言---------基本元素(4)常數(shù)二進(jìn)制數(shù)由0b或者0B開頭,如:0b1000101、0B1001110;十六進(jìn)制數(shù)以0x或者0X開頭,如:0x4567、0X10089;八進(jìn)制數(shù)由0開頭,如:0345、09870;十進(jìn)制數(shù)以非零數(shù)開頭,如:345、129803.6匯編語言編程匯編語言---------基本元素(4)853.6匯編語言編程匯編語言---------基本元素(5)當(dāng)前地址數(shù)當(dāng)前的地址數(shù)用點(diǎn)號“.”表示,在匯編程序中可以直接使用該符號。(6)表達(dá)式在匯編程序中可以使用表達(dá)式,在表達(dá)式中可以使用常數(shù)和數(shù)值。可以使用的運(yùn)算符有: ①前綴運(yùn)算符號 -——取負(fù)數(shù) ~——取補(bǔ)數(shù) ②中綴運(yùn)算符號 */%<<<>>>|&^!+-3.6匯編語言編程匯編語言---------基本元素(5)863.6匯編語言編程匯編語言---------基本元素(7)注釋符號

不同芯片的匯編程序中,注釋的符號有所不同,ARM以“@”開頭的程序行是注釋行。3.6匯編語言編程匯編語言---------基本元素(7)873.6匯編語言編程匯編語言---------語句(1)語句類型注釋符號匯編語句按其作用和編譯的情況分為兩大類:執(zhí)行性語句和說明性語句。3.6匯編語言編程匯編語言---------語句(1)語句883.6匯編語言編程匯編語言---------語句(2)數(shù)據(jù)語句一字節(jié)數(shù)據(jù)定義語句兩字節(jié)數(shù)據(jù)定義語句四字節(jié)數(shù)據(jù)定義語句八字節(jié)數(shù)據(jù)定義單個字串定義多個字串1多個字串2重復(fù)數(shù)據(jù)定義3.6匯編語言編程匯編語言---------語句(2)數(shù)據(jù)893.6匯編語言編程匯編語言---------語句(3)列表控制語句①.title“heading” 在匯編列表中將“heading“作為標(biāo)題。②.list 系統(tǒng)遇此語句就輸出列表文件。3.6匯編語言編程匯編語言---------語句(3)列表903.6匯編語言編程匯編語言---------語句(4)一般執(zhí)行語句不同的芯片有不同指令集,見相關(guān)的指令手冊。3.6匯編語言編程匯編語言---------語句(4)一般913.6匯編語言編程匯編語言---------程序結(jié)構(gòu)(1)程序結(jié)構(gòu)語句程序結(jié)構(gòu)語句是偽操作符定義的說明語句,用于說明程序段的開始、結(jié)束以及源程序的結(jié)束等。3.6匯編語言編程匯編語言---------程序結(jié)構(gòu)(1)923.6匯編語言編程匯編語言---------程序結(jié)構(gòu)(1)程序結(jié)構(gòu)語句程序結(jié)構(gòu)語句是偽操作符定義的說明語句,用于說明程序段的開始、結(jié)束以及源程序的結(jié)束等。代碼段的開始.text②數(shù)據(jù)段的開始.data③源程序的結(jié)束.end3.6匯編語言編程匯編語言---------程序結(jié)構(gòu)(1)933.6匯編語言編程匯編語言---------程序結(jié)構(gòu)(2)過程(函數(shù))的定義過程的結(jié)構(gòu)如下: 過程名: 過程體 返回語句例如:.align2 .globluart1_sendch .typeuart1_sendch,@function uart1_sendch: ldr r2,=SYSFLG1: ldr r1,[r2] tst r1,#UTXFF1 bne 1b ldr r2,=UARTDR1 strb r0,[r2] mov pc,lr 一般情況下,.type和.align聲明可以缺省。

3.6匯編語言編程匯編語言---------程序結(jié)構(gòu)(2)943.6匯編語言編程宏語句與條件編程---------等價語句(1).equ語句語法:.equsymbol,expression 例子:.equPPC_PC,32*4 應(yīng)用:stw r4,PPC_PC(r1)

(2).set語句 與.equ的功能相同。

3.6匯編語言編程宏語句與條件編程---------等價語953.6匯編語言編程宏語句與條件編程---------宏定義與宏調(diào)用宏定義:.macromacro_nameparam1,param2,…..paramN .macrobody.endm例如:(使用ARM的匯編指令集說明) .macroROMSEC_patovaTTPA,pa_start,va_start,tmp,ic

ldr \tmp,=APFIELD_ROM add \TTPA,\TTPA,\va_start,LSR#18 add \tmp,\tmp,\pa_start20: str \tmp,[\TTPA],#4 add \tmp,\tmp,#0x10000 subs \ic,\ic,#1 bne 20b

.endm3.6匯編語言編程宏語句與條件編程---------宏定義963.6匯編語言編程宏語句與條件編程---------重復(fù)塊和源文件的嵌入(1)重復(fù)塊定義: .reptcount contents .endr例如: .rept2 .long0x12908 .endr等價于: .long0x12908 .long0x12908(2)源文件的嵌入在一個匯編文件中可以嵌入其它匯編文件,例如匯編頭文件等。方法如下:.include“filename”3.6匯編語言編程宏語句與條件編程---------重復(fù)塊973.6匯編語言編程宏語句與條件編程---------條件編譯.ifexpression表達(dá)式為非零則編譯后面的語句,否則后面的語句被忽略。.ifdefsymbol如果符號被定義則編譯后面的語句,否則后面的語句被忽略。.ifndefsymbol如果符號未被定義則編譯后面的語句,否則后面的語句被忽略。.else表示與前面的if語句的條件相反。.endif表示條件判斷結(jié)束。3.6匯編語言編程宏語句與條件編程---------條件編983.6匯編語言編程宏語句與條件編程---------條件編譯例如: .macrosumfrom=0,to=5 .long\from .if\to-\from sum“(\from+1)”,\to .endif .endm應(yīng)用: sum,5等價于 .long0 …… .long5 條件判斷可以嵌套使用,if-else-endif遵循最近匹配的原則。3.6匯編語言編程宏語句與條件編程---------條件編993.6匯編語言編程模塊化程序設(shè)計(jì)---------全局符號在模塊中定義的、要被別的模塊使用的符號(包括變量名和函數(shù)名)都必須被聲明為全局符號。方法如下:

.globalsymbol在本模塊中要使用其他模塊中的全局符號,可以用.externsymbol的方式聲明,但也可以不用聲明在匯編時自動認(rèn)為它是其它模塊中的全局符號。3.6匯編語言編程模塊化程序設(shè)計(jì)---------全局符1003.6匯編語言編程模塊化程序設(shè)計(jì)---------模塊間的符號互用

(1)匯編模塊與匯編模塊間的調(diào)用(2)匯編模塊調(diào)用C語言模塊中的函數(shù)(3)匯編模塊使用C語言模塊中的變量(4)C語言模塊調(diào)用匯編模塊中的函數(shù)(5)C語言模塊使用匯編模塊中的變量3.6匯編語言編程模塊化程序設(shè)計(jì)---------模塊間1013.6匯編語言編程內(nèi)存模式

在uClinux

環(huán)境下,內(nèi)存模式為平模式,即整個內(nèi)存空間最大為4GB。 所有任務(wù)共享這4GB的空間,而不是每個任務(wù)有單獨(dú)的4G虛擬空間。 所有的尋址都是32位地址的方式,因此程序模塊間可以很容易的共享變量和數(shù)據(jù)。3.6匯編語言編程內(nèi)存模式 在uClinux環(huán)境下,1023.6匯編語言編程StrongARM&ARM7---------寄存器名字類型說明r0~r14通用寄存器f0~f7浮點(diǎn)寄存器pc指令指針ps機(jī)器狀態(tài)寄存器fps浮點(diǎn)狀態(tài)寄存器3.6匯編語言編程StrongARM&ARM7-----1033.6匯編語言編程StrongARM&ARM7---------如何在匯編模塊中調(diào)用C語言模塊中的函數(shù)

在調(diào)用C函數(shù)之前,必須在當(dāng)前棧中空出至少8個字節(jié)的空間,然后才調(diào)用C函數(shù)。C函數(shù)的第一個參數(shù)(最左邊的參數(shù))用r0傳遞,后面的參數(shù)依次用r1、r2等來傳遞。例如:假定C函數(shù)為intget_sum(intvar1,intvar2),則在匯編程序中首先將參數(shù)送到r0、r1中,然后將棧指針減8,最后調(diào)用get_sum。注意:C函數(shù)名在匯編中使用時不用加下劃線3.6匯編語言編程StrongARM&ARM7-----1043.6匯編語言編程StrongARM&ARM7---------注釋符號以“@”開頭的程序行是注釋行。3.6匯編語言編程StrongARM&ARM7-----1053.6匯編語言編程StrongARM&ARM7---------一般程序.title“example”.data.globalvar1var1:.long0x897678,0x2378789.byte89,56,23.string“hello”.bss.globalzero_varzero_var:.short0,0,0.long0,0,0,03.6匯編語言編程StrongARM&ARM7-----1063.6匯編語言編程StrongARM&ARM7---------一般程序.textUART1INIT_TEST:ldrr3,=SYSCON1ldrr0,[r3]tstr0,#UART1ENbeq2f1:ldrr1,[r3]tstr1,#UTXFF1bne1b2:bicr0,r0,#UART1ENstrr0,[r3]bicr0,r0,#SIREN3.6匯編語言編程StrongARM&ARM7-----1073.6匯編語言編程StrongARM&ARM7---------一般程序strr0,[r3]orrr0,r0,#UART1ENstrr0,[r3]ldrr3,=SYSFLG2ldrr0,[r3]andr0,r0,#0x40movpc,lr.section“.mytext”,“ax”.globalu1b_setu1b_set:ldrr3,=UBLCR1strr0,[r3]movpc,lr.end3.6匯編語言編程StrongARM&ARM7-----108

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設(shè)計(jì)★8混合語言編程第3章目錄★1GNUGCC簡介1093.7簡單程序設(shè)計(jì)順序程序設(shè)計(jì)例3-1用ARM指令實(shí)現(xiàn)的C賦值語句:x=(a+b)-c可以用r0表示a、rl表示b、r2表示c和r3表示x,用r4作為間接尋址寄存器。ADRr4,a ;讀取變量a的地址LDRr0,[r4] ;讀a的內(nèi)容到r0ADRr4,b ;讀取變量b的地址LDRrl,[r4];讀b內(nèi)容到r1ADDr3,r0,rl ;a+b的結(jié)果保存在r3ADRr4,c ;讀取變量c的地址LDRr2,[r4] ;讀c的內(nèi)容到r2SUBr3,r3,r2 ;(a+b)-c結(jié)果保存到r3ADRr4,x ;讀x的地址STRr3,[r4] ;保存變量x3.7簡單程序設(shè)計(jì)順序程序設(shè)計(jì)例3-1用ARM指令實(shí)現(xiàn)的1103.7簡單程序設(shè)計(jì)順序程序設(shè)計(jì)例3-2

用ARM指令實(shí)現(xiàn)的C賦值語句:z=(a<<2)|(b&15)可以使用r0表示a和z,r1表示b,r4表示地址進(jìn)行編碼

ADRr4,a;讀取變量a的地址到r4LDRr0,[r4];讀a的內(nèi)容到r0MOVr0,r0,LSL2;實(shí)現(xiàn)a<<2操作,結(jié)果保存在r0ADRr4,b;讀取變量b的地址到r4LDRrl,[r4];讀b的內(nèi)容到r1ANDr1,r1,#15;實(shí)現(xiàn)b&15操作,結(jié)果保存在r1中ORRrl,r0,rl;計(jì)算z的結(jié)果ADRr4,z;讀取變量z的地址到r4STRrl,[r4];保存變量z

3.7簡單程序設(shè)計(jì)順序程序設(shè)計(jì)例3-2用ARM指令實(shí)現(xiàn)的1113.7簡單程序設(shè)計(jì)分支程序設(shè)計(jì)例3-3在ARM中實(shí)現(xiàn)下面if語句:if(a<b){x=5;y=c+d:}elsex=c-d;

實(shí)現(xiàn)上述指令的第一種方法比較傳統(tǒng)并且和其他微處理器相似。下列指令使用條件分支和無條件數(shù)據(jù)操作:3.7簡單程序設(shè)計(jì)分支程序設(shè)計(jì)例3-3在ARM中實(shí)現(xiàn)下面i1123.7簡單程序設(shè)計(jì)分支程序設(shè)計(jì)例3-4在ARM中實(shí)現(xiàn)C的switch語句C中的switch語句采用下列形式:switch(test){case0:...break;case1:...break;}

上述語句也可以像if語句那樣編碼,首先測試test=A,然后測試test=B,依此類推.3.7簡單程序設(shè)計(jì)分支程序設(shè)計(jì)例3-4在ARM中實(shí)現(xiàn)C的s1133.7簡單程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)例3-5用ARM指令實(shí)現(xiàn)FIR過濾器FIR(finiteimpulserresponse)過濾器是一種處理信號的常用方法;FIR過濾器是簡單的對積求和:∑cixi1≤i≤n作為過濾器使用時,xi假定為周期性采集的數(shù)據(jù)樣品,ci是系數(shù)。3.7簡單程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)例3-5用ARM指令實(shí)現(xiàn)FI114這種表示假定樣品是周期性采集而來的,每次一個新的樣品到來都要重新計(jì)算一次FIR過濾器的輸出?!鞣娇虮硎敬鎯倓偟絹淼臉悠樊a(chǎn)生xi時延元素。延遲的樣品分別單獨(dú)與c相乘,然后求和得到過濾器的輸出fΔΔΔΔΣc1c2c3c4x1x2x3x4這種表示假定樣品是周期性采集而來的,每次一個1153.7簡單程序設(shè)計(jì)子程序設(shè)計(jì)

每個C函數(shù)返回一個值(除非它的返回類型是void);一般把不返回值的結(jié)構(gòu)稱為子例程或過程。3.7簡單程序設(shè)計(jì)子程序設(shè)計(jì)每個C函數(shù)返回一個116

第3章目錄★1GNUGCC簡介★2C/C++交叉編譯器arm-elf-gcc★3交叉連接器arm-elf-ld★4工程管理器MAKE★5交叉匯編器arm-elf-as★6匯編語言編程★7簡單程序設(shè)計(jì)★8混合語言編程第3章目錄★1GNUGCC簡介1173.8混合語言編程

匯編語言與C/C++的混合編程通常有以下幾種方式:在C/C++代碼中嵌入?yún)R編指令;在匯編程序和C/C++的程序之間進(jìn)行變量的互訪;匯編程序、C/C++程序間的相互調(diào)用。3.8混合語言編程 匯編語言與C/C++的混合編程通常有以下118如何在C語言內(nèi)嵌匯編語言3.8混合語言編程-----------內(nèi)嵌匯編的語法__asm {指令[;指令]/*注釋*/ …… [指令] }

如何在C語言內(nèi)嵌匯編語言3.8混合語言編程--------119如何在C語言內(nèi)嵌匯編語言3.8混合語言編程-----------內(nèi)嵌匯編的語法例3-6使能/禁能IRQ中斷__inlinevoidenable_IRQ(void){inttmp;__asm//嵌入?yún)R編代碼{MRStmp,CPSR//讀取CPSR的值BICtmp,tmp,#0x80MSR CPSR_c,tmp}}如何在C語言內(nèi)嵌匯編語言3.8混合語言編程--------120如何在C語言內(nèi)嵌匯編語言3.8混合語言編程-----------內(nèi)嵌匯編的語法例3-6使能/禁能IRQ中斷__inlinevoiddisable_IRQ(vold)inttmp;__asm{MRStmp,CPSRORRtmp,tmp,#0x80MSRCPSR_c,tmp}}如何在C語言內(nèi)嵌匯編語言3.8混合語言編程--------121如何在C語言內(nèi)嵌匯編語言3.8混合語言編程-----------內(nèi)嵌匯編的指令用法(1)操作數(shù)內(nèi)嵌的匯編指令中作為操作數(shù)的寄存器和常量可以是C表達(dá)式。(2)物理寄存器內(nèi)嵌匯編中使用物理寄存器有以下限制:不能直接向PC寄存器賦值使用物理寄存器的指令中,不要使用過于復(fù)雜的C表達(dá)式。編譯器可能會使用R12或R13存放編譯的中間結(jié)果通常內(nèi)嵌的匯編指令中不要指定物理寄存器,如何在C語言內(nèi)嵌匯編語言3.8混合語言編程--------122如何在C語言內(nèi)嵌匯編語言3.8混合語言編程-----------內(nèi)嵌匯編的指令用法(3)常量。在內(nèi)嵌匯編指令中,常量前面的“#”可以省略。(4)指令展開。內(nèi)嵌的匯編指令中,如果包含常量操作數(shù),則該指令有可能被內(nèi)嵌匯編器展開成幾條指令。(5)標(biāo)號。C程序中的標(biāo)號可以被內(nèi)嵌的匯編指令使用。但是只有指令B可以使用C程序中的標(biāo)號,而指令BL則不能使用。如何在C語言內(nèi)嵌匯編語言3.8混合語言編程--------123如何在C語言內(nèi)嵌匯編語言3.8混合語言編程-----------內(nèi)嵌匯編的指令用法(6)內(nèi)存單元的分配。所有的內(nèi)存分配均由C編譯器完成,分配的內(nèi)存單元通過變量供內(nèi)嵌匯編器使用。內(nèi)嵌匯編器不支持內(nèi)嵌匯編程序中用于內(nèi)存分配的偽指令。如何在C語言內(nèi)嵌匯編語言3.8混合語言編程--------124如何在C語言內(nèi)嵌匯編語言3.8混合語言編程-----------內(nèi)嵌匯編的指令用法(7)SWI和BL指令。在內(nèi)嵌的SWI和BL指令中,除了正常的操作數(shù)域外,還必須增加以下3個可選的寄存器列表:

第1個寄存器列表中的寄存器用于輸入的參數(shù)。第2個寄存器列表中的寄存器用于存儲返回的結(jié)果。第3個寄存器列表中的寄存器的內(nèi)容可能被被調(diào)用的子程序破壞,即這些寄存器是供被調(diào)用的子程序作為工作寄存器。如何在C語言內(nèi)嵌匯編語言3.8混合語言編程--------125如何在C語言內(nèi)嵌匯編語言3.8混合語言編程-----------內(nèi)嵌匯編器與armasm匯編器的差異內(nèi)嵌匯編器不支持通過“.”指示符或PC獲取當(dāng)前指令地址不支持“LDRRn,=expr”偽指令,而使用“MOVRn,expr”指令向寄存器賦值;不支持標(biāo)號表達(dá)式;不支持ADR和ADRL偽指令;不支持BX指令;不能向PC賦值。使用0x前綴代替“&”,表示十六進(jìn)制數(shù)。當(dāng)使用8位移位常數(shù)導(dǎo)致CPSR的ALU標(biāo)志更新時,N、Z、C和V標(biāo)志中的C不具有真實(shí)意義。如何在C語言內(nèi)嵌匯編語言3.8混合語言編程--------1263.8混合語言編程如何在C語言內(nèi)嵌匯編語言-----------內(nèi)嵌匯編注意事項(xiàng)(1)必須小心使用物理寄存器.如R0~R3、PC、LR和CPSR中的N、Z、C和V標(biāo)志位,因?yàn)橛?jì)算匯編代碼中的C表達(dá)式時,可能會使用這些物理寄存器,并會修改N、Z、C和V標(biāo)志位。例如: __asm {MOVvar,x ADDy,var,x/y } 計(jì)算x/y時R0會被修改。內(nèi)嵌匯編器探測到隱含的寄存器沖突就會報(bào)錯。3.8混合語言編程如何在C語言內(nèi)嵌匯編語言--------1273.8混合語言編程如何在C語言內(nèi)嵌匯編語言-----------內(nèi)嵌匯編注意事項(xiàng)(2)不要使用寄存器代替變量。例如: intbad_f(intx)//

溫馨提示

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

評論

0/150

提交評論