ARM指令定址问题

 
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
 
 VECTORS S 是在 ADS 中设定的: vector.s "section"=STARTUP 为首运行。

类似的。 复位后是中断向量表。第一个是复位向量,在那里
放一个跳转。(一般才几个字节大小,只能放跳转了)
跳转到   
  1
。初始化的代码处。 InitStAck 初始化堆栈。。。
  2
C _MAIN 地址,运行 MAIN ()
 
vector.s 应该是自己写的 ARM 汇编,不是每个项目都会有 vector.s 文件的吧?
另外,就算在 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 ()
 
 
假设我的工程中 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 标号处。
你可以在这里实现初始化功能。
6 :
竟然不能重编辑。。。今晚刚看了 44b0 bootloAder 程序。
有不对的地方希望各位指正。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值