历史上的今天

今天是:2024年09月24日(星期二)

正在发生

2021年09月24日 | ARM的step内存到SDRAM内存代码复制程序调试之罪魁祸首 ADR与LDR

发布者:Tapir 来源: eefocus关键字:ARM  SDRAM内存  ADR  LDR 手机看文章 扫描二维码
随时随地手机看文章

start.S启动的汇编代码

#define S3C2440_MPLL_200MHZ ( (0x5C<<12)|(0x01<<4)|(0x02) )

#define MEM_CTL_BASE   0x48000000


.text

.global _start

_start:


/*1关看门狗*/

 mov r0,#0x53000000

 mov r1,#0

 str r1,[r0]

 

/*2设置时钟*/

 ldr r0,=0x4C000014

 mov r1,#0x03

 str r1,[r0]

 

 mrc  p15,0,r1,c1,c0,0 

 orr  r1,r1,#0xc0000000 

 mcr  p15,0,r1,c1,c0,0


 ldr r0,=0x4C000004

 ldr r1,=S3C2440_MPLL_200MHZ

 str r1,[r0]

/*3初始化SDRAM*/

 mov r0,#MEM_CTL_BASE

 adr r1,sdram_config

 add r3,r0,#(13*4) 

1:

 ldr r2,[r1],#4

 str r2,[r0],#4

 cmp r3,r0

 bne 1b 

/*4重定位:把代码从0内存复制到它的链接地址去*/

 mov r0,#0;

 ldr r1,=0x33f80000

 mov r2,#4096

1: 

 ldr r3,[r0],#4

 str r3,[r1],#4

 cmp r2,r0

 bne 1b

/*清bss段*/


/*5执行main函数*/ 

 ldr sp,=0x34000000

 ldr pc,=main

sdram_config:

    .long 0x22011110

  .long 0x00000700

  .long 0x00000700

  .long 0x00000700

  .long 0x00000700

  .long 0x00000700

  .long 0x00000700

  .long 0x00018005

  .long 0x00018005

  .long 0x008C04F4

  .long 0x000000B1

  .long 0x00000030

  .long 0x00000030


init.c测试文件

#define GPBCON (*(volatile unsigned long *)0x56000010)

#define GPBDAT (*(volatile unsigned long *)0x56000014)



void delay(unsigned long dly)

{

 for(;dly>0;dly--);

}



int  main()

{

 int i=0; 

 GPBCON = 1<<5*2 | 1<<6*2 | 1<<7*2 | 1<<8*2;

 while(1)

 { 

  delay(100000);  

  GPBDAT =(~(i<<5)); 

  ++i;  

  i %= 16; 

 }

 return 0;

}

链接脚本

SECTIONS{

 . = 0x33f80000;

 .text   : {*(.text)}

 

 . = ALIGN(4);

 .rodata : {*(.rodata*)}

 

 . = ALIGN(4);

 .data   : {*(.data)}

 

 . = ALIGN(4);

 __bss_start = .;

 .bss    : {*(.bss) *(COMMON)}

 __bss_end   = .;

}


Makefile

objs := start.o init.o

boot.bin:$(objs)

 arm-linux-ld  -Tboot.lds -o boot_elf $^

 arm-linux-objcopy -O binary boot_elf $@

 arm-linux-objdump -D -m arm boot_elf >boot.dis

%.o : %.S

 arm-linux-gcc  -c -o $@ $<

%.o : %.c

 arm-linux-gcc  -c -o $@ $<

clean:

 rm -f *.bin boot_elf *.o *.dis


调试了一个下午,在这段程序的运行过程中,发现程序总是无法点亮LED,也就是程序根本就没有运行到main函数中。然后我就从后向前去找程序可能的出错地点。

1,刚开始 我怀疑是ldr pc,=main这句指令没有跳到地方。后来换用bl main。发现还是一样的结果。查看反汇编,发现指令也是跳到了指定的位置了。于是,继续向上找。


2,后来觉得是不是/*2设置时钟*/ 这个有问题,于是把这段删除了,然后问题依然没有解决!


3,排除法,问题可能出在/*3初始化SDRAM*/!!!!但是查看反汇编,也没有找到问题的所在!


最后,通过对比以前写的汇编程序发现,程序的28行(原来写的是ldr r1,=sdram_config)改成


adr r1,sdram_config后程序正常了!


后来我在网上搜了下:ldr和adr的区别主要就是地址的位置无关性的差别。ldr伪指令操作,一旦实际运行物理地址和期望运行物理地址存在差别,那就会造成程序运行错误。虽然adr有这么多优点,但是adr的寻址空间只有前后4kb,而且必须在同一个代码段中,ldr就没有这些要求。


我查看了这分别包含两条指令的程序的反汇编,也没有发现有什么大的分别!


比较搞笑的是这两都反汇编出的代码是一样的!但是两都的二进制文件却是不一样的


当使用adr对应的这个二进制指令为: e28f1034


当使用ldr对应的这个二进制指令为: e59f1074


这还是后来我写了个文件比较程序才发现的!这两个指令对应的汇编是什么,有待查证!待续。。。。。。

关键字:ARM  SDRAM内存  ADR  LDR 引用地址:ARM的step内存到SDRAM内存代码复制程序调试之罪魁祸首 ADR与LDR

上一篇:s3c2440时钟+nandflash拷贝至SDRAM+开启mmu
下一篇:at91rm9200上u-boot移植

推荐阅读

上海,2018年9月18日—— 作为设计和生产创新性半导体材料的全球领军企业,Soitec半导体公司于2018年9月18日至19日参加了在上海由SOI国际产业联盟举办的第六届FD-SOI高峰论坛暨国际RF-SOI研讨会(Shanghai FD-SOI Forum & International RF-SOI Workshop)。来自国际顶级半导体公司、科研院所、投资机构和政府部门的业内精英在本届高峰论坛上就FD-S...
9月24日消息,近日,松禾资本设立的一只新基金——松禾创智基金完成前期筹备和募集,正式宣布成立。该基金总规模10亿元人民币,将专注于人工智能、机器人、物联网、智能制造等创新科技领域的投资。松禾创智基金是松禾资本在松禾远望基金核心团队的基础上发起设立的后续基金,作为松禾资本在科技领域投资的生力军,将传承松禾资本投资硬科技的基因,聚焦前...
9月23日,据上海证监局披露,中信建投证券股份有限公司发布了 关于上海复旦微电子集团股份有限公司(以下简称“复旦微”)首次公开发行A股股票并在科创板上市辅导工作总结报告。报告显示,中信建投证券于2020年3月13日与复旦微签订了《辅导协议》,复旦微聘请中信建投证券为其首次公开发行股票并在科创板上市的辅导机构。在做好充分准备的基础上,中信建...
  由于物位测量产品属于自动化现场测量设备,工作环境一般较为恶劣,对产品可靠性的要求极高。为了能向客户提供高可靠性的产品,且提高企业产品整体的开发能力、缩短产品开发周期、提高产品上市成功率、规范研发活动,计为从企业实际出发,制定了一套适合于计为自身状况的产品研发流程。那么,计为的研发流程如何,又起到哪些具体作用呢?下面,分别介绍...

史海拾趣

问答坊 | AI 解惑

请教升压模块

本帖最后由 paulhyde 于 2014-9-15 08:59 编辑 D题中,需要把3V电压转成5V,请问有什么成形的芯片或者电路可以使用么? 谢谢诸位大侠了  …

查看全部问答∨

谁能给个LM334提供1mA电流的恒流源电路??

我照资料上做的怎么不能提供恒流呢,电流还是随电阻变化,二极管一定要用IN457吗?? 这是我的电路,Vin是5V,R1=133欧,R2=1330欧,我把R1=68欧,R2=680欧也不能提供1mA恒流…

查看全部问答∨

嵌入式中寄存器的配置问题

如果要开发一个驱动涉及到寄存器的配置吗?外设寄存器,比如Timer,Watchdog,DMA等好像是在bootloader阶段配置的,是不是在开发驱动的时候如果涉及到寄存器的配置就要修改bootloader了?刚接触嵌入式,对整个开发流程还很模糊,希望有人给指点迷津。…

查看全部问答∨

如果使用了新库,交叉编译应该怎么做?

rt,我使用了libpcap库编写的程序,需要在ARM7平台上跑,那交叉编译的时候应该怎么做。也就是如果使用了平时不用的库,具体应该怎么做?…

查看全部问答∨

[求助]入门级的编程问题

本帖最后由 dontium 于 2015-1-23 13:25 编辑 你好 请问在CCS下用C语言编程,请问需不需要自己去定义各个寄存器的地址和名字呢?因为我看一些例程中都是自己写两个h文件去定义的。不知道CCS有没有自带的寄存器定义呢? 是不是每个不同的片子都要 ...…

查看全部问答∨

SEED DIM3517核心板&底板接口

真是孤陋寡闻,核心板插到底板原来还需要知道点技巧一开始(晚上)感觉就应该平着插进去,用旁边两卡扣卡住,可是老是只能插进去一半(带金属部分),然后卡口也不好卡住,接好串口线,上电也没信息出来,重插了N遍还是没反应,为了验证我的串口线 ...…

查看全部问答∨

复赛题目有多少做出来的?

本帖最后由 paulhyde 于 2014-9-15 03:50 编辑 324做三角波发生器、加法器、滤波器、比较器……  …

查看全部问答∨

【TI学习】M3

    我之前没学过TI M3的东西,但看到没人发学习的这个板块,所以我就写几句,呵呵~~~     我现在一直在学习STM32,已经有一段时间了,在淘宝买了一块开发板,花了四百左右,开始是学习板子自带光盘上的资料,但那 ...…

查看全部问答∨

汽车传感器行业找总经理=

总经理 接上司: 董事长 工作职责: 1、   执行董事会决议,主持全面工作,保证经营目标的实现,完成董事会下达的任务和利润指标。 2、   组织实施董事会批准的公司年度工作计划和财务预算报告及利润分配使用方案。 3、&n ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved