历史上的今天
今天是:2024年09月24日(星期二)
2021年09月24日 | ARM的step内存到SDRAM内存代码复制程序调试之罪魁祸首 ADR与LDR
2021-09-24 来源:eefocus
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
这还是后来我写了个文件比较程序才发现的!这两个指令对应的汇编是什么,有待查证!待续。。。。。。
史海拾趣
|
针对动力线(三相)、讯号线、IO线、特殊电源线简介 共通点: 线材本身就是阻抗体,为何电线会发烫发热?为何会有压降?为何会耗电? 都是电阻造成的。此阻抗来自何处? 1、 自身材料(金、银、铜、铝、锡) 传输系数(导电率)—金最佳、最贵 ...… 查看全部问答> |
|
SynQor公司是美国一家专门从事DC/DC和AC/DC电源模块研发生产的高科技公司,自1999 年推出通用开架式DC/DC模块电源开始,到现在已推出涵盖通讯,工业,医疗,国防,军 工等领域应用的全系列产品。产品系列包括电信级标准DC-DC模块电源(PowerQor, ...… 查看全部问答> |
|
导航电子地图众所周知为GPS导航的核心和根本,导航地图更新和升级乃是导航地图生命线,甚至是GPS导航产品存活的标准。我国GPS导航市场经过几年的发展,现在关于导航地图的升级问题越来越来严重,成为导航电子地图商的一大难题。 &nbs ...… 查看全部问答> |
|
如何实现FAT配置注册表实现自动化分区功能,因为我的EBOOT没有分区功能,但又想实现HIVE-BASE+FAT? 环境:S3C2410+NAND(64)+RAM(64)… 查看全部问答> |
|
调用Datetime.now.tostring() 方法 模拟器上 返回2009-03-16 17:33:11 连接d600调试,datetime.now 返回 2009-03-16 星期一 17:33:11 S900返回2009-03-16 17:33:11 为啥多出个星期一呢。。忘赐教。… 查看全部问答> |
|
关于LQFP144的STM32,可以画成2层板吗? 1。我参考一些开发板,大都是4层的,当然它板子尺寸比较小,而且采用0603封装。 我问做产品的,也是4层,抗干扰。 2。但是我的板子由于接插件较多,所以板子尺寸为200*250mm, 电路也不是很复杂,所 ...… 查看全部问答> |
|
1 购买有关书籍,并到杭州利尔达公司网站和TI网站获取资料, 2FET 如果经济条件不错,可以直接购买。 3FET 自制仿真器FET,首先要到网上找到FET电路图,然后就可以使用画电路板软 件画电 ...… 查看全部问答> |




