ARM指令定址問(wèn)題
ENTRY
BootloAd
LDRr0, =0x00
LDRr1, =0x00
LDRr2, =0x00
LDRr3, =0x00
END
1)在A(yíng)RM程序里,如何指定指令在ROM中存放的位置(類(lèi)似單片機的ORG偽指令)
我想不管哪款ARM芯片,肯定都有上電復位地址,也就是上電后PC指向的位置。比如某款ARM芯片復位地址為0x00000000,復位后我希望執行的第一條指令是LDR R0, =0x00。那么在程序里我們怎么指定將該條指令放在ROM的0x00位置呢?
2)ENTRY偽指令的作用
ENTRY偽指令是程序的入口,一個(gè)程序只能有一個(gè)ENTRY,在生成ELF格式的IMAGE文件時(shí),它能夠告訴仿真器從哪條指令開(kāi)始執行程序,但是在生成BIN文件時(shí),它又有什么用呢??我們希望將ENTRY下面的那條指令燒錄到ARM芯片的上電復位地址處,每款芯片的復位地址都可能不同,ADS如何能通過(guò)ENTRY就知道實(shí)際芯片的復位地址在哪里?
3)ARMLINKER配置時(shí)RO BASE的作用
我在A(yíng)RMLINKER的配置頁(yè)里將RO BASE設置為0x3000,通過(guò)用AXD裝載生成的AXF文件仿真,觀(guān)察發(fā)現,LDRr0, =0x00這條指令被放在存儲器的0x3000位置,這似乎說(shuō)明通過(guò)設置RO BASE可以設置程序在ROM中的起始位置。但我看同時(shí)生成的BIN文件,只有16個(gè)字節,那如果用燒錄器燒芯片時(shí),燒錄器如何知道BIN文件的第一個(gè)字節要放在ROM的0x3000位置呢?(不通過(guò)填寫(xiě)燒錄軟件里的燒錄起始地址為0x3000)
VECTORS。S是在A(yíng)DS中設定的: vector.s中"section"=STARTUP為首運行。
類(lèi)似的。 復位后是中斷向量表。第一個(gè)是復位向量,在那里
放一個(gè)跳轉。(一般才幾個(gè)字節大小,只能放跳轉了)
跳轉到:
1。初始化的代碼處。InitStAck 初始化堆棧。。。
2。C 的 _MAIN 地址,運行 MAIN()
vector.s應該是自己寫(xiě)的ARM匯編,不是每個(gè)項目都會(huì )有vector.s文件的吧?
另外,就算在section指定了STARTUP為首運行,怎么將該條指令和硬件的復位地址對上呢?
是這樣的:
CODE32
AREAStArtup,CODE,READONLY
ENTRY
;//中斷向量表每個(gè)寬 4個(gè)字節。只能放一條32位的ARM指令。
Vectors;BASE+0
LDRPC, ResetAddr;復位的第一條。跳到標號;ResetAddr
LDRPC, UndefinedAddr ;32位的ARM指令。 BASE+1
LDRPC, SWI_Addr;32位的ARM指令。 BASE+2
LDRPC, PrefetchAddr
LDRPC, DAtAAbortAddr
DCD0xb9205f80
LDRPC,[PC, #-0xff0]
LDRPC,FIQ_Addr
...
ResetAddr:
BLInitStAck
B_MAIN
跳轉到:
1。初始化的代碼處。InitStAck 初始化堆棧。。。
2。C 的 _MAIN 地址,運行 MAIN()
假設我的工程中 vector.s是初始化文件。
其主要內容為:
CODE32
AREAStArtup,CODE,READONLY
ENTRY
;//中斷向量表每個(gè)寬 4個(gè)字節。只能放一條32位的ARM指令。
Vectors;BASE+0
LDRPC, ResetAddr;復位的第一條。跳到標號;ResetAddr
LDRPC, UndefinedAddr ;32位的ARM指令。 BASE+1
LDRPC, SWI_Addr;32位的ARM指令。 BASE+2
LDRPC, PrefetchAddr
LDRPC, DAtAAbortAddr
DCD0xb9205f80
LDRPC,[PC, #-0xff0]
LDRPC,FIQ_Addr
...
ResetAddr:
BLInitStAck
B_MAIN
;=======================================
所以需要在A(yíng)DS中設定
object/symbol: vector.o,"section"=STARTUP為首運行。
;=======================================
上電復位后,程序從entry處進(jìn)入。
則第一條指令就是:LDRPC, ResetAddr
那么PC指針跳轉到ReseAddr標號處。
你可以在這里實(shí)現初始化功能。
有不對的地方希望各位指正。
評論