電子發(fā)燒友網(wǎng)訊:在嵌入式學(xué)習(xí)過(guò)程中,基于ARM核的嵌入式芯片必不可少。那么,在學(xué)習(xí)ARM嵌入式知識(shí)或開(kāi)發(fā)中,嵌入式工程師會(huì)遇到哪些不可預(yù)知的問(wèn)題?哪些問(wèn)題會(huì)在嵌入式的學(xué)習(xí)中成為您的攔路虎?為了盡量為電子發(fā)燒友網(wǎng)讀者掃清這些令人困惑的障礙,故電子發(fā)燒友網(wǎng)整理推出《ARM嵌入式學(xué)習(xí)經(jīng)典40問(wèn)》,以饗讀者。
第1問(wèn):
Q:請(qǐng)問(wèn)在初始化CPU堆棧的時(shí)候一開(kāi)始在執(zhí)行mov r0, LR這句指令時(shí)處理器是什么模式
A:復(fù)位后的模式,即管理模式。
第2問(wèn):
Q:請(qǐng)教:MOV中的8位圖立即數(shù),是怎么一回事 0xF0000001是怎么來(lái)的
A:是循環(huán)右移,就是一個(gè)0—255 之間的數(shù)左移或右移偶數(shù)位的來(lái)的,也就是這個(gè)數(shù)除以4一直除, 直到在0-255的范圍內(nèi)它是整數(shù)就說(shuō)明是可以的!
A:8位數(shù)(0-255)循環(huán)左移或循環(huán)右移偶數(shù)位得到的,F(xiàn)0000001既是0x1F循環(huán)右移4位,符合規(guī)范,所以是正確的。這樣做是因?yàn)橹噶铋L(zhǎng)度的限制,不可能把32位立即數(shù)放在32位的指令中。移位偶數(shù)也是這個(gè)原因。可以看一看arm體系結(jié)構(gòu)(ADS自帶的英文文檔)的相關(guān)部分。
第3問(wèn):
Q:請(qǐng)教:《arm微控制器基礎(chǔ)與實(shí)戰(zhàn)》2.2.1節(jié)關(guān)于第2個(gè)操作數(shù)的描述中有這么一段:#inmed_8r常數(shù)表達(dá)式。該常數(shù)必須對(duì)應(yīng)8位位圖,即常熟是由一個(gè)8位的常數(shù)循環(huán)移位偶數(shù)位得到。
合法常量:0x3FC,0,0xF0000000,200,0xF0000001.
非法常量:0x1FE,511,0xFFFF,0x1010,0xF0000010.
常數(shù)表達(dá)式應(yīng)用舉例:
…
…
LDR R0,[R1],#-4 ;讀取 R1 地址上的存儲(chǔ)器單元內(nèi)容,且 R1 = R1-4
針對(duì)這一段,我的疑問(wèn):
1. 即常數(shù)是由一個(gè)8位的常數(shù)循環(huán)移位偶數(shù)位得到,這句話如何理解
2. 該常數(shù)必須對(duì)應(yīng)8位位圖,既然是8位位圖,那么取值為0-255,怎么0x3FC這種超出255的數(shù)是合法常量呢
3. 所舉例子中,合法常量和非法常量是怎么區(qū)分的 如0x3FC合法,而0x1FE卻非法0xF0000000,0xF0000001都合法,而0xF0000010又變成了非法
4. 對(duì)于匯編語(yǔ)句 LDR R0,[R1],#-4,是先將R1的值減4結(jié)果存入R1,然后讀取R1所指單元的 值到R0,還是先讀取R1到R0,然后再將R1減4結(jié)果存入R1
A:提示,任何常數(shù)都可用底數(shù)*2的n次冪 來(lái)表示。
1. arm結(jié)構(gòu)中,只有8bits用來(lái)表示底數(shù),因此底數(shù)必須是8位位圖。
2. 8位位圖循環(huán)之后得到常數(shù),并非只能是8位。
3. 0xF0000010底數(shù)是9位,不能表示。
4. LDR R0, [R1], #-4 是后索引,即先讀,再減。
可以看一看arm體系結(jié)構(gòu)對(duì)相關(guān)尋址方式的說(shuō)明。
第4問(wèn):
Q:在程序移植的過(guò)程中,什么代碼段處于什么樣的模式,這可真是一個(gè)困擾人的大難題,有沒(méi)有一種標(biāo)志或辦法能夠識(shí)別“代碼段處于什么樣的模式”
A:讀取 CPSR ,任何時(shí)候都是可以讀。
第5問(wèn):
Q:為什么保護(hù)現(xiàn)場(chǎng)時(shí),總是保護(hù) R0-R3,R12,為什么不保護(hù)R4-R11
A:請(qǐng)看一看“arm-thumb過(guò)程調(diào)用標(biāo)準(zhǔn)”這個(gè)文檔。
第6問(wèn):
Q:請(qǐng)問(wèn) mov R1,#0x00003DD0 錯(cuò)誤: out of the range of operation是怎么回事情 我就是想IODIR=0x00003dd0,匯編就是
LDR R0,=IODIR
MOV R1,#0x00003dd0
STR R1,[R0]
編譯時(shí)候說(shuō)是超出操作范圍
A:使用ldr,mov的操作數(shù)為8位位圖數(shù)。
第7問(wèn):
Q:“在arm7TDMI(-S)處理器內(nèi)部有37個(gè)用戶可見(jiàn)的寄存器:”
問(wèn)題:“用戶可見(jiàn)”應(yīng)該怎樣理解 這37個(gè)寄存器是否是37個(gè)不同的物理寄存器, 例如R8與R8_fiq應(yīng)該是兩個(gè)不同的物理寄存器吧
A:用戶可見(jiàn)是指用戶可以通過(guò)程序操作的。R8與R8_fiq是兩個(gè)不同的寄存器。
第8問(wèn):
Q: USR模式,SVC模式,IRQ模式分別有哪些限制
A:對(duì)于外設(shè)操作限制與芯片設(shè)計(jì)有關(guān)。USR模式不能設(shè)置CPSR寄存器。 用戶模式下無(wú)SPSR寄存器,代碼可以為arm,Thumb.
第9問(wèn):
Q:請(qǐng)問(wèn)“在初始化堆棧時(shí)就決定了工作模式”是什么意思 如何決定工作模式的
A:設(shè)置CPSR寄存器。
第10問(wèn):
Q:請(qǐng)問(wèn):arm匯編程序設(shè)計(jì)中所謂的“文字池”作何理解
A:可以理解為常量數(shù)組,文字池中保存的是常量,這些常量可以是正常的常量,也可以是地址。
第11問(wèn):
Q:為什么在中斷向量表中不直接LDR PC,“異常地址”。而是使用一個(gè)標(biāo)號(hào),然有再在后面使用DCD定義這個(gè)標(biāo)號(hào)
A:因?yàn)長(zhǎng)DR指令只能跳到當(dāng)前PC 4kB范圍內(nèi),而B指令能跳轉(zhuǎn)到32MB范圍,而現(xiàn)在這樣在LDR PC, “xxxx”這條指令不遠(yuǎn)處用“xxxx”DCD定義一個(gè)字,而這個(gè)字里面存放最終異常服務(wù)程序的地址,這樣可以實(shí)現(xiàn)4GB全范圍跳轉(zhuǎn)。
Q: LDR 不是可以全空間跳轉(zhuǎn)的嗎 《arm微控制器基礎(chǔ)與實(shí)戰(zhàn)》程序清單5.3.
A: LDR偽指令通過(guò)設(shè)置指令緩沖池才能實(shí)現(xiàn)全范圍跳轉(zhuǎn),而LDR指令則只能實(shí)現(xiàn)4KB范圍跳轉(zhuǎn)。
第12問(wèn):
Q: ARM7TDMI-S和arm7TDMI有何區(qū)別
A: ARM7TDMI-S是ARM7TDMI的可綜合(synthesizable)版本(軟核)。 對(duì)應(yīng)用工程師來(lái)說(shuō),除非芯片生產(chǎn)廠商對(duì)ARM7TDMI-S進(jìn)行了裁減,否則ARM7TDMI-S與ARM7TDMI沒(méi)有太大的區(qū)別,其編程模型與 arm7TDMI一致。
第13問(wèn):
Q: DCD偽指令的疑惑。
“StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1) * 4”
這句話是什么意思 DCD后面的程序標(biāo)號(hào)或數(shù)字表達(dá)式是何意
A:它的內(nèi)容是初始化遞減堆棧的最高地址,看《arm微控制器基礎(chǔ)與實(shí)戰(zhàn)》2.3.2節(jié)。
第2章 編譯器與語(yǔ)言
第14問(wèn):
Q:00254: Unimplemented RDI message是什么錯(cuò)誤提示 我的設(shè)置連接都正常,是不是芯片燒了
A:是JTAG的問(wèn)題。可以先使用ISP操作試試就知道了,如果能ISP,說(shuō)明LPC2104沒(méi)有損壞,還能正常運(yùn)行程序。
第15問(wèn):
Q:請(qǐng)教:我在調(diào)試程序的時(shí)候在AXD中出現(xiàn)這樣的提示信息:
RDI Warning 00159:could not open specified device port.
我是根據(jù)配套教程的步驟設(shè)置的。
A:請(qǐng)按照光盤\easyarm_drive\readme.txt安裝驅(qū)動(dòng)程序。
第16問(wèn):
Q:我用實(shí)驗(yàn)程序運(yùn)行經(jīng)常出現(xiàn)下列信息! 程序不能下載到目標(biāo)板。
Warnning! interrupt vectors data is not correct!
Program you downloaded can not run freely!
A:1.仿真器配置一定要正確,即“Easyarm Configuration”設(shè)置窗口中的“FLASH”項(xiàng)中選擇“Erase Flash when need”;
2.向量表累加和要為0;
3.可以先在RAM調(diào)試一個(gè)程序(運(yùn)行),然后STOP,再使用File-》Load Image…加載要下載到FLASH的調(diào)試文件。
第17問(wèn):
Q:在ADS中是否可以進(jìn)行軟件調(diào)試基于UCOS-II的程序
A:ADS軟件調(diào)試只能調(diào)試arm的內(nèi)核,不能調(diào)試外設(shè)。但是取消 PLL 鎖定檢測(cè)后,可以調(diào)試任務(wù)切換,最終到空閑任務(wù)上。開(kāi)始移植時(shí)軟件仿真是最好的工具。
第18問(wèn):
Q:armulate軟件是干什么的 2104不是用EasyJTAG.dll來(lái)仿真嗎
A:軟件仿真只能仿真 arm 核。
第19問(wèn):
Q:有關(guān)LPC2106.INC的問(wèn)題。我無(wú)法在project引用lpc2106.inc文件,只能引用lpc2106.h文件, 這是什么原因 且當(dāng)我的主程序用匯編編寫時(shí),不能引用lpc2106.h,用lpc2106.inc則無(wú)法加入project,請(qǐng)問(wèn)匯編器應(yīng)如何設(shè)置
A:不用加2106.inc只要該文件在你的工程文件夾中,就可以直接在匯編程序的開(kāi)始處加
“include 2106.inc”。
注意:該文件是匯編文件定義的頭文件,定義內(nèi)部寄存器。
第20問(wèn):
Q:入口點(diǎn)是什么意思 我在使用LPC2106上移植UCOS-II,每次MAKE時(shí)總是提示我 Image does not have an entry point,可是我是把光盤的vetctors.s 復(fù)制過(guò)來(lái)的,而且仔細(xì)看了看,已經(jīng)聲明了ENTERY,這是怎么回事
A:需要在ADS中設(shè)置入口。
第21問(wèn):
Q:請(qǐng)教:如何定義不被初始化變量
A:讓編譯器不知道有這個(gè)內(nèi)存地址即可。
A:如用分散加載文件分配RAM故意預(yù)留一部分RAM不分配,用它來(lái)存您不需要初始化的東西。或者不調(diào)用編譯器提供的啟動(dòng)代碼,不過(guò)這樣可能編程會(huì)麻煩一些。
第22問(wèn):
Q:我直接通過(guò)JTAG口下載EasyArm板帶的Ext1_test程序到arm中,出現(xiàn)中斷向量的告警:
interrupt vector is not correct arm is not running freely.
果然復(fù)位后芯片不能運(yùn)行。但是我用串口下載后芯片能正常工作,中斷也行的。
并且我用JTAG仿真的話,芯片能正常工作,中斷也行的,唯獨(dú)JTAG口下載不行。
不知道是什么原因
A:仿真器配置中要設(shè)置Erase Flash when need.也可以這樣試試:
1.可以先打開(kāi)一個(gè)工程在RAM中調(diào)試運(yùn)行;
2.stop程序;
3.使用File-》Load Image…重新加載Ext1_test生成的*.axf文件。
Q:仿真器配置中我是設(shè)置了Erase Flash when need,但照你說(shuō)的話,那不是在RAM下調(diào)試嗎
在RAM下調(diào)試我是可以的,但是下載后出現(xiàn)interrupt vector data is not correct.
我又看了幾篇文章,是不是跟中斷向量表的累加和不為零有關(guān)系啊
A:是的,是向量表的累加和不為零。
因?yàn)槿绻肐SP下載能運(yùn)行,說(shuō)明向量表的累加和已為零,而用JTAG下載不能運(yùn)行的情況可能是 沒(méi)有正常下載代碼。先在RAM中調(diào)試,目的是為了后面正確下載程序到FLASH.
第23問(wèn):
Q:用Scatter怎樣將某個(gè)函數(shù)或文件定位在Flash的某個(gè)位置
A:參考http: //www.zlgmcu.com/download/downs.asp?ID=1009
第24問(wèn):
Q:我在仿真時(shí)遇到這樣的提示:
Error, Flash is protected by user configation!
怎么寫到flash里面呢
A:看配套《arm微控制器基礎(chǔ)與實(shí)戰(zhàn)》附錄一。
第25問(wèn):
Q:我在移植實(shí)驗(yàn)中想到了兩個(gè)問(wèn)題,如下:
1.Debug和Release以及DebugRel有什么不同,為什么在作2104移植實(shí)驗(yàn)時(shí),要用Release
2.在Release中為什么要將RW Base設(shè)置為0x40000040 我將其設(shè)置為0x40003000,
為什么不能工作
A:都只是一個(gè)問(wèn)題,內(nèi)存空間的使用,因?yàn)榕躉S要比較大的內(nèi)存空間,所以要騰出點(diǎn)地方。
第26問(wèn):
Q:請(qǐng)問(wèn)沒(méi)有MMU的arm芯片是否支持使用malloc()函數(shù)動(dòng)態(tài)分配內(nèi)存
A:是否支持malloc()函數(shù)與芯片沒(méi)有多大關(guān)系,主要與編譯器有關(guān)。
Q:再問(wèn):如果沒(méi)有操作系統(tǒng)支持呢
A:也支持。
第27問(wèn):
Q:在I2C實(shí)驗(yàn)程序中,我想查看數(shù)據(jù)緩沖區(qū)DataBuf的值,怎么查看
A:watch窗口或鼠標(biāo)停留在要查看的變量名上。
Q:我查詢的是寫入DataBuf緩沖區(qū)的值,鼠標(biāo)在上面根本就不會(huì)出現(xiàn)他的值,即使在watch中加入, 結(jié)果也是“name not found”。
A:變量被優(yōu)化,調(diào)試時(shí)可以把該變量定義為全局變量查看。
第28問(wèn):
Q:仿真軟件和2104開(kāi)發(fā)板連接不上
DBE Warning 00041:
!An unspecified Debug Toolbox call failed
電源和開(kāi)發(fā)板都連好,錯(cuò)誤和沒(méi)接開(kāi)發(fā)板一樣,驅(qū)動(dòng)也安裝了,安裝時(shí)按確定鍵時(shí),軟件很長(zhǎng)時(shí)間才有如上反應(yīng),請(qǐng)幫忙
A:1.并口是否正常
2.在其它操作系統(tǒng)(如98)下或其它臺(tái)式PC下試試。
第29問(wèn):
Q:如何生成32位hex文件
我在Release Setting-》arm fromELF-》Output Format中設(shè)置為Intel 32bit HEX,可是好像沒(méi)有生成hex文件
A:試試這種方法:
Target--》Target Setting--》 ost Link中選擇“arm fromELF”加上你上面設(shè)的應(yīng)該不成問(wèn)題。
第30問(wèn):
Q:請(qǐng)問(wèn)關(guān)于settings中r0 base rw base的意思
A:ro:read only,rw:read and write.
第31問(wèn):
Q:編譯成功后的信息第一行,code,R0 data,RW data,ZI data,debug分別代表什么
A:R0 只讀段,即程序代碼空間;
RW 可讀/寫段,即數(shù)據(jù)變量空間;
ZI 清零變量段,即需要清零初始化的數(shù)據(jù)變量空間。
第32問(wèn):
Q:如何在ADS里面看任務(wù)執(zhí)行的一些情況 比如堆棧。
A:多任務(wù)環(huán)境下的堆棧,內(nèi)存等信息需要調(diào)試軟件的支持才可以實(shí)現(xiàn)。
ucos下有一個(gè)統(tǒng)計(jì)功能的模塊可以間接實(shí)現(xiàn)部分功能。
第33問(wèn):
Q:請(qǐng)問(wèn)向flash燒數(shù)據(jù)時(shí)出現(xiàn):exceeds flash limitation 請(qǐng)予賜教!
A:要寫入的flash地址超過(guò)了范圍。如果不是代碼太大的問(wèn)題,可以檢查scf文件是否正確。
第34問(wèn):
Q:在LPC2214之類的芯片中如何實(shí)現(xiàn)數(shù)組的絕對(duì)地址定位,比如51的_at_的用法。
A:*((char*)0x40000300)類似訪問(wèn)
Q:謝謝,但這樣做就無(wú)須定義數(shù)組變量,訪問(wèn)也不便,還有高招嗎
A:可以使用分散加載。
第35問(wèn):
Q:請(qǐng)問(wèn) ADS編譯錯(cuò)誤“L6221E:Execution region ER_RO overlays with Execution region
ER_ZI” 該如何解決
A:請(qǐng)用我們網(wǎng)站上的工程模板試一試,最大的可能是因?yàn)槟愕腞ELEASE或者DEBUG選項(xiàng)里面沒(méi)有正確設(shè)置,按照參考《arm微控制器基礎(chǔ)與實(shí)戰(zhàn)》上面的設(shè)置,是不會(huì)有這個(gè)問(wèn)題的。
第36問(wèn):
Q:請(qǐng)教一下:將程序?qū)懭雈lash,再用從JTAG方式調(diào)試寫入之后再?gòu)?fù)位程序沒(méi)什么反映。 看了很多以前的帖子,說(shuō)memmap寄存器要為1,我用的是一個(gè)很簡(jiǎn)單的控制led的例子,改動(dòng)了參數(shù)之后寫入flash的。在這個(gè)程序的vectors 中找不到關(guān)于memmap寄存器操作的部分啊,這是怎么回事,該怎么辦呢
A:《arm微控制器基礎(chǔ)與實(shí)戰(zhàn)》上附錄有“常見(jiàn)問(wèn)題”,列舉了幾點(diǎn)程序?qū)懙紽LASH不能運(yùn)行的原因。 memmap操作可以在target.c中的TargetResetInit()函數(shù)內(nèi)添加。
第37問(wèn):
Q:HEX文件。EASY2100配套《arm微控制器基礎(chǔ)與實(shí)戰(zhàn)》上講:把項(xiàng)目編譯成HEX文件,我不會(huì)呀,咋辦
A:Target-〉target settings設(shè)置Post-linker并且設(shè)置Linker-〉fromELF.
Q:再問(wèn):我用的是光盤里的例子,打開(kāi)工程項(xiàng)目里是DebugInarm.DebugInFlash.
RelInFlash.不是《ARM微控制器基礎(chǔ)與實(shí)戰(zhàn)》上的DebugRel呀,我都照《arm微控制器基礎(chǔ)與實(shí)戰(zhàn)》上設(shè)置的,可用ISP下載,提示無(wú)法找到HEX文件。
A:光盤上的例子是用專用工程模板建立,已經(jīng)設(shè)置好參數(shù),與默認(rèn)模板不同。
第38問(wèn):
Q:Easyarm2100開(kāi)發(fā)板如何通過(guò)JTAG接口下載到Flash
我在用Easyarm2100開(kāi)發(fā)板時(shí)JTAG接口不能進(jìn)行Flash中的調(diào)試(DebugInFlash),但是可以在RAM中調(diào)試(DebugInRAM),且通過(guò)ISP編程可以寫入Flash.
通過(guò)JTAG接口進(jìn)行DebugInFlash調(diào)試時(shí),總是出現(xiàn)如下提示:
Flash Sector 0 write failed!
Warnning interrupt vectors data is not correct!
Program you downloaded can not run freely!
請(qǐng)問(wèn)是什么原因 我該如何辦
A:仿真器設(shè)置選項(xiàng)有一個(gè)允許擦除FLASH的選項(xiàng),選擇它。
第39問(wèn):
Q:我發(fā)現(xiàn)程序在RAM調(diào)試時(shí)(RO=0X40000000) OK,但是JTAG下載到FLASH(RO=0X00000000),
顯示如下:
The session file ‘c:\Documents and Settings\jan\default-1-2-0-0.ses’
could not be loaded.
A:這是ADS自身的問(wèn)題,請(qǐng)不要通過(guò)IDE運(yùn)行AXD,而是通過(guò)開(kāi)始菜單運(yùn)行,然后Load調(diào)試文件調(diào)試。
第40問(wèn):
Q:我有幾個(gè)問(wèn)題想問(wèn)問(wèn)大家。
調(diào)試主機(jī)負(fù)責(zé)對(duì)ARM源程序進(jìn)行編譯鏈接,最好用什么樣的高級(jí)語(yǔ)言對(duì)arm源程序進(jìn)行編譯鏈接 使用調(diào)試程序(如AXD)進(jìn)行JTAG調(diào)試,AXD是什么調(diào)試程序,是否是類似什么軟件之類的 到哪能下載AXD的調(diào)試程序呢 怎么樣進(jìn)行AXD程序進(jìn)行JTAG調(diào)試
如何通過(guò)JTAG仿真器發(fā)送到目標(biāo)機(jī)上呢
對(duì)于單片機(jī)的調(diào)試,都用到了什么軟件
都個(gè)有什么作用呢
A:可以使用 ADS1.2,Keil C也支持。AXD是ADS的一個(gè)組件。
您可以在下載 Easyarm2100開(kāi)發(fā)套件快速入門看一看。
?
評(píng)論
查看更多