历史上的今天
今天是:2025年07月22日(星期二)
2018年07月22日 | S3C2440 跳到 SDRAM 中执行程序
2018-07-22 来源:eefocus
从Nandflash启动CPU时,CPU会通过内部的硬件将Nandflash开始的4KB数据复制到为Steppingstone的4Kb的内部RAM中(起始地址为0)
然后跳到0地址开始执行.
我们这个例子是先使用汇编语言设置好存储控制器,使我们外接的SDRAM可用,然后把程序本身从Steppingstone复制到SDRAM处,
最后跳到SDRAM中执行.
程序的什么关看门狗,设置存储控制器,复制代码到SDRAM中都比较简单,
程序跳入到C程序之前要设置栈供C程序使用!!!
ldr sp, =0x34000000 @ 设置堆栈
栈设置在顶部,自上而下.
写这篇记录博客的原因最重要的是:
ldr pc, =on_sdram @ 跳到SDRAM中继续执行
这句,这个得弄明白,说实话,我对这个跳转有时候很清楚,有时候又感到模糊.
首先:
Makefile中的文件,
连接地址为0x30000000,是指运行时程序应该位于的地址.即是我们SDRAM的起始地址.

在反汇编中我们可以看到:
ldr pc, =on_sdram @ 跳到SDRAM中继续执行
就相当于一个取地址指令,

当前该指令地址的PC=当前该指令地址 + 8;
即是PC = 0x0c +8 ;

就是到0xA4的地址,也就是0x300000A4;

所以:

程序跳到SDRAM的0x30000010; 即是:

对应上了跳到on_sdram,
对应上程序执行的图示:注意PC的所指位置:
1.

2.

3.

4.

程序在SDRAM中执行感觉慢是因为SDRAM的性能比内部SRAM差一些.
这样拷贝小于4KB的程序到SDRAM中运行,感觉多此一举,
但是我们程序要是大于4KB的话,这个就是不可避免要采用的方法,
但是要复制Nandflash4KB后面的代码需要使用Nandflash控制器来读取Nandflash.
汇编代码具体如下,我贴了出来:
@*************************************************************************
@ File:head.S
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@*************************************************************************
.equ MEM_CTL_BASE, 0x48000000
.equ SDRAM_BASE, 0x30000000
.text
.global _start
_start:
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
bl memsetup @ 设置存储控制器
bl copy_steppingstone_to_sdram @ 复制代码到SDRAM中
ldr pc, =on_sdram @ 跳到SDRAM中继续执行
on_sdram:
ldr sp, =0x34000000 @ 设置堆栈
bl main
halt_loop:
b halt_loop
disable_watch_dog:
@ 往WATCHDOG寄存器写0即可
mov r1, #0x53000000
mov r2, #0x0
str r2, [r1]
mov pc, lr @ 返回
copy_steppingstone_to_sdram:
@ 将Steppingstone的4K数据全部复制到SDRAM中去
@ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
mov r1, #0
ldr r2, =SDRAM_BASE
mov r3, #4*1024
1:
ldr r4, [r1],#4 @ 从Steppingstone读取4字节的数据,并让源地址加4
str r4, [r2],#4 @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
cmp r1, r3 @ 判断是否完成:源地址等于Steppingstone的未地址?
bne 1b @ 若没有复制完,继续
mov pc, lr @ 返回
memsetup:
@ 设置存储控制器以便使用SDRAM等外设
mov r1, #MEM_CTL_BASE @ 存储控制器的13个寄存器的开始地址
adrl r2, mem_cfg_val @ 这13个值的起始存储地址
add r3, r1, #52 @ 13*4 = 54
1:
ldr r4, [r2], #4 @ 读取设置值,并让r2加4
str r4, [r1], #4 @ 将此值写入寄存器,并让r1加4
cmp r1, r3 @ 判断是否设置完所有13个寄存器
bne 1b @ 若没有写成,继续
mov pc, lr @ 返回
.align 4
mem_cfg_val:
@ 存储控制器13个寄存器的设置值
.long 0x22011110 @ BWSCON
.long 0x00000700 @ BANKCON0
.long 0x00000700 @ BANKCON1
.long 0x00000700 @ BANKCON2
.long 0x00000700 @ BANKCON3
.long 0x00000700 @ BANKCON4
.long 0x00000700 @ BANKCON5
.long 0x00018005 @ BANKCON6
.long 0x00018005 @ BANKCON7
.long 0x008C07A3 @ REFRESH
.long 0x000000B1 @ BANKSIZE
.long 0x00000030 @ MRSRB6
.long 0x00000030 @ MRSRB7
史海拾趣
|
Packet = PacketArray; NdisQueryPacket(Packet,NULL,&BufLength,&pBuffer,&PacketSize); if(!BufLength) ...… 查看全部问答> |
|
问题描述如下: 假如有四个IO口,P0.0~P0.3,三角按键的意思就是P0.0与P0.1接一个按键,P0.0与P0.2按一个,P0.0与P0.3按一个,P0.1与P0.2接一个,P0.1与P0.3接一个,P0.2与P0.3接一个,共六个按键。 求C的 ...… 查看全部问答> |
|
我现在开发的过程中遇到了这样的问题,如何将任天堂(NES)游戏模拟器,移植到我们的平台上。 我们用的是ARM9 的CPU,和LINUX操作系统,或者THREADX上也可以~~ 如果谁会的话,将重金酬谢!! (只要能将任意一款任天堂的游戏,在 ...… 查看全部问答> |
|
D类音频功率放大器具有效率高、功耗低的优点,采用D类音频功率放大器的设备能够提高电池的寿命,它特别适合应用于无线和手持通信设备,主要应用在PDA、移动电话和类似的手持移动通信工具的设计和产品中。而大功率输出的音频设备具有很大 ...… 查看全部问答> |
|
阅读了官方提供的how to write python applications,简单总结一下。首先说明这个教程是不用配合usrp设备就可以进行的,但是一些基本的硬件(例如声卡等)还是必须的。1、流图做为Gnuradio里中的核心,多次被提到。文章中主要涉及的流图有:简单流 ...… 查看全部问答> |
|
做一个LED电源的示例 设计要求:10X10灯板电源驱动 点击WEBENCH设计工具LED标签,进入LED电源设计界面,针对设计的要求在下半部分选取灯珠,如果设计上半部的参数进行一些选取,可缩小挑选的范围。 这里选择了GREE里XP系列里的一枚,在灯板排 ...… 查看全部问答> |




