韦东山Linux嵌入式课程社区
直播中

李蕊

7年用户 222经验值
私信 关注

单板汇编代码报错

链接脚本
SECtiONS {
  firtst          0x00000000 : { head.o init.o nand.o  }
  second          0x30000000 : AT(4096) { main.o serial.o}
}

----------------------------------------------------------------------
汇编程序head.s
------------------------------------------------------------------------------------

.extern     main
.text
.global _start
_start:
Reset:                  
    ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈
    bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启
    bl  clock_init          @ 设置MPLL,改变FCLK、HCLK、PCLK
    bl  memsetup            @ 设置存储控制器以使用SDRAM
    bl      nand_init      
    ldr     r0,     =0x30000000     @1. 目标地址=0x30000000,这是SDRAM的起始地址
    mov     r1,     #4096           @2.  源地址   = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处
    mov     r2,     #2048           @3.  复制长度= 2048(bytes),对于本实验的main.c,这是足够了
    bl      nand_read               @调用C函数nand_read
    ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行
on_sdram:
     ldr sp, =0x34000000                 @ 设置堆栈
     ldr lr, =halt_loop  @ bl  main
     ldr pc, =main  
halt_loop:
    b   halt_loop


-----------------------------------------------------------------
这个编译没有问题但是
改成下面就不可以
  ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行
on_sdram:
     ldr sp, =0x34000000                 @ 设置堆栈
     bl main      
halt_loop:
    b   halt_loop

报错
: relocation truncated to fit: R_ARM_PC24 main
原因是b跳转范围不够,
但是在前一句 ldr pc, =on_sdram ,这个时候pc已经跳转到了sdram,
从sdram跳转到main,为什么范围还不够?

回帖(1)

张览秀

2019-4-24 11:39:50
自己回答一下,ldr pc, =on_sdram  on_sdram: 并没用pc并没有调到sdram里面,那问题来了,这样分段的链接文件,我又想在第二段代码使***令该如何做?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分