2440外接有SDRAM,Nor Flash,Nand Flash(通过Nand Flash控制,CPU可以直接控制SRAM,SDRAM,Nor Flash,但不能直接控制Nand),同时内部还有4K的SRAM(Nor启动时,起始位置为0x4000,0000;Nand启动时,起始位置为0)。
使用Nand启动时,不可访问Nor,因为Nor的片选接到了nGCS0。另外,Nor可以像内存一样读,但不可以像内存一样写,这是由Nor的物理结构决定的
使用Nand启动时,前4K的代码会由硬件复制到SRAM中,程序也会从地址0即SRAM中开始执行,这样做可以保证程序正常启动(Steppingstone,垫脚石),但如果程序超过4K,则需要用这前4K的代码将整个程序读出放到SDRAM中(重定位),否则程序无法正常运行。
一个程序,主要含有代码段和数据段。
代码段(code):text
数据段(rwdata):含初值的全局变量和静态变量
只读数据段(rodata):被const修饰的全局变量
未初始化数据段(bss段,(Block Started by Symbol)):未赋初值的全局变量和静态变量(不保存在bin中,我们程序里面将它清零即可)
除了这些,还有一个comment段,里面是一些注释信息,如下图,474343为ASCII的GCC。
关键字:重定位
引用地址:
1.4.1 段的概念_重定位的引入
推荐阅读最新更新时间:2024-11-09 23:28
以s3c2440为例讲解arm芯片的启动过程
arm 嵌入式芯片的启动过程对于嵌入式菜鸟来说其实是很复杂的,很多人都是一知半解,存在很多误区。在笔者看来,要想真正了解这一启动过程必须要首先了解存储器的区别与联系,参考文章:各种主流半导体存储器的区别与联系。还需要了解程序是如何编译链接和执行的。 本文将以s3c2440为例详细讲述 arm 芯片的启动过程。s3c2440支持两种启动模式:NAND FLASH 启动和非 NAND FLASH 启动(一般是NOR FLASH 启动,并且可以配置数据宽度),通过 OM1、OM0 两个管脚来控制。 NAND FLASH启动过程 当 OM1、OM0 两个管脚都为低电平时,CPU 就被配置成了 NAND FLASH 启动。此时 CP
[单片机]
【ARM裸机】 - 重定位
1、 重定位的目的 对于2440上电后,分两种情况,从nor启动,直接从nor作为0地址,开始在nor中运行。从nand启动,拷贝前4K到片内SRAM中。当代码大于4K的时候,我们需要重定位代码到更大的SDRAM中去运行。从nor运行时,由于nor只可读而不可以修改nor中的内容,就会导致一些全局变量,在代码中无法修改,此时我们可以将全局变量重定位(指定链接地址)到SDRAM中,这样我就可以nor中运行,然后对全局变量进行修改。 总结来说:重定位就是代码的存储地址和运行地址不一致,我们需要把代码拷贝到运行地址处。可以重定位所有代码,也可以重定位数据段等。由于代码存在flash中,一般可在链接脚本中加入AT()来指
[单片机]
QEMU MINI2440 的 Linux Fedora 8 下网络配置
最近应朋友的要求,研究一下QEMU MINI2440下的仿真。本来我以为这个过程没什么的,这一研究还真发现不少问题,写出来与大家分享。 我使用的系统环境: 1.使用VMware 6.5,宿主机使用 win 7 2.VMWare 6.5上的系统是 Linux Fedora 8 3.RTEMS 的编译环境 4.9 首先我从以下网站获取源代码: 1.获取QEMU的源代码:git clone git://repo.or.cz/qemu/mini2440.git qemu 2.获取UBOOT的源代码git clone git://repo.or.cz/u-boot-openmoko/mini2440.git uboot (注意:QEMU的
[单片机]
s3c2440裸机-内存控制器(三-2、norflash编程之适配访问时序)
前面我们了解了 norFlash的特性和原理 ,那么cpu是如何和nor进行通信的呢?下面开始详细介绍。 1.内存控制器适配norflash 如图是S3C2440的内存控制器的可编程访问周期读写时序,里面的时间参数要根据外部norflash的性能进行配置,这里先列出时间参数的含义: Tacs: Address set-up time before nGCSn(表示地址信号A发出多久后才能发出nGCS片选) Tcos: Chip selection set-up time before nOE(表示片选信号nGCS发出多久后才能发出读使能信号) Tacc:access cycle(数据访问周期) Tacp:page模式下的访问周
[单片机]
基于S3C2440A微处理器和Linux操作系统实现对步进电机的控制
随着嵌入式技术的不断成熟,基于嵌入式系统编写特制电路下的设备驱动程序也越来越受到人们的青睐。在各种嵌入式操作系统中,嵌入式Linux是免费的源代码开放软件,可根据需要任意进行剪裁。在嵌入式Linux开发过程中需要为指定设备编写和编译驱动程序,这与以往在PC机上的Linux驱动开发明显不同,本文设计了基于S3C2440嵌入式Linux下激光雕刻系统的步进电机驱动程序。 1 硬件系统的设计 步进电机开环控制系统主要由中央控制器、步进电机驱动器、传感器以及步进电机四大部分组成。本系统采用基于ARM920t内核的S3C2440A微处理器作为控制系统的中央控制器,该芯片主频400MHz,最高可达到533MHz,内含多种设备接口,存储器使
[单片机]
ARM中断区别-LPC2142与S3C2440的区别
/*************************************************** *说 明 :ARM中断区别-LPC2142与S3C2440的区别 ***************************************************/ LPC 与三星ARM的区别就是三星固定了中断向量的地址,而LPC的就没有。例如三星的S3C2440 所有的中断源都有相对应的中断向量。 关于三星ARM (1)使用向量中断 ENTRY b ResetHandler ; 0x00 b HandlerUndef ; 0x04 b
[单片机]
s3c2440裸机-代码重定位(1.重定位的引入,为什么要代码重定位)
1.重定位的引入(为什么要代码重定位) 我们知道s3c2440的cpu从0地址开始取指令执行,当从nor启动时,0地址对应nor,nor可以像内存一样读,但不能像内存一样写。我们能够从nor上取指令执行。 例子1:当nand启动的时候,我们nand中的前4K指令会变自动加载到sram中去,这时的0地址对应sram。 那么我们的程序如果大于4K,要从nand启动,sram只拷贝了nand中的前4K代码,那么如何解决这个问题呢? 那么就需要重定位代码到sdram中去,sdram的容量较大,又可以直接被cpu访问。 例子2:我们知道,程序含有: 代码段(.text) 数据段(.data):存放初始值不为0的全局变量/静态变量
[单片机]
S3C2440A串口驱动-WINCE6.0下通过串口和外设进行数据通信(二)
三,串口中断服务线程 串口中断产生以后,具体的数据处理将在中断服务线程里面完成,以BSP包中camera的中断线程为例 DWORD CameraCaptureThread(void) { unsigned char tmp=0; static unsigned int time,old_time; static unsigned int cam_intr; DWORD dwCause; //dwDisplayTimeout = INFINITE; SetProcPermissions((DWORD)-1); while(TRUE) { RETAILMSG(0,(TEXT( Interrupt
[单片机]