在嵌入式學習過程中,基于ARM核的嵌入式芯片必不可少。那么,在學習ARM嵌入式知識或開發中,嵌入式工程師會遇到哪些不可預知的問題?哪些問題會在嵌入式的學習中成為您的攔路虎?為了盡量為讀者掃清這些令人困惑的障礙,故粵嵌整理推出《ARM嵌入式學習經典10問》,以饗讀者。
第1問:
Q:請問在初始化CPU堆棧的時候一開始在執行movr0,LR這句指令時處理器是什么模式?
A:復位后的模式,即管理模式。
第2問:
Q:請教:MOV中的8位圖立即數,是怎么一回事,0xF0000001是怎么來的?
A:是循環右移,就是一個0—255之間的數左移或右移偶數位的來的,也就是這個數除以4一直除,直到在0-255的范圍內它是整數就說明是可以的!
A:8位數(0-255)循環左移或循環右移偶數位得到的,F0000001既是0x1F循環右移4位,符合規范,所以是正確的。這樣做是因為指令長度的限制,不可能把32位立即數放在32位的指令中。移位偶數也是這個原因。可以看一看arm體系結構(ADS自帶的英文文檔)的相關部分。
第3問:
Q:請教:《arm微控制器基礎與實戰》2.2.1節關于第2個操作數的描述中有這么一段:#inmed_8r常數表達式。該常數必須對應8位位圖,即常熟是由一個8位的常數循環移位偶數位得到。
合法常量:0x3FC,0,0xF0000000,200,0xF0000001.
非法常量:0x1FE,511,0xFFFF,0x1010,0xF0000010.
常數表達式應用舉例:
…
…
LDRR0,[R1],#-4;讀取R1地址上的存儲器單元內容,且R1=R1-4
針對這一段,我的疑問:
1.即常數是由一個8位的常數循環移位偶數位得到,這句話如何理解?
2.該常數必須對應8位位圖,既然是8位位圖,那么取值為0-255,怎么0x3FC這種超出255的數是合法常量呢?
3.所舉例子中,合法常量和非法常量是怎么區分的如0x3FC合法,而0x1FE卻非法0xF0000000,0xF0000001都合法,而0xF0000010又變成了非法?
4.對于匯編語句LDRR0,[R1],#-4,是先將R1的值減4結果存入R1,然后讀取R1所指單元的值到R0,還是先讀取R1到R0,然后再將R1減4結果存入R1?
A:提示,任何常數都可用底數*2的n次冪來表示。
1.arm結構中,只有8bits用來表示底數,因此底數必須是8位位圖。
2.8位位圖循環之后得到常數,并非只能是8位。
3.0xF0000010底數是9位,不能表示。
4.LDRR0,[R1],#-4是后索引,即先讀,再減。
可以看一看arm體系結構對相關尋址方式的說明。
第4問:
Q:在程序移植的過程中,什么代碼段處于什么樣的模式,這可真是一個困擾人的大難題,有沒有一種標志或辦法能夠識別“代碼段處于什么樣的模式”?
A:讀取CPSR,任何時候都是可以讀。
第5問:
Q:為什么保護現場時,總是保護R0-R3,R12,為什么不保護R4-R11?
A:請看一看“arm-thumb過程調用標準”這個文檔。
第6問:
Q:請問movR1,#0x00003DD0錯誤:outoftherangeofoperation是怎么回事情我就是想IODIR=0x00003dd0,匯編就是
LDRR0,=IODIR
MOVR1,#0x00003dd0
STRR1,[R0]
編譯時候說是超出操作范圍
A:使用ldr,mov的操作數為8位位圖數。
第7問:
Q:“在arm7TDMI(-S)處理器內部有37個用戶可見的寄存器:”
問題:“用戶可見”應該怎樣理解這37個寄存器是否是37個不同的物理寄存器,例如R8與R8_fiq應該是兩個不同的物理寄存器吧.
A:用戶可見是指用戶可以通過程序操作的。R8與R8_fiq是兩個不同的寄存器。
第8問:
Q:USR模式,SVC模式,IRQ模式分別有哪些限制?
A:對于外設操作限制與芯片設計有關。USR模式不能設置CPSR寄存器。用戶模式下無SPSR寄存器,代碼可以為arm,Thumb.
第9問:
Q:請問“在初始化堆棧時就決定了工作模式”是什么意思如何決定工作模式的?
A:設置CPSR寄存器。
第10問:
Q:請問:arm匯編程序設計中所謂的“文字池”作何理解?
A:可以理解為常量數組,文字池中保存的是常量,這些常量可以是正常的常量,也可以是地址。