第一篇:ARM 2017年復(fù)習(xí)題總結(jié)
ARM 2017年復(fù)習(xí)題總結(jié)
簡答題
什么是嵌入式操作系統(tǒng)?
答:嵌入式系統(tǒng)是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟/硬件可裁減,功能。可靠性,成本,體積,功耗要求嚴(yán)格的專用計(jì)算機(jī)系統(tǒng)。
與通用計(jì)算機(jī)相比,嵌入式系統(tǒng)有哪些特點(diǎn)? 答:(1).嵌入式系統(tǒng)通常是面向特定應(yīng)用的;
(2).嵌入式系統(tǒng)是將計(jì)算機(jī)技術(shù),半導(dǎo)體技術(shù)和電子技術(shù)與各行各業(yè)的具體應(yīng)用相結(jié)合的后的產(chǎn)物,是一門綜合技術(shù)學(xué)科;
(3).嵌入式系統(tǒng)和具體應(yīng)用有機(jī)的結(jié)合在一起,它的升級換代也是和具體產(chǎn)品同步進(jìn)行的,因此嵌入式產(chǎn)品一旦進(jìn)入市場,就有較長的生命周期;
(4).為了提高執(zhí)行速度和可靠性,嵌入式系統(tǒng)中的軟件一般都固化在存儲器芯片或單片機(jī)本身中,而不是存儲于磁盤等載體中;
(5).嵌入式系統(tǒng)本身不具有自主開發(fā)能力,即使設(shè)計(jì)完成以后用戶通常也不能對其中的程序功能進(jìn)行修改,必須有一套開發(fā)工具和環(huán)境才能進(jìn)行開發(fā)。
ARM處理器有幾種尋址方式,說明各種尋址的方式。答:
立即尋址:操作數(shù)直接放在指令中。例如:ADD R0,R0,#0x3f ;R0←R0+0x3f 寄存器尋址:操作數(shù)放在寄存器中。例如:ADD R0,R1,R2
;R0←R1+R2 寄存器間接尋址:操作數(shù)在內(nèi)存,以寄存器中的值作為操作數(shù)的地址。例如:LDR R0,[R1]
;R0←[R1] 基址加偏移量尋址(基址變址尋址):基址寄存器的內(nèi)容與指令中的偏移量相加形成操作數(shù)的有效地址
例如:LDR R0,[R1,#4] LDR R0,[R1,R2] ;R0←[R1+R2]
;R0←[R1+4] 多寄存器尋址:一條指令可以完成多個寄存器值的傳送。例如: LDMIA R0,{R1,R2,R3,R4} 12] 堆棧尋址:堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進(jìn)后出(First In Last Out,F(xiàn)ILO)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向棧頂。例如:STMFD R13!,{R0,R4-R12,LR} LDMFD R13!,{R0,R4-R12,PC}
/ 17
;R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+舉例介紹嵌入式處理器有哪幾類?
答:1.嵌入式微處理器(Embedded Microprocessor Unit,EMPU);
2.嵌入式微控制器;(Embedded Microcontroller Unit,EMCU)
3.嵌入式DSP處理器(Embedded Digital Signal Processor,EDSP);
4.嵌入式片上系統(tǒng)(Embedded System on Chip,EsoC); 什么是立即數(shù)?請簡要描述立即數(shù)在使用時有什么注意要點(diǎn)。
立即數(shù),主要是指尋址時直接在指令中出現(xiàn)的數(shù),在使用時注意(1)立即數(shù)前需要加#(2)ARM指令只有32位長,立即數(shù)在指令中占12位存儲空間,ARM用這12位空間8位表示有效數(shù)字-基數(shù)B,4位表示譯為的數(shù)M,按照把B循環(huán)右移M*2位,構(gòu)造成一個新的32位的數(shù),其它位補(bǔ)0,所以在使用立即數(shù)時,要注意其是否合法。請問BL指令跳轉(zhuǎn)時LR寄存器保存的是什么內(nèi)容?并請簡述原因。
BL跳轉(zhuǎn)時,LR中保存的是執(zhí)行BL跳轉(zhuǎn)指令的下一條指令的地址,考慮流水線的情況,即當(dāng)前的PC-4。LR用來在需要返回程序時從LR中還原程序執(zhí)行的位置繼續(xù)執(zhí)行。ARM內(nèi)核有多少個寄存器,請列舉出這些寄存器的名字和數(shù)量。
ARM有37個寄存器,(1)未分組寄存器:R0-R7,共8個;(2)分組寄存器R8-R14,其中FIQ模式下有單獨(dú)的一組R8-R12共5個,另外6種模式共用一組R8-R12,共5個,USR和SYS模式共用一組R13-R14,共2個,另外5種模式下各有獨(dú)自的一組R13-R14,共10個;(3)程序計(jì)數(shù)器PC即R15寄存器,共1個;(4)狀態(tài)寄存器CPSR,和5個備份狀態(tài)寄存器SPSR,共6個;ARM總計(jì)37個寄存器。
ARM通用寄存器中,有3個寄存器有特殊功能和作用,請寫出它們的名字和作用。(6分)R13:SP棧指針寄存器,用來保存程序執(zhí)行時的棧指針位置;R14:LR返回鏈接寄存器,用來保存程序執(zhí)行BL指令或模式切換時的返回原程序繼續(xù)執(zhí)行的地址;R15:PC程序計(jì)數(shù)器,保存程序執(zhí)行的當(dāng)前地址。
ARM的CPSR寄存器的位定義如圖所示,試簡述各位的功能。(8分)
3***6543210NZCV標(biāo)志位含義 保留IFTM[4-0]
N N=1 表示運(yùn)算的結(jié)果為負(fù)數(shù);N=0 表示運(yùn)算的結(jié)果為正數(shù)或零 Z Z=1 表示運(yùn)算的結(jié)果為零;Z=0 表示運(yùn)算的結(jié)果為非零 C C=1 表示有進(jìn)位,C=0 表示沒有進(jìn)位 V V=1 表示符號位溢出,V=0 表示結(jié)果沒有溢出 Q 在ARM vTE/J 架構(gòu)支持,指示DSP 指令是否溢出
J 僅ARM 5TE/J 架構(gòu)支持,J = 1 表示處理器處于Jazelle 狀態(tài) I I=1 表示禁止IRQ F F=1 表示禁止FIQ T 僅ARM xT 架構(gòu)支持,T = 0 表示處理器處于ARM 狀態(tài),T=1 表示處理器處于Thumb 狀態(tài)
什么是偽指令和偽操作?在ARM匯編中有哪幾種偽 指令?
/ 17
答:在ARM匯編語言程序中有些特殊助記符,這些助記符與一般指令的助記符的不同之處在于沒有相對應(yīng)的操作碼或者機(jī)器碼,通常稱這些特殊指令助記符偽指令,他們多完成的操作成為偽操作;
在ARM匯編中,有如下幾種偽指令:
(1)符號定義偽指令;
(2)數(shù)據(jù)定義偽指令;
(3)匯編控制偽指令;
(4)信息報告?zhèn)沃噶睿?/p>
(5)宏指令及其他偽指令。
如何定義寄存器列表,試舉一個使用寄存器列表的例子,要求實(shí)現(xiàn)4個字的內(nèi)存復(fù)制。答:
AREA
EXAMPLE1,CODE,READONLY
ENTRY LDR
R0,=0XFF
;把地址0XFF賦給R0
LDR
R5,=0X0F
;把地址0X0F賦給R5 START PBLOCK
RLIST
{R1-R4}
;把R1-R4定義為PBLOCK LDMIA
R0,PBLOCK
;把R0為首地址的內(nèi)存4個字單元裝載至R1到R4中 STMIA
R5,PBLOCK
;把R1到R4的值依次存至R5為首地址的內(nèi)存字單元 STOP
B
STOP
;死循環(huán)
END
如何定義一個宏,宏與子程序的區(qū)別是什么? 答:宏的格式為:
MARCO和MEND [$標(biāo)號]
宏名
[$參數(shù)1,$參數(shù)2…..] 指令序列 MEND
MARCO表示一個宏定義的開始,MEND表示一個宏的結(jié)束,MARCO和MEND前呼后應(yīng)可以將一段代碼定義為一個整體,又稱宏,然后在程序中就可以在程序中通過宏的名稱及參數(shù)調(diào)用該段代碼。
宏指令可以重復(fù)使用,這一點(diǎn)的使用方式與子程序有些相似,子程序可以節(jié)省存儲空間,3 / 17
提供模塊化的程序設(shè)計(jì)。但使用子程序機(jī)構(gòu)時需要保存/恢復(fù)現(xiàn)場,從而增加了系統(tǒng)的開銷,因此,在代碼傳遞的參數(shù)較多并且比較短時,可以使用宏代替子程序,宏在被調(diào)用的地方展開。
ARM匯編中如何定義一個段,段有幾種屬性?
答:AREA用于定義一個代碼段,數(shù)據(jù)段,或者特定屬性的段。
段的幾種屬性如下:
READONLY表示只讀屬性;
READWRITE表示本段可讀寫;
CODE定義代碼段;
DATA定義數(shù)據(jù)段;
ALIGN=表達(dá)式的對齊方式為2的表達(dá)式次方;;
COMMON:定義一個通用段,這個段不包含用戶代碼和數(shù)據(jù)。
在一個匯編源文件中如何包含另一個文件中的內(nèi)容?
答:通常可以使用GET/INCLUDE指令,在某源文件中定義一些宏指令,用MAP和FIELD定義結(jié)構(gòu)化數(shù)據(jù)結(jié)構(gòu)類型,用EQU定義常量的符號名稱,然后用GET/INCLUDE將這個源文件包含到其他源文件中。
1.ARM7TDMI采用了幾級流水線工作方式,簡要說明。答:三級
1、取指令
2、譯碼
3、執(zhí)行
2.ARM9采用了幾級流水線工作方式,簡要說明。
答:五級流水線工作方式,1.取指2.指令譯碼3.執(zhí)行4.數(shù)據(jù)存儲訪問5.寫寄存器 3.哈佛體系結(jié)構(gòu)和馮諾依曼體系結(jié)構(gòu)有何不同。
答:哈佛體系結(jié)構(gòu)的兩套地址總線和數(shù)據(jù)總線是分開的,馮諾依曼體系結(jié)構(gòu)是復(fù)用的。1.簡述ARM發(fā)生異常時,ARM核心會自動做哪些事情?從異常返回時,我們要做哪些事情?
當(dāng)異常產(chǎn)生時, ARM core: 拷貝 CPSR 到 SPSR_
改變處理器狀態(tài)進(jìn)入 ARM 狀態(tài) 改變處理器模式進(jìn)入相應(yīng)的異常模式 設(shè)置中斷禁止位禁止相應(yīng)中斷(如果需要)保存返回地址到 LR_
/ 17
設(shè)置 PC 為相應(yīng)的異常向量 返回時, 異常處理需要: 從 SPSR_
Note:這些操作只能在 ARM 態(tài)執(zhí)行.2.用ARM匯編指令寫出實(shí)現(xiàn)64位加法和64位減法的代碼段,使用的寄存器請自行分配。假定低32位數(shù)存放在r0和r1里面,高32位數(shù)存放在r2和r3里面。加法:
ADDS r0, r0, r1 //加S是因?yàn)橐屵@個操作影響標(biāo)志位
ADC r2, r2, r3 //ADC是帶進(jìn)位的加法,如果上一條指令產(chǎn)生進(jìn)位則一起加進(jìn)來 減法:
SUBS r0, r0, r1 //加S是因?yàn)橐屵@個操作影響標(biāo)志位 SBC r2, r2, r3 // SBC是帶進(jìn)位的減法指令
3.請列舉ARM處理器的模式和異常,并說明各個發(fā)生異常時ARM處理器所處的模式 異常: Reset Data Abort FIQ IRQ Prefetch Abort SWI Undefined instruction 處理器模式
User : 非特權(quán)模式,大部分任務(wù)執(zhí)行在這種模式?
FIQ : 當(dāng)一個高優(yōu)先級(fast)? 中斷產(chǎn)生時將會進(jìn)入這種模式
IRQ : 當(dāng)一個低優(yōu)先級(normal)中斷產(chǎn)生時將會進(jìn)入這種模式?
Supervisor? :當(dāng)復(fù)位或軟中斷指令執(zhí)行時將會進(jìn)入這種模式
Abort : 當(dāng)存取異常時將會進(jìn)入這種模式?
Undef :? 當(dāng)執(zhí)行未定義指令時會進(jìn)入這種模式
System : 使用和User模式相同寄存器集的特權(quán)模式? 4.FIQ的什么特點(diǎn)使得它處理的速度比IRQ快? 1)FIQ優(yōu)先級比IRQ高,不會被中斷
2)FIQ有自己的專屬寄存器:r8~r12,不用對通用寄存器入棧保護(hù),可以加快速度 3)FIQ位于異常向量表的末尾0x1c,故無需跳轉(zhuǎn),可以在這里直接放置異常處理函數(shù) 5.什么指令可以放在中斷向量表?
/ 17
跳轉(zhuǎn)指令,給PC賦值的指令 B,LDR,MOV 6.ARM處理器 中斷向量表位于存儲器的什么位置? 默認(rèn):0x0 也可以配置成:0Xffff0000 7.下列 ARM 指令將做什么? a)LDRH r0,[r1,#6] b)LDR r0, =0x999 a:將r1寄存器的值加上6,然后把以這個值為地址的內(nèi)存單元里的值取半字(低16位)賦給r0 b:將立即數(shù)0x999賦給r0,注意這是一個偽指令 8.SWP 指令的優(yōu)勢是什么?用來實(shí)現(xiàn)什么功能?
功能:在寄存器和存儲器之間,由一次存儲器讀和一次存儲器寫組成的原子操作。完成一個字節(jié)或字的交換??梢杂脕韺?shí)現(xiàn)信號量 9.專業(yè)名詞解釋
RISC
(Reduce Instruct Set Computer);
IP
(Intellectual Property);
ISR
(Interrupt Servers Routine)JTAG
(Join Test Active Group)
IDE
(Integrate Development Environment)RTOS(實(shí)時操作系統(tǒng)); CISC(復(fù)雜指令集); Kernel(內(nèi)核)
Scheduler(調(diào)度)non-preemptive(非搶先式)
初始化代碼直接對ARM微處理器內(nèi)核及硬件控制器編程,多采用匯編語言編程,初始化代碼一般應(yīng)包含如下典型任務(wù):(1)定義程序入口點(diǎn)(2)設(shè)置異常向量;(3)初始化存儲器系統(tǒng);(4)初始化堆棧指針寄存器;(5)初始化臨界I/O設(shè)備;(6)初始化C代碼的運(yùn)行環(huán)境;(7)改變處理器的運(yùn)行模式和狀態(tài);
/ 17
(8)使能中斷;(9)進(jìn)入C代碼運(yùn)行
選擇題
1.ARM 屬于 RISC 架構(gòu)
2.ARM 指令集是 32位寬,Thumb 指令集是16位寬的。3.ARM 指令集是4字節(jié)對齊,Thumb 指令集是2字節(jié)對齊的 4.復(fù)位后,ARM處理器處于SVC模式,ARM狀態(tài)
5.ARM處理器總共37個寄存器,System模式下使用17個寄存器,SVC模式下使用18個寄存器。
6.ARM處理器中優(yōu)先級別最高的異常為RESET,F(xiàn)IQ,IRQ異??梢杂脕硐鄳?yīng)中斷 7.ARM數(shù)據(jù)處理指令中有效的立即數(shù)是(ACEGH)
[A] 0X00AB0000
[B] 0X0000FFFF [C ] 0XF000000F [D ] 0X08000012 [E] 0X00001F80 [F] 0XFFFFFFFF [G] 0 [H] 0XFF000000 8.ATPCS規(guī)定中,推薦子函數(shù)參數(shù)最大為4 個 9.ATPCS規(guī)定中,棧是滿減
10.在ARM匯編編程,寄存器有多個別名,通常PC是指R15,LR 是指R14,SP是指R13 11.CPSR寄存器中反映處理器狀態(tài)的位是T位 12.下面屬于ARM 子程序調(diào)用指令的是BL 13.ARM7屬于馮.諾依曼結(jié)構(gòu),ARM9屬于哈佛結(jié)構(gòu)。14.ARM7是3級流水線,ARM9是5級流水線。
15.ARM中可以訪問狀態(tài)寄存器的指令是MRS,能夠訪問內(nèi)存的指令是LDR 16.下面哪種操作系統(tǒng)最方便移植到嵌入式設(shè)備中(D)
[A] DOS [B] UNIX [C ] WINDOWS XP [D ]LINUX 17.以下哪項(xiàng)關(guān)于SRAM和DRAM的區(qū)別是不對(A)
(A)SRAM比DRAM慢
(B)SRAM比DRAM耗電多(C)DRAM存儲密度比SRAM高得多
(D)DRM需要周期性刷新
18.下面哪種嵌入式操作系統(tǒng)很少用于手機(jī)終端設(shè)備上(CE)
(A)Symbian
(B)WinCE
(C)uc/os 19.S3C2410采用的是ARM920T核心
20.下面哪點(diǎn)不是嵌入式操作系統(tǒng)的特點(diǎn)(C)A.內(nèi)核精簡 B.專用性強(qiáng)
C.功能強(qiáng)大
D.高實(shí)時性
(D)linux(E)VxWorks 21.NAND FLASH和NOR FLASH的敘述正確的是(D)A.NOR的讀速度比NAND稍慢一些
B.NAND的寫入速度比NOR慢很多
/ 17
C.NAND的擦除速度遠(yuǎn)比NOR的慢 22.MMU的作用有(AB)
D.大多數(shù)寫入操作需要先進(jìn)行擦除操作
[A] 內(nèi)存保護(hù)
[B] 地址轉(zhuǎn)換 [C ] 加快存取速度 [D ] 安全保密 [E] 內(nèi)存分配 23.以下屬于DMA特點(diǎn)的有(BC)
[A] 占用CPU
[B] 占用總線 [C ] 不占用CPU [D ] 不占用總線 24.以下哪種方式不屬于文件系統(tǒng)的格式(B)(A)FAT
1.在ARM體系結(jié)構(gòu)中,要從主動用戶模式(User)切換到超級用戶模式(Supervisor),采用何種方法?先修改程序狀態(tài)備份寄存器(SPSR)到對應(yīng)的模式,再更新CPU狀態(tài)
2.嵌入式系統(tǒng)加電或復(fù)位后,所有的 CPU 通常都從某個由 CPU 制造商預(yù)先安排的地址上取指令。例如:對于S3C2410來說,Boot Loader會映射到0x00000000地址處。
3.CPSR中的低8位稱為控制位,下列不屬于控制位的是【A】。A、N
B、I
C、F
D、T 4.ARM中可以訪問狀態(tài)寄存器的指令是MRS,能夠訪問內(nèi)存的指令是LDR。5.下列條件碼中表示不相等的是NE。EQ 相等 NE 不相等
CS/HS 無符號數(shù)大于或等于 CC/LO 無符號數(shù)小于 MI 負(fù)數(shù) PL 正數(shù)或零 VS 溢出 VC 沒有溢出 HI 無符號數(shù)大于
LS 無符號數(shù)小于或等于 GE 有符號數(shù)大于或等于
LT 有符號數(shù)小于
GT 有符號數(shù)大于
LE 有符號數(shù)小于或等于
AL 任何 無條件執(zhí)行(指令默認(rèn)條件)NV 任何 從不執(zhí)行(不要使用)6.CPSR中的低8位稱為控制位,其中I位等于1表示禁止IRQ中斷。
7.ARM微處理器支持7種工作模式。其中,除用戶模式之外的其余6種稱為特權(quán)模式,在這6種之中,除系統(tǒng)模式之外的其余5種又稱為異常模式。8.下列ARM指令中,可用于滿遞增堆棧操作的是STMIB。9.ARM偽指令中,可用于大范圍地址讀取的是LDR。10.同CISC相比,下面哪一項(xiàng)不屬于RISC處理器的特征?!綝】
A、采用固定長度的指令格式,指令規(guī)整、簡單、基本尋址方式有2~3種。B、減少指令數(shù)和尋址方式,使控制部件簡化,加快執(zhí)行速度。
C、數(shù)據(jù)處理指令只對寄存器進(jìn)行操作,只有加載/存儲指令可以訪問存儲器,以提高指令的執(zhí)行效率,同時簡化處理器的設(shè)計(jì)。
/ 17
(B)DOS
(C)NTFS
(D)Ext D、RISC處理器都采用哈佛結(jié)構(gòu)
11.以下敘述中,不符合RISC指令系統(tǒng)特點(diǎn)的是【B】。A、指令長度固定,指令種類少
B、尋址方式種類豐富,指令功能盡量增強(qiáng) C、設(shè)置大量通用寄存器,訪問存儲器指令簡單 D、選取使用頻率較高的一些簡單指令
12.下面關(guān)于ARM處理器的體系結(jié)構(gòu)描述哪一個是錯誤的?!綛】 A、三地址指令格式
B、所有的指令都是多周期執(zhí)行 C、指令長度固定 D、Load-Store結(jié)構(gòu)
1.相對于ARM指令集,Thumb指令集的特點(diǎn)是【D】。A、指令執(zhí)行速度快
B、16位指令集,可以得到密度更高的代碼,對于需要嚴(yán)格控制成本的設(shè)計(jì)非常有意義 C、Thumb模式有自己獨(dú)立的寄存器
D、16位指令集,代碼密度高,加密性能好
2.在ARM寄存器結(jié)構(gòu)中,棧指針使用R13寄存器。
3.32位體系結(jié)構(gòu)的ARM處理器有7種不同的處理器工作模式,和6個主要用來標(biāo)識CPU工作狀態(tài)和程序運(yùn)行狀態(tài)的狀態(tài)寄存器。
4.在下列ARM處理器的各種模式中,只有用戶模式不可以自由地改變處理器的工作模式。5.在ARM的匯編程序中,ADR、ADRL、LDR、NOP等被稱為偽指令。
填空題
1.常見的ARM處理器內(nèi)核有ARM7、ARM9和【ARM11】等。2.按總線所傳送的信息類型,總線分為【地址總線】、【數(shù)據(jù)總線】和【控制總線】。3.GPIO的中文全稱是【通用輸入/輸出口】。
4.ARM處理器有兩種狀態(tài),分別是【ARM】和【Thumb】。5.計(jì)算機(jī)結(jié)構(gòu)分為【馮·諾依曼】結(jié)構(gòu)和【哈佛】結(jié)構(gòu)。
6.ARM處理器支持的數(shù)據(jù)類型中,字節(jié)為【8】位、半字為【16】位、字為【32】位。7.ARM體系結(jié)構(gòu)版本中V【4】版架構(gòu)是目前應(yīng)用最廣的ARM體系架構(gòu),ARM7、【ARM9】都采用該架構(gòu)。
8.常用的嵌入式操作系統(tǒng)有【嵌入式Linux】、【VxWords】等。9.ARM嵌入式系統(tǒng)主要由【嵌入式硬件】、【嵌入式軟件】和【開發(fā)工具】構(gòu)成。10.S3C2410 支持兩種引導(dǎo)方式,分別是【Nor-Flash】啟動方式、【Nand-Flash】啟動方式。11.一個嵌入式系統(tǒng)由3部分組成,分別是【嵌入式硬件】、【嵌入式軟件】和【開發(fā)工具】。
判斷題:
1、所有的電子設(shè)備都屬于嵌入式設(shè)備。(F)
2、馮諾依曼體系將被哈佛總線所取代。(F)
3、嵌入式開發(fā)不需要硬件支持。(F)
/ 17
4、移植操作系統(tǒng)時需要修改操作系統(tǒng)中與處理器直接相關(guān)的程序。F
5、USB2.0的最大通信速率為12MB。(F)
6、嵌入式開發(fā)需要專門的軟件和硬件設(shè)備。(T)
編程題
;例三:ADR偽指令 AREA adrlabel1, CODE, READONLY
ENTRY
start
BL func
B.LTORG func
ADR R0, start
ADR R1, DataArea
;ADR R2, DataArea+4300
ADRL R3, DataArea+4300
MOV PC, LR DataArea
SPACE 8000
END
;例五:利用跳轉(zhuǎn)表實(shí)現(xiàn)程序跳轉(zhuǎn)
AREA Jump, CODE, READONLY num EQU 2
ENTRY start
MOV R0, #0
MOV R1, #3
MOV R2, #2
BL arithfunc
B.arithfunc
CMP R0, #num
MOVHS PC, LR
ADR R3, JumpTable
LDR PC, [R3,R0,LSL #2] JumpTable
DCD DoAdd
DCD DoSub DoAdd
ADD R0, R1, R2
MOV PC, LR
/ 17
DoSub
SUB R0, R1, R2
MOV PC, LR
END
3、存儲器從0x400000開始的100個單元中存放著ASCII碼,編寫程序,將其所有的小寫字母轉(zhuǎn)換成大寫字母,對其它的ASCII碼不做變換。
MOV R0,#0x400000
MOV R1,#0 LP
LDRB R2,[R0,R1]
CMP R2,#0x61
BLO NEXT
CMP R2,#0x7B;0x61---0x7A為小寫字母的ASC
SUBLO R2,R2,#0x20
STRBLO R2,[R0,R1] NEXT
ADD R1,R1,#1
CMP R1,#100
BNE LP
8、編寫一簡單ARM匯編程序段,實(shí)現(xiàn)1+2+…+100的運(yùn)算。
MOV R2,#100
MOV R1,#0 LOOP
ADD R1,R1,R2 ;R1中為累加和
SUBS R2,R2,#1 ;R2控制循環(huán)
BNE LOOP
4、編寫程序,比較存儲器中0x400000和0x400004兩無符號字?jǐn)?shù)據(jù)的大小,并且將比較結(jié)果存于0x400008的字中,若兩數(shù)相等其結(jié)果記為0,若前者大于后者其結(jié)果記為1,若前者小于后者其結(jié)果記為-1。
MOV R0,#0x400000
LDR R1,[R0] ;取第1個數(shù)
LDR R2,[R0,#4] ;取第2個數(shù)
CMP R1,R2 ;兩個數(shù)相比較
MOVHI R1,#1 ;R1大
MOVLO R1,#-1 ;R1小
MOVEQ R1,#0 ;兩個數(shù)相等
STR R1,[R0,#8]
7、編寫一程序,存儲器中從0x400200開始有一個64位數(shù)。(1)將取反,再存回原處;(2)求其補(bǔ)碼,存放到0x400208處。
LDR R0,=0x400200
LDR R2,=0xFFFFFFFF
LDR R1,[R0] ;取低32位數(shù)
EOR R1,R1,R2 ;取反
/ 17
STR R1,[R0] ;存低32位反碼
ADDS R1,R1,#1 ;又加1為求補(bǔ)
STR R1,[R0,#8] ;存低32位補(bǔ)碼
LDR R1,[R0,#4] ;取高32位數(shù)
EOR R1,R1,R2 ;取反
STR R1,[R0,#4] ;存高32位反碼
ADC R1,R1,#0 ;高32位求補(bǔ)
STR R1,[R0,#12] ;存高32位補(bǔ)碼
例七:匯編語言與C/C++的混和編程 項(xiàng)目名:Example7.mcp 文件名:Example7_asm.s 文件名:Example7_c.c ——————————————————————————————————————— AREA Asm_C, CODE, READONLY
ENTRY
LDR SP,=0x4000
IMPORT __main
BL __main
B.END ——————————————————————————————————————— #include
1、寫一條ARM 指令,分別完成下列操 作: a)r0 = 16
MOV R0,#16 b)r0 = r1 / 16(帶符號的數(shù)字)
MOV R0,R1,ASR,#4 c)r1 = r2 * 3
MUL R1,R2,#3 d)r0 =-r0
RSB R0,R0,#0
2、寫幾條ARM 指令,使能IRQ中斷 MRS R0,CPSR BIC R0,R0,#0x80 MSR SPSR,R0
3、編寫程序,將存儲器從0x400000開始的200個字節(jié)的數(shù)據(jù),傳送到0x400800開始的區(qū)域。
AREA copy,CODE,READONLY
ENTRY START
MOV R0, #0x400000
/ 17
LDR R1, =0x400800
MOV R7,#200 LOOP
LDRB R2, [R0], #1
STRB R2, [R1], #1
SUBS R7, R7, #1
BNE LOOP
STOP
B STOP
END
4、編寫一程序,查找存儲器從0x400000開始的100個字中為0的數(shù)目,將其結(jié)果存到0x400190中。
AREA zero,CODE,READONLY
ENTRY START
MOV R0, #0x400000
MOV R1, #0
MOV R7, #100 LOOP
LDR R2, [R0], #4
CMP R2, #0
BNE NEXT
ADD R1, R1, #1 NEXT
SUBS R7, R7, #1
BNE LOOP
STR R1, [R0]
END
5、用匯編語言編寫程序讀取存儲器0x40003100地址上的數(shù)據(jù),將數(shù)據(jù)加1,若結(jié)果小于10則使用STR指令把結(jié)果寫回原地址,若結(jié)果大于等于10,則把0寫回原地址。答:
COUNT EQU 0x40003100
;定義一個變量,地址為0x40003100
AREA Example2,CODE,READONLY;聲明代碼段Example2
ENTRY
;標(biāo)識程序入口
CODE32
;聲明32位ARM指令 START LDR R1,=COUNT
;R1 <= COUNT
MOV R0,#0
;R0 <= 0
STR R0,[R1]
;[R1] <= R0,即設(shè)置COUNT為0 LOOP LDR R1,=COUNT
LDR R0,[R1]
;R0 <= [R1]
ADD R0,R0,#1
;R0 <= R0 + 1
CMP R0,#10
;R0與10比較,影響條件碼標(biāo)志
/ 17
MOVHS R0,#0
;若R0大于等于10,則此指令執(zhí)行,R0 <= 0
STR R0,[R1]
;[R1] <= R0,即保存COUNT
B LOOP
END
7、如何實(shí)現(xiàn)128位數(shù)的減法,請舉例說明。AREA
EXAMPLE2,CODE,READONLY
ENTRY START
SUBS
R5,R5,R9
SBCS
R4,R4,R8
SBCS
R3,R3,R7
SBCS
R2,R2,R6 STOP
B
STOP
END
8、將存儲器中起始地址地址0X10處的4個字?jǐn)?shù)據(jù)移動到地址0X20處。
AREA
EXAMPLE2,CODE,READONLY
ENTRY LDR
R0,=0X10
;把地址0X10賦給R0 LDR
R5,=0X20
;把地址0X20賦給R5 START LDMIA
R0,{R1-R4}
;把R0為首地址的內(nèi)存單元中的值依次賦給,;R1到R4,每次賦完一次值,R0自動加1
STMIA
R5,{R1-R4}
;把R1到R4的值依次賦給以R5為首地址的內(nèi)存單元中,R5每次自動加1 STOP
B
STOP
;死循環(huán) END
9參考CPSR寄存器中各標(biāo)志位的含義,使處理器處于系統(tǒng)模式。
AREA
EXAMPLE2,CODE,READONLY
ENTRY START MOV
R0,#0X1F
;給R0賦值,2進(jìn)制為11111 MSR
CPSR_c,R0
;把CPSR的條件位置1 STOP B
STOP
;死循環(huán)
END
10用跳轉(zhuǎn)指令實(shí)現(xiàn)兩段程序間的來回切換。
/ 17
AREA
EXAMPLE5
,CODE,READONLY ENTRY BL X
;跳到a對R0,R1,賦值 START
CMP
R0,R1
;比較R0,R1的值
BNE Y
;不等跳轉(zhuǎn)到b
BEQ STOP
;相等時跳轉(zhuǎn)到STOP X MOV
R0,#3
;對R0,R1賦值
MOV
R1,#2 MOV
R15,R14
;返回 Y ADD
R1,R1,#1
;R1自加1 B
START
;跳轉(zhuǎn)到START STOP
B
STOP
;死循環(huán)
END
11字符串拷貝子程序,將r1指向的字符串拷貝到r0指向的地方,字符串以0作結(jié)束標(biāo)志
AREA
SCopy, CODE, READONLY
EXPORT strcopy strcopy
;r0 points to destination string
;r1 points to source string
LDRB
r2, [r1],#1
;load byte and update address
STRB
r2, [r0],#1
;store byte and update address;
CMP
r2, #0
;check for zero terminator
BNE
strcopy
;keep going if not
MOV
pc,lr
;Return
END 12求兩個數(shù)的最大值,并將最大值放R0寄存器
AREA MAX,CODE,READONLY ENTRY START MOV R1, #0x16 M0V
R2, #0x17 CMP R1, R2
MOVMI R0, R2 MOVPL R0, R1 STOP
B
STOP
END
13循環(huán)實(shí)現(xiàn)數(shù)的遞減,即每次減1。最終結(jié)果為0時退出循環(huán)。
/ 17
AREA MAX,CODE,READONLY ENTRY START
MOV R0, #10 LOOP SUBS R0, R0, #1 BNE LOOP STOP
B
STOP
END
14改下列C程序段代碼為ARM匯編程序段代碼。void gcd(int a, int b){ while(a!=b)
if(a>b)
a=a-b;
else
b=b-a;}
AREA MAX,CODE,READONLY ENTRY gcd CMP R0, R1 BEQ STOP BLT Less SUB R0, R0, R1 B STOP Less SUB R1, R1, R0 STOP
B
STOP
End
15分別編寫一個函數(shù)和一個宏,實(shí)現(xiàn)字符串的復(fù)制。
MACRO
COPY
$P1,$P2
;定義一個宏
$P1 DCB
“HELLO”
;分配一個字節(jié)的空間,并初始化為一個字符串 $P2 DCB
“WORLD!”
;同上
LDR
R0,=$P1
;把P1的首地址加載到R0
LDR
R6,=$P2
;把P2的首地址加載到R1
LDRIA
R0,[R1-R5]
;
STRIA
R6,[R1-R5]
;
MEND
AREA
COPY,CODE,READONLY
/ 17
ENTRY START
COPY STR1,STR2
;調(diào)用宏
B
START
;死循環(huán)
END
/ 17
第二篇:實(shí)習(xí)總結(jié)-嵌入式ARM
實(shí)訓(xùn)總結(jié)
班級 卓越1301姓名***
通過這段時間的學(xué)習(xí)使我學(xué)到了很多知識,并且了解到ARM的應(yīng)用以及對開發(fā)板的應(yīng)用,為以后的學(xué)習(xí)奠定了一定的基礎(chǔ)。
嵌入式系統(tǒng)一般定義為以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗和應(yīng)用環(huán)境有特殊要求的專用計(jì)算機(jī)系統(tǒng)。是將應(yīng)用程序、操作系統(tǒng)和計(jì)算機(jī)硬件集成在一起的系統(tǒng)這是從技術(shù)角度。從系統(tǒng)角度上是設(shè)計(jì)完成復(fù)雜功能的硬件和軟件,并使其緊密耦合在一起的計(jì)算機(jī)系統(tǒng)。
廣義上講,凡是帶有微處理器的專用軟硬件系統(tǒng)都可稱為嵌入式系統(tǒng)。如各類單片機(jī)和DSP系統(tǒng)。這些系統(tǒng)在完成較為單一的專業(yè)功能時具有簡潔高效的特點(diǎn)。但由于他們沒有操作系統(tǒng),管理系統(tǒng)硬件核軟件的能力有限,在實(shí)現(xiàn)復(fù)雜多任務(wù)功能時,往往困難重重,甚至無法實(shí)現(xiàn)。從狹義上講,我們更加強(qiáng)調(diào)那些使用嵌入式微處理器構(gòu)成獨(dú)立系統(tǒng),具有自己操作系統(tǒng),具有特定功能,用于特定場合的嵌入式系統(tǒng)。
嵌入式的應(yīng)用也比較廣泛涉及軍事國防、工業(yè)控制、消費(fèi)電子和網(wǎng)絡(luò)。在家用方面更是數(shù)字電視、信息家電、智能玩具、手持通訊、存儲設(shè)備的核心。
在ARM指令集中了解到ARM的尋址方式以及它的的特性,具有高效、快速的特點(diǎn),還有Thumb指令集具有靈活、小巧的特點(diǎn)。
在這次實(shí)訓(xùn)中做了兩個項(xiàng)目,一個是LED燈,實(shí)現(xiàn)LED燈的點(diǎn)亮是比較簡單的,通過查找手冊可以很快的了解到要使用的寄存器和方法,另一個項(xiàng)目是DS18B20這個比較復(fù)雜,除了要掌握對寄存器的使用,還要對了解對串口的初始化,讀寫字節(jié)等等。
感謝這次實(shí)訓(xùn),通過這次的實(shí)訓(xùn)項(xiàng)目,使我大體了解制作項(xiàng)目的步驟,了解了嵌入式技術(shù)的掌握是需要一個過程的。實(shí)事求是的說,嵌入式技術(shù)的全面掌握是有相當(dāng)難度的,通過積累和動手總會有收獲的,從實(shí)驗(yàn)中也明白了一個大的項(xiàng)目并不是一個人可以完成的,團(tuán)隊(duì)協(xié)作很重要。
姓名:***
年級:卓越1301
2014-7-5
第三篇:ARM實(shí)訓(xùn)總結(jié)
《嵌入式系統(tǒng)工程訓(xùn)練》實(shí)驗(yàn)報告
一、實(shí)驗(yàn)?zāi)康?、鞏固嵌入式系統(tǒng)硬件結(jié)構(gòu)的基本應(yīng)用
2、鞏固嵌入式系統(tǒng)程序編制的基本方法
3、了解嵌入式系統(tǒng)的工程設(shè)計(jì)要點(diǎn)
4、了解嵌入式系統(tǒng)的開發(fā)平臺要點(diǎn)
5、學(xué)習(xí)μC/OS-II在ARM7上的移植
6、學(xué)習(xí)μC/OS-II嵌入式實(shí)時操作的基本原理與應(yīng)用
7、運(yùn)用所學(xué)內(nèi)容完成一個基于操作系統(tǒng)的小課題
二、實(shí)訓(xùn)內(nèi)容
1、熟練掌握LPC2210開發(fā)板的使用
2、基本了解嵌入式系統(tǒng)的工程設(shè)計(jì)一般方法
3、學(xué)習(xí)μC/OS-II在ARM7上的移植
4、學(xué)習(xí)μC/OS-II嵌入式實(shí)時操作基本概念、基本運(yùn)用
5、結(jié)合課程內(nèi)容與μC/OS-II運(yùn)用完成一個小課題
三、實(shí)訓(xùn)條件(環(huán)境)
1、LPC2210開發(fā)板
2、PC機(jī)
3、ADS1.2集成開發(fā)環(huán)境
4、μC/OS-II實(shí)時操作系統(tǒng)
四、學(xué)習(xí)內(nèi)容
1、LPC2210硬件內(nèi)容
2、μC/OS-II嵌入式實(shí)時操作內(nèi)容
3、嵌入式系統(tǒng)的工程設(shè)計(jì)內(nèi)容
五、小課題:μC/OS-II在IIC上的應(yīng)用
六、實(shí)訓(xùn)總結(jié)
這兩周我們在原本ARM的學(xué)習(xí)基礎(chǔ)上以μC/OS-II嵌入式實(shí)時操作系統(tǒng)展開了實(shí)訓(xùn)。主要內(nèi)容是如何將嵌入式實(shí)時操作系統(tǒng)μC/OS-II移植到ARM7體系結(jié)構(gòu)上,并將一直代碼應(yīng)用到具體的基于ARM7核的微控制器上。
對于這些天的所學(xué)到的內(nèi)容,我稍稍的寫了點(diǎn)心得,都是一些很基本的東西。首先把實(shí)驗(yàn)書上系統(tǒng)的例程序先跑了一遍,稍微了解一下板子的功能,熟悉下實(shí)驗(yàn)流程。先移例子,按照要求把source文件夾放在了softwareucos-II文件夾下,在這個文件夾下,存放得是系統(tǒng)移植的例子,其中有三個文件夾arm_pc,source,lpc2100是和系統(tǒng)移植相關(guān)的。當(dāng)一個任務(wù)一旦建立,系統(tǒng)為這個任務(wù)配備了任務(wù)控制塊且在任務(wù)就緒表中進(jìn)行了就緒登記,這個任務(wù)就進(jìn)入就緒態(tài)準(zhǔn)備運(yùn)行。一個任務(wù)可以通過調(diào)用OSTaskDel()返回到睡眠態(tài),或通過調(diào)用該函數(shù)讓另一個任務(wù)進(jìn)入睡眠態(tài),進(jìn)入睡眠態(tài)的任務(wù)它的的任務(wù)控制塊被剝奪,調(diào)用OSStart()可以啟動多任務(wù)。OSStrart()函數(shù)運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)。
下載到目標(biāo)板上的固態(tài)存儲器指定地址當(dāng)中,比如flash,EEPROM, ROM等等在程序執(zhí)行之前,根據(jù)某些
描述文件,將需要讀寫數(shù)據(jù)的部分讀出放入動態(tài)存儲器比如RAM當(dāng)中,然后程序從ROM開始執(zhí)行或者有時為了提高程序的運(yùn)行速度,也可以將所有的程序(有一些root的部分除外,以后會提及)通過一個描述文件放入指定的RAM當(dāng)中,然后程序從RAM開始執(zhí)行,但是這樣會耗費(fèi)大量的動態(tài)存儲器,所以大部分程序會取折中的方法,將需要快速運(yùn)行的部分和要讀寫的部分放入RAM中(一般讀固態(tài)存儲器的過程和動態(tài)存儲器的過程是一樣的,但是寫就不同了,所以讀寫的部分一定要放到RAM中),而只讀的部分和對速度要求不是那么高的部分放入固態(tài)存儲器同時ARM結(jié)構(gòu)的異常向量表規(guī)定放在地址為0x00000000開始的地址空間上,而一般的CPU為了提高異常相應(yīng)速度,會將這個向量段remap到其他的RAM當(dāng)中,所以在描述文件當(dāng)中必須精確指定異常向量跳轉(zhuǎn)程序的地址到remap的地方在application程序執(zhí)行前,還需要由一些文件描述application程序執(zhí)行的環(huán)境比如系統(tǒng)工作時鐘,總線頻率現(xiàn)在一般嵌入式編程語言為C,C 等 主程序中首先進(jìn)行了操作系統(tǒng)初始化,然后創(chuàng)建了一個任務(wù),最后啟動了多任務(wù)運(yùn)行環(huán)境。太簡單了。再往下看創(chuàng)建的任務(wù)子函數(shù)TaskStart(),在這個函數(shù)中又創(chuàng)建了。了解到在啟動多任務(wù)環(huán)境前需要至少創(chuàng)建一個任務(wù),我想TaskStart()任務(wù)就應(yīng)該是這個原因放在了 OSStart()之前。
中斷級任務(wù)調(diào)度,和任務(wù)級調(diào)度。我的理解是當(dāng)發(fā)生中斷時,操作系統(tǒng)內(nèi)核判斷此時是否有更高優(yōu)先級的就緒任務(wù),有的話進(jìn)行任務(wù)調(diào)度。任務(wù)級調(diào)度就是當(dāng)前任務(wù)在執(zhí)行過程中主動執(zhí)行任務(wù)調(diào)度,將權(quán)力交給內(nèi)核。
但是這個中斷是怎么產(chǎn)生的呢,我又看到了時鐘節(jié)拍的概念,時鐘節(jié)拍(clock tick):P67頁中說道時鐘節(jié)拍是特定的周期性中斷。有兩種作用:這種周期性的定時中斷一來為內(nèi)核提供一個時間標(biāo)準(zhǔn),例如某個任務(wù)要延時多長時間,可以通過紀(jì)錄這種中斷來完成(中斷的時間是已知的,但應(yīng)當(dāng)是可更改的),二 為任務(wù)切換提供了時間片,任務(wù)之間的調(diào)度是按時完成的,就是在一個時鐘節(jié)拍后來進(jìn)行P68-P69中的圖形說明了這一點(diǎn)。以前不明白每個任務(wù)是一個死循環(huán),在每個程序中都有一個OSTimeDly(),這個函數(shù)是將任務(wù)掛起,將控制權(quán)交給內(nèi)核,內(nèi)核進(jìn)行任務(wù)調(diào)度,從就續(xù)的任務(wù)中找到優(yōu)先級最高的任務(wù)執(zhí)行,這是一種調(diào)度。那么當(dāng)一個低優(yōu)先級任務(wù)在執(zhí)行時,如果在等待一個信號,可能要等很長時間,那么內(nèi)核不能一直在這里等待這個信號的到來,別的高優(yōu)先級任務(wù)可能已經(jīng)就緒,那么就需要進(jìn)行任務(wù)調(diào)度,何時調(diào)度呢?這時就應(yīng)該是時鐘節(jié)拍所起到的作用,每一個時鐘節(jié)拍到達(dá)后進(jìn)入中斷處理函數(shù),進(jìn)行任務(wù)調(diào)度。
所以總的理解應(yīng)當(dāng)是內(nèi)核在每個時鐘節(jié)拍到來時進(jìn)行一次任務(wù)調(diào)度,這是大前提,使每個任務(wù)都有相同的權(quán)利執(zhí)行相同的時間。有時個別任務(wù)在一個時鐘節(jié)拍內(nèi)早已完成,這時需要向內(nèi)核提前交權(quán),讓內(nèi)核進(jìn)行任務(wù)調(diào)度。
第四篇:ARM學(xué)習(xí)心得
ARM linux學(xué)習(xí)心得(zt)
2008-08-13 13:55
由于很多人總問這個問題,所以這里做一個總結(jié)文檔供大家參考。
這里必須先說明,以下的步驟都是針對Linux系統(tǒng)的,并不面向WinCE。也許你會注意到,現(xiàn)在做嵌入式的人中,做linux研究的人遠(yuǎn)比做WinCE的人多,很多產(chǎn)家提供的資料也是以linux為主。我一直很難理解,其實(shí)WinCE的界面比linux的界面好看多了,使用起來也很方便,更為重要的是,WinCE的開發(fā)和Windows下的開發(fā)基本一樣,學(xué)起來簡單得多,但是學(xué)linux或者使用linux做嵌入式的人就是遠(yuǎn)比WinCE多。在和很多工作的人交流時我了解到,他們公司從沒考慮使用WinCE,因?yàn)槌杀靖?,都是使用linux進(jìn)行開發(fā)。我讀研究生的的實(shí)驗(yàn)室中也沒有使用WinCE的,大都研究linux,也有少部分項(xiàng)目使用vxwork,但是就沒有聽說過使用WinCE的,原因就是開源!當(dāng)然現(xiàn)在WinCE6.0聽說也開源,不過在成本和資源上linux已經(jīng)有了無人能擋的優(yōu)勢。與此相對應(yīng)的是,越來越多的電子廠商已經(jīng)開始使用linux開發(fā)產(chǎn)品。舉個例子,Google近期開發(fā)的智能手機(jī)操作系統(tǒng)Android其實(shí)就是使用linux-2.6.23內(nèi)核進(jìn)行改進(jìn)得到的。
第一,學(xué)習(xí)基本的裸機(jī)編程。
對于學(xué)硬件的人而言,必須先對硬件的基本使用方法有感性的認(rèn)識,更必須深刻認(rèn)識該硬件的控制方式,如果一開始就學(xué)linux系統(tǒng)、學(xué)移植那么只會馬上就陷入一個很深的漩渦。我在剛剛開始學(xué)ARM的時候是選擇ARM7(主意是當(dāng)時ARM9還很貴),學(xué)ARM7的時候還是保持著學(xué)51單片機(jī)的思維,使用ADS去編程,第一個實(shí)驗(yàn)就是控制led。學(xué)過一段時間ARM的人都會笑這樣很笨,實(shí)際上也不是,我倒是覺得有這個過程會好很多,因?yàn)闊o論做多復(fù)雜的系統(tǒng)最終都會落實(shí)到這些最底層的硬件控制,因此對這些硬件的控制有了感性的認(rèn)識就好很多了
學(xué)習(xí)裸機(jī)的編程的同時要好好理解這個硬件的構(gòu)架、控制原理,這些我稱他為理解硬件。所謂的理解硬件就是說,理解這個硬件是怎么組織這么多資源的,這些資源又是怎么由cpu、由編程進(jìn)行控制的。比如說,s3c2410中有AD轉(zhuǎn)換器,有GPIO(通用IO口),還有nandflash控制器,這些東西都有一些寄存器來控制,這些寄存器都有一個地址,那么這些地址是什么意思?又怎么通過寄存器來控制這些外圍設(shè)備的運(yùn)轉(zhuǎn)?還有,norflash內(nèi)部的每一個單元在這個芯片的內(nèi)存中都有一個相應(yīng)的地址單元,那么這些地址與剛剛說的寄存器地址又有什么關(guān)系?他們是一樣的嗎?而與norflash相對應(yīng)的nandflash內(nèi)部的儲存單元并不是線性排放的,那么s3c2410怎么將nandflash的地址映射在內(nèi)存空間上進(jìn)行使用?或者簡單地說應(yīng)該怎么用nandflash?再有,使用ADS進(jìn)對ARM9行編程時都需要使用到一個初始化的匯編文件,這個文件究竟有什么用?他里面的代碼是什么意思?不要這個可以嗎?
諸如此類都是對硬件的理解,理解了這些東西就對硬件有很深的理解了,這對以后更深一步的學(xué)習(xí)將有很大的幫助,如果跳過這一步,我相信越往后學(xué)越會
覺得迷茫,越覺得這寫東西深不可測。因?yàn)椋愕母鶝]打好。
不過先聲明一下,本人并沒有使用ADS對ARM9進(jìn)行編程,我是學(xué)完ARM7后直接就使用ARM9學(xué)linux系統(tǒng)的,因此涉及使用ADS對ARM9進(jìn)行編程的問題我很難回答^_^,自己去研究研究吧。
對于這部分不久將提供一份教程,這個教程中的例程并不是我為我們所代理的板子寫的,是我在我們學(xué)院實(shí)驗(yàn)室拿的,英培特為他們自己的實(shí)驗(yàn)箱寫的,不過很有借鑒意義,可以作為一份有價值的參考。
第二,使用linux系統(tǒng)進(jìn)行一些基本的實(shí)驗(yàn)。
在買一套板子的時候一般會提供一些linux的試驗(yàn)例程,好好做一段時間這個吧,這個過程也是很有意義的,也是為進(jìn)一步的學(xué)習(xí)積累感性認(rèn)識,你能想象一個從沒有使用過linux系統(tǒng)的人能學(xué)好linux的編程嗎?好好按照手冊上的例程做一做里面的實(shí)驗(yàn),雖然有點(diǎn)娃娃學(xué)走路,有點(diǎn)弱智,但是我想很多高手都會經(jīng)歷這個過程。
在這方面我們深藍(lán)科技目前沒有計(jì)劃提供相應(yīng)的例程,主要是開發(fā)板的提供商會提供很豐富的例程,我們不做重復(fù)工作,只提供他們沒有的、最有價值的東西給大家。
第三,研究完整的linux系統(tǒng)的的運(yùn)行過程。
所謂完整的linux系統(tǒng)包括哪些部分呢?
三部分:bootloader、linux kernel(linux內(nèi)核)、rootfile(根文件系統(tǒng))。那么這3部分是怎么相互協(xié)作來構(gòu)成這個系統(tǒng)的呢?各自有什么用呢?三者有什么聯(lián)系?怎么聯(lián)系?系統(tǒng)的執(zhí)行流程又是怎么樣的呢?搞清楚這個問題你對整個系統(tǒng)的運(yùn)行就很清楚了,對于下一步制作這個linux系統(tǒng)就打下了另一個重要的根基。介紹這方面的資料網(wǎng)上可以挖掘到幾噸,自己好好研究吧。第四,開始做系統(tǒng)移植。
上面說到完整的linux有3部分,而且你也知道了他們之間的關(guān)系和作用,那么現(xiàn)在你要做的便是自己動手學(xué)會制作這些東西。
當(dāng)然我不可能叫你編寫這些代碼,這不實(shí)現(xiàn)。事實(shí)上這個3者都能在網(wǎng)下載到相應(yīng)的源代碼,但是這個源代碼不可能下載編譯后就能在你的系統(tǒng)上運(yùn)行,需要很多的修改,直到他能運(yùn)行在你的板子上,這個修改的過程就叫移植。在進(jìn)行移植的過程中你要學(xué)的東西很多,要懂的相關(guān)知識也很多,等你完成了這個過程你會發(fā)現(xiàn)你已經(jīng)算是一個初出茅廬的高手了。
在這個過程中如果你很有研究精神的話你必然會想到看源代碼。很多書介紹你
怎么閱讀linux源代碼,我不提倡無目的地去看linux源代碼,用許三多的話說,這沒有意義。等你在做移植的時候你覺得你必須去看源代碼時再去找基本好書看看,這里我推薦一本好書倪繼利的《linux內(nèi)核的分析與編程》,這是一本針對linux-2.6.11內(nèi)核的書,說得很深,建議先提高自己的C語言編程水平再去看。
至于每個部分的移植網(wǎng)上也可以找到好多噸的資料,自己研究研究吧,不過要提醒的是,很多介紹自己經(jīng)驗(yàn)的東西都或多或少有所保留,你按照他說的去做總有一些問題,但是他不會告訴你怎么解決,這時就要靠自己,如果自己都靠不住就找我一起研究研究吧,我也不能保證能解決你的問題,因?yàn)槲椅幢赜龅竭^你的問題,不過我相信能給你一點(diǎn)建議,也許有助你解決問題。
這一步的最終目的是,從源代碼的官方主頁上(都是外國的,悲哀)下載標(biāo)準(zhǔn)的源代碼包,然后進(jìn)行修改,最終運(yùn)行在板子上。
盜用阿基米德的一句話:“給我一根網(wǎng)線,我能將linux搞定”。
第五,研究linux驅(qū)動程序的編寫。
移植系統(tǒng)并不是最終的目的,最終的目的是開發(fā)產(chǎn)品,做項(xiàng)目,這些都要進(jìn)行驅(qū)動程序的開發(fā)。
Linux的驅(qū)動程序可以說是五花八門,linux2.4和linux2.6的編寫有相當(dāng)大的區(qū)別,就是同為linux2.6但是不同版本間的驅(qū)動程序也有區(qū)別,因此編寫linux的驅(qū)動程序變都不是那么容易的事情,對于最新版本的驅(qū)動程序的編寫甚至還沒有足夠的參考資料。那么我的建議就是使用、移植一個不算很新的版本內(nèi)核,這樣到時學(xué)驅(qū)動的編程就有足夠的資料了。
這部分的推薦書籍可以參考另一篇文章《推薦幾本學(xué)習(xí)嵌入式linux的書籍》。第六,研究應(yīng)用程序的編寫。
做作品做項(xiàng)目除了編寫驅(qū)動程序,最后還要編寫應(yīng)用程序?,F(xiàn)在的趨勢是圖形應(yīng)用程序的開發(fā),而圖形應(yīng)用程序中用得最多的還是qt/e函數(shù)庫。我一直就使用這個函數(shù)庫來開發(fā)自己的應(yīng)用程序,不過我希望你能使用國產(chǎn)的MiniGUI函數(shù)庫。盜用周杰倫的廣告詞就是“支持國產(chǎn),支持MiniGUI”。MiniGUI的編程比較相似Windows下的VC編程,比較容易上手,效果應(yīng)該說是相當(dāng)不錯的,我曾使用過來開發(fā)ARM7的程序。不過MiniGUI最大的不好就是沒有像qtopia這樣的圖形操作平臺,這大大限制了他的推廣,我曾經(jīng)幻想過與北京飛漫公司(就是MiniGUI的版權(quán)擁有者)合作使用MiniGUI函數(shù)庫開發(fā)像qtopia這樣的圖形操作平臺,不過由于水平有限這只能是幻想了,呵呵。
完成這一步你基本就學(xué)完了嵌入式linux的全部內(nèi)容了。
還有一個小小的經(jīng)驗(yàn)想和大家分享。我在學(xué)習(xí)嵌入式linux的過程中很少問人,客觀原因是身邊的老師、同學(xué)師兄都沒有這方面的高手,主觀原因是我不喜歡問人,喜歡自己研究解決問題。這樣做有個好處,就是可以提高自己解決問題的能力,因?yàn)樽鲞@些東西總有很多問題你難以理解,別人也沒有這方面的經(jīng)驗(yàn),也不是所有問題都有人給你答案,這時必須要自己解決問題,這樣,個人的解決問題能力就顯得非常關(guān)鍵了。因此我的建議就是一般的問題到網(wǎng)上搜索一下,確實(shí)找不到答案了就問問高手,還是不行了就自己去研究,不要一味去等別人幫你解決問題。
記住,問題是學(xué)習(xí)的最好機(jī)會。
第五篇:arm心得.
心得體會(許晶)
本次實(shí)習(xí)時間是一周,我們組所選的題目是直流電動機(jī)轉(zhuǎn)速控制設(shè)計(jì),其要求有:硬件部分要求在LPC2100系列ARM的最小系統(tǒng)的基礎(chǔ)上,設(shè)計(jì)通過按鍵控制直流電動機(jī)速度的驅(qū)動電路,要求通過LPC2100內(nèi)置的PWM發(fā)生器控制直流電動機(jī);并將電動機(jī)速度通過串口送至PC機(jī)。軟件部分要求設(shè)計(jì)以上功能的脫機(jī)運(yùn)行程序,并在試驗(yàn)室調(diào)試通過。我負(fù)責(zé)的是硬件部分。首先我將系統(tǒng)分為兩部分。一是電動機(jī)控制驅(qū)動電路;二是ARM最小系統(tǒng)。在電動機(jī)驅(qū)動中,直流電機(jī)控制使用了H橋驅(qū)動電路,控制口線為P0.21、P0.22。在ARM最小系統(tǒng)中,分為5部分:電源電路、復(fù)位電路、JTAG接口電路、RS232串口電路、時鐘電路。
在制作原理圖中,我查閱了實(shí)驗(yàn)指導(dǎo)書和課本。我所選用的是2114板子。因?yàn)長PC2114是基于一個支持實(shí)時仿真和跟蹤的16/32位ARM7TDMI-STM CPU的微控制器,并帶有128/256 k字節(jié)(kB)嵌入的高速Flash存儲器。128位寬度的存儲器接口和獨(dú)特的加速結(jié)構(gòu)使32位代碼能夠在最大時鐘速率下運(yùn)行。對代碼規(guī)模有嚴(yán)格控制的應(yīng)用可使用16位Thumb模式將代碼規(guī)模降低超過30%,而性能的損失卻很小。
在這個過程中,我注意到了許多問題。通過最小系統(tǒng)的制圖,我對一些問題逐漸了解,不像剛開始學(xué)習(xí)一樣,感覺什么也不懂,硬裝知識。我畫了5部分,這幾個部分讓我對書上的內(nèi)容更加深了學(xué)習(xí)。如:時鐘電路中,我就把時鐘系統(tǒng)和晶體振蕩兩節(jié)課程,重新學(xué)習(xí)。
而在軟件設(shè)計(jì)中,在我的搭檔編程完之后,我也對程序進(jìn)行了研究。在主程序中,我們用的是i、j表示速度與方向,正轉(zhuǎn)為“+”、反轉(zhuǎn)為“—”;最小速度為1,最大速度為4。先讓電機(jī)正向慢慢的加速,加到正傳的最大速后,在按下就變成反轉(zhuǎn),然后在依次加速,往返循環(huán),直至沒有按鍵按下。所運(yùn)用的是,調(diào)節(jié)PWM的占空比就能達(dá)到電機(jī)的速度調(diào)節(jié)。
我們組在硬件中遇到的問題并不多,主要是在畫各部分原理圖時找器件很不熟練,不能很快的找到。這說明我不經(jīng)常用軟件。其實(shí)這個軟件制圖很方便,各種器件幾乎都能找到,找不到時也可以在上面畫圖。
軟件中,程序在編譯正確后,下載方面出現(xiàn)了許多問題,如連接不上;不能生成hex文件等。其實(shí)這些問題,都是因?yàn)槲覀儗浖皇煜に斐傻?。在我們多次調(diào)試、鏈接之后,終于完成。
經(jīng)過一周實(shí)習(xí),是我對ARM系統(tǒng)有了更深刻的認(rèn)識。因?yàn)榍捌诖蠹叶颊夜ぷ鞯脑?,我并沒有特別認(rèn)真的學(xué)習(xí),而這次的實(shí)習(xí),可以讓我重新再次拿起課本,認(rèn)真學(xué)習(xí)。并且使我感觸最深的是,由于嵌入系統(tǒng)的廣泛應(yīng)用,我應(yīng)該更好的去學(xué)習(xí)它、掌握它。像掌握辦公自動化一樣,成為必不可少的技術(shù)。