历史上的今天
今天是:2024年09月13日(星期五)
2021年09月13日 | S3c2440代码重定位详解1---段的概念重定位的引入
2021-09-13 来源:eefocus
S3C2440的CPU可以直接给SDRAM发送命令、给Nor Flash发送命令、给4K的片上SRAM发送命令,但是不能直接给Nand Flash发送命令

NAND启动过程
假如把程序烧写到Nand Flash上,即向Nand Flash烧入* bin* 文件,CPU是无法从Nand Flash中取代码执行的。
为什还可以使用NAND启动?
上电后,Nand启动硬件会自动把Nand Flash前4K复制到SRAM;
CPU从0地址运行SRAM;
如果我的程序大于4K怎么办?
前4K的代码需要把整个程序读出来放到SDRAM(即代码重定位)
NOR启动过程
如果从Nor Flash启动,会出现什么问题?
将拨动开关拨到Nor Flash启动时,此时CPU认为的 0地址 在Nor Flash上面,片内内存SRAM的基地址就变成了0x40000000(Nand启动时片内内存SRAM的基地址基地址是0),
由于Nor Flash特性:可以像内存一样读,但不能像内存直接写,因此需要把全局变量和静态变量重定位 放到SDRAM里。
例如执行如下几条汇编指令
MOV R0, #0
LDR R1, [R0] @读有效
STR R1, [R0] @写无效
当程序中含有需要写的全局变量或静态变量时,假如是在Nand Flash可以正常操作,如果是在Nor Flash,修改无效。因此我们需要把全局变量和静态变量重定位 放到SDRAM
#include "s3c2440_soc.h"
#include "uart.h"
#include "init.h"
char g_Char = 'A'; //定义一个全局变量
const char g_Char2 = 'B'; //定义固定的全局变量
int g_A = 0;
int g_B;
int main(void)
{
uart0_init();
while (1)
{
putchar(g_Char); /*让g_Char输出*/
g_Char++; /* nor启动时, 此代码无效 */
delay(1000000);
}
return 0;
}
编译运行查看是否有效果
查看sdram.dis文件 发现data数据段放在了0x00008474这个地址导致 程序太大
在makefile中加入这么一句话
arm-linux-ld -Ttext 0 ** -Tdata 0x700 ** start.o led.o uart.o init.o main.o -o sdram.elf
16进制的700就是十进制的2048
这时我们的bin文件就变为2049
烧写程序:
烧写在NORFlash 和 烧写在NANDFlash观察这两种的效果。
设置成NANDFlash启动没有问题 显示ABCDE…
设置成NORFlash启动显示AAA…
对于NOR启动时g_Char++; /* nor启动时, 此代码无效 */
Disassembly of section .data:
00000700 <__data_start>:
700: Address 0x700 is out of bounds. //数据段
Disassembly of section .rodata:
//放在只读数据段内
00000474 474: Address 0x474 is out of bounds. Disassembly of section .bss: //bss段 00000804 804: 00000000 andeq r0, r0, r0 00000808 808: 00000000 andeq r0, r0, r0 Disassembly of section .comment: 一个程序里面有: 1、.text 代码段 2、.data 数据段 3、rodata 只读数据段(const全局变量) 4、bss段 (初始值为0,无初始值的全局变量) 5、commen 注释 其中bss段和commen 注释不保存在bin文件中。
史海拾趣
|
单激式变压器开关电源工作原理 开关电源原理与设计(连载12) 星期一, 04/27/2009 - 09:01 — 陶显芳 我们再来分析控制开关K关断期间的情况。 在Toff期间,控制开关K关断,流过变压器初级线圈的电流突然为0。由于变压器初级线圈回路中的电流产生突变,而变压器铁心中的磁通量 不能突变,因此,必须要求流过 ...… 查看全部问答> |
|
在对linux系统的应用编程里,涉及到线程的知识点,知道这块对后来的设计是非常重要的,参考了一些资料, 现如今仍为弄懂的问题: 1、如果父进程有多个线程,那么它的再在它的子进程中也应该拥有这些线程吗? 2、如果子进程拥有了与父进程一样的 ...… 查看全部问答> |
|
仿真时如何能导出ram中的数据呢?是在testbench中有特定的语句吗?(verilog)还是modelsim中有这样的功能呢?请教各位高人和大神!… 查看全部问答> |
|
MSP430学习插曲——MSP430F21X1中文资料(独家) MSP430F21X1这个官网上只有E文的,也知道大家的E文都不错,不过怎么说还是中文的看得爽一些,不过涉及到深层次的问题还是需要回归原文。 这个是lierda翻译的,应该没有什么大的错误吧。… 查看全部问答> |




