AREA BOOTCODE, CODE, READONLY
ENTRY
BootloAd
LDR r0, =0x00
LDR r1, =0x00
LDR r2, =0x00
LDR r3, =0x00
END
1 )在 ARM 程序里,如何指定指令在 ROM 中存放的位置(类似单片机的 ORG 伪指令)
我想不管哪款 ARM 芯片,肯定都有上电复位地址,也就是上电后 PC 指向的位置。比如某款 ARM 芯片复位地址为 0x00000000 ,复位后我希望执行的第一条指令是 LDR R0, =0x00 。那么在程序里我们怎么指定将该条指令放在 ROM 的 0x00 位置呢?
2 ) ENTRY 伪指令的作用
ENTRY 伪指令是程序的入口,一个程序只能有一个 ENTRY ,在生成 ELF 格式的 IMAGE 文件时,它能够告诉仿真器从哪条指令开始执行程序,但是在生成 BIN 文件时,它又有什么用呢??我们希望将 ENTRY 下面的那条指令烧录到 ARM 芯片的上电复位地址处,每款芯片的复位地址都可能不同, ADS 如何能通过 ENTRY 就知道实际芯片的复位地址在哪里?
3 ) ARM LINKER 配置时 RO BASE 的作用
我在 ARM LINKER 的配置页里将 RO BASE 设置为 0x3000, 通过用 AXD 装载生成的 AXF 文件仿真,观察发现, LDR r0, =0x00 这条指令被放在存储器的 0x3000 位置,这似乎说明通过设置 RO BASE 可以设置程序在 ROM 中的起始位置。但我看同时生成的 BIN 文件,只有 16 个字节,那如果用烧录器烧芯片时,烧录器如何知道 BIN 文件的第一个字节要放在 ROM 的 0x3000 位置呢?(不通过填写烧录软件里的烧录起始地址为 0x3000 )
ENTRY
BootloAd
LDR r0, =0x00
LDR r1, =0x00
LDR r2, =0x00
LDR r3, =0x00
END
1 )在 ARM 程序里,如何指定指令在 ROM 中存放的位置(类似单片机的 ORG 伪指令)
我想不管哪款 ARM 芯片,肯定都有上电复位地址,也就是上电后 PC 指向的位置。比如某款 ARM 芯片复位地址为 0x00000000 ,复位后我希望执行的第一条指令是 LDR R0, =0x00 。那么在程序里我们怎么指定将该条指令放在 ROM 的 0x00 位置呢?
2 ) ENTRY 伪指令的作用
ENTRY 伪指令是程序的入口,一个程序只能有一个 ENTRY ,在生成 ELF 格式的 IMAGE 文件时,它能够告诉仿真器从哪条指令开始执行程序,但是在生成 BIN 文件时,它又有什么用呢??我们希望将 ENTRY 下面的那条指令烧录到 ARM 芯片的上电复位地址处,每款芯片的复位地址都可能不同, ADS 如何能通过 ENTRY 就知道实际芯片的复位地址在哪里?
3 ) ARM LINKER 配置时 RO BASE 的作用
我在 ARM LINKER 的配置页里将 RO BASE 设置为 0x3000, 通过用 AXD 装载生成的 AXF 文件仿真,观察发现, LDR r0, =0x00 这条指令被放在存储器的 0x3000 位置,这似乎说明通过设置 RO BASE 可以设置程序在 ROM 中的起始位置。但我看同时生成的 BIN 文件,只有 16 个字节,那如果用烧录器烧芯片时,烧录器如何知道 BIN 文件的第一个字节要放在 ROM 的 0x3000 位置呢?(不通过填写烧录软件里的烧录起始地址为 0x3000 )
VECTORS
。
S
是在
ADS
中设定的:
vector.s
中
"section"=STARTUP
为首运行。
类似的。 复位后是中断向量表。第一个是复位向量,在那里
放一个跳转。(一般才几个字节大小,只能放跳转了)
跳转到 :
1 。初始化的代码处。 InitStAck 初始化堆栈。。。
2 。 C 的 _MAIN 地址,运行 MAIN ()
类似的。 复位后是中断向量表。第一个是复位向量,在那里
放一个跳转。(一般才几个字节大小,只能放跳转了)
跳转到 :
1 。初始化的代码处。 InitStAck 初始化堆栈。。。
2 。 C 的 _MAIN 地址,运行 MAIN ()
vector.s
应该是自己写的
ARM
汇编,不是每个项目都会有
vector.s
文件的吧?
另外,就算在 section 指定了 STARTUP 为首运行,怎么将该条指令和硬件的复位地址对上呢?
另外,就算在 section 指定了 STARTUP 为首运行,怎么将该条指令和硬件的复位地址对上呢?
是这样的
:
CODE32
AREA StArtup,CODE,READONLY
ENTRY
;// 中断向量表每个宽 4 个字节。只能放一条 32 位的 ARM 指令。
Vectors ; BASE+0
LDR PC, ResetAddr ; 复位的第一条。跳到标号; ResetAddr
LDR PC, UndefinedAddr ; 32 位的 ARM 指令。 BASE+1
LDR PC, SWI_Addr ; 32 位的 ARM 指令。 BASE+2
LDR PC, PrefetchAddr
LDR PC, DAtAAbortAddr
DCD 0xb9205f80
LDR PC,[PC, #-0xff0]
LDR PC,FIQ_Addr
...
ResetAddr :
BL InitStAck
B _MAIN
跳转到 :
1 。初始化的代码处。 InitStAck 初始化堆栈。。。
2 。 C 的 _MAIN 地址,运行 MAIN ()
CODE32
AREA StArtup,CODE,READONLY
ENTRY
;// 中断向量表每个宽 4 个字节。只能放一条 32 位的 ARM 指令。
Vectors ; BASE+0
LDR PC, ResetAddr ; 复位的第一条。跳到标号; ResetAddr
LDR PC, UndefinedAddr ; 32 位的 ARM 指令。 BASE+1
LDR PC, SWI_Addr ; 32 位的 ARM 指令。 BASE+2
LDR PC, PrefetchAddr
LDR PC, DAtAAbortAddr
DCD 0xb9205f80
LDR PC,[PC, #-0xff0]
LDR PC,FIQ_Addr
...
ResetAddr :
BL InitStAck
B _MAIN
跳转到 :
1 。初始化的代码处。 InitStAck 初始化堆栈。。。
2 。 C 的 _MAIN 地址,运行 MAIN ()
假设我的工程中
vector.s
是初始化文件。
其主要内容为:
CODE32
AREA StArtup,CODE,READONLY
ENTRY
;// 中断向量表每个宽 4 个字节。只能放一条 32 位的 ARM 指令。
Vectors ; BASE+0
LDR PC, ResetAddr ; 复位的第一条。跳到标号; ResetAddr
LDR PC, UndefinedAddr ; 32 位的 ARM 指令。 BASE+1
LDR PC, SWI_Addr ; 32 位的 ARM 指令。 BASE+2
LDR PC, PrefetchAddr
LDR PC, DAtAAbortAddr
DCD 0xb9205f80
LDR PC,[PC, #-0xff0]
LDR PC,FIQ_Addr
...
ResetAddr :
BL InitStAck
B _MAIN
;=======================================
所以需要在 ADS 中设定
object/symbol : vector.o ,"section"=STARTUP 为首运行。
;=======================================
上电复位后,程序从 entry 处进入。
则第一条指令就是 : LDR PC, ResetAddr
那么 PC 指针跳转到 ReseAddr 标号处。
你可以在这里实现初始化功能。
其主要内容为:
CODE32
AREA StArtup,CODE,READONLY
ENTRY
;// 中断向量表每个宽 4 个字节。只能放一条 32 位的 ARM 指令。
Vectors ; BASE+0
LDR PC, ResetAddr ; 复位的第一条。跳到标号; ResetAddr
LDR PC, UndefinedAddr ; 32 位的 ARM 指令。 BASE+1
LDR PC, SWI_Addr ; 32 位的 ARM 指令。 BASE+2
LDR PC, PrefetchAddr
LDR PC, DAtAAbortAddr
DCD 0xb9205f80
LDR PC,[PC, #-0xff0]
LDR PC,FIQ_Addr
...
ResetAddr :
BL InitStAck
B _MAIN
;=======================================
所以需要在 ADS 中设定
object/symbol : vector.o ,"section"=STARTUP 为首运行。
;=======================================
上电复位后,程序从 entry 处进入。
则第一条指令就是 : LDR PC, ResetAddr
那么 PC 指针跳转到 ReseAddr 标号处。
你可以在这里实现初始化功能。
答
6
:
竟然不能重编辑。。。今晚刚看了
44b0
的
bootloAder
程序。
有不对的地方希望各位指正。
有不对的地方希望各位指正。