s3c2440裸机-代码重定位(1.重定位的引入,为什么要代码重定位)

发布时间:2023-08-09  

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的全局变量/静态变量

rodata段(.rodata):const修饰的全局变量或静态变量

bss段(.bss):存放初始值为0或者未初始化的全局变量/静态变量

commen段(.commen):注释

假设有如下代码编译成一个bin文件。


#include "s3c2440_soc.h"

#include "uart.h"

#include "init.h"


int g_Char = 'A'; //.data

int g_CharB = 'B'; //.data

int g_CharC = 'C'; //.data

int g_CharD = 'D'; //.data



const int g_roval = 'C'; //.rodata

int g_A = 0; //bss

int g_B; //bss


int main(void)

{

uart0_init();

while (1)

{

putchar(g_Char);

g_Char++;         /* nor启动时, 此代码无效,由于nor启动,nor上不可写 */

delay(1000000);

}

return 0;

}

我们把它分别烧录到nand和nor看看有什么不一样?


1.烧录到nor: 我们发现程序一直输出‘AAAAAAA’。


2.烧录到nand: 我们发现程序无任何输出。


我们发现nor启动时, 对g_Char++无效,nand启动程序无任何输出,为什么呢?

我们对程序反汇编看看:

我们发现程序的.text段是从0地址开始的,那么cpu从0地址取指令进行译码、执行。

当从nor启动时,0地址对应nor;当从nand启动时,0地址对应sram,所以无论从nand还是从nor启动cpu都能取指令执行。

但是,我们在来看下.data段,发现.data段的起始地址是0x8474(即g_Char变量的地址为0x8474)。

那么:


1)当把程序烧录进nor, .data段在nor上的某一段区域,由于nor能像内存一样读,

但不能像内存一样直接写,所以对 'g_Char'修改无效。


2)当把程序烧录进nand, .data段在nand的某一区域,nand启动时硬件会自动把nand上的前4K数据copy到SRAM,然后cpu从sram取指令执行。但是.data段的起始地址0x8474>0x1000,超过了4K,cpu没法把.data段也copy到SRAM,所以当访问'g_Char'时,发生了异常(abt数据访问终止,这个异常后面我会在“异常与中断”里面专门讲解)。


那我们再仔细看看反汇编,发现.rodata段和.text段是连续的,但是.rodata段和.data段中间有一段"空洞"。用图形表示更形象,bin文件的内容分布如下所示:


那么我们怎么去掉空洞,让.data段了紧接着.rodata段呢?


用链接脚本(这个下节会讲),但现在直接在编译的时候用 "-Tdata 0x800",这样指定.data段基地址为0x800,这样nand启动时.data就能自动copy到SRAM了。再看下反汇编的.data段:


这时我们烧录程序到nand,从nand启动,发现能输出‘ABCDEFG’...


有人说为什么不吧.data段指向到sdram呢,这样不就能对对全局变量写了?

我做了这个尝试,编译时用"-Tdata 0x30000000", 发现编译出来的bin文件有800多M,为什么有这么大呢?由于我们指定.data段存放在0x30000000(sdram的基地址),这时bin文件的内部结构如下所示:

这个时候根本无法烧录。


通过上面2个例子,现在总结下为什么要代码重定位:

1.nand启动,前4K代码被自动copy到sram,当程序大于4K的时候需要重定位代码到sdram。

2.nor启动, 全局变量在nor上,不能像内存一样直接写该全局变量,那么也需要重定位到sdram。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    看下接线图。(如果需要使用绝对位置控制,即是使用绝对编码器的话还需要通讯,绝对位置控制本身照比相对位置控制更加准确,且不受外界因素影响,缺点是绝对位置编码器不好维护,出现问题后需要手动复位,复位过程较麻烦,而且松下的驱动器为了保证绝对编码器......
    类型、技术和性能指标 单圈绝对值编码器在通电后会返回机械或电气360°范围内的绝对位置信号。电机轴的位置可以立即读取。多圈绝对值编码器不仅具有绝对位置功能,而且能提供360°圈数计数。相比之下,增量编码器提供相对于旋转起点的位置......
    通常需要16位至18位ADC性能,在某些情况下需要22位ADC。有些光学绝对位置编码器也需要高达24位分辨率的高性能ADC。 电机编码器信号链 图6、图7、图8和图9展示了磁性(各向异性磁阻(AMR......
    信号的传输距离。数据的传输格式或者是二进制或者是格雷码,靠SSI控制器的时钟来控制触发,不但可以输出绝对位置,还可以输出增量信号数据(最高脉冲数可达512)。 如果驱动SSI编码器,要求......
    来判断当前的方向)。只有上一次为正且这一次同样为正,距离才是相加的。 4。STM32f1系列定时器16位的问题 我用STM32的定时器3工作于编码器方式,可以正常得到编码器位置,但由于现在只有16位计数,位数......
    所示。 图2.9 绝对值编码器单圈(左)和多圈(右)对比图   2.2.3 磁编码器 磁电式编码器采用磁电式设计,通过磁感应器件、利用磁场的变化来产生和提供转子的绝对位置,利用......
    开发的磁性多圈存储器2无需外部电源即可记录外部磁场的旋转次数。这导致系统尺寸和成本的降低。 对于机器人和协作机器人,电机编码器和关节编码器通常需要16位至18位ADC性能,在某些情况下需要22位ADC。某些光学绝对位置编码器......
    很多欧美伺服厂家都提供这类高分辨率的伺服系统,而国内厂家尚不多见;此外带C、D信号的正余弦编码器的C、D信号经过细分后,还可以提供较高的每转绝对位置信息,比如每转2048个绝对位置,因此带C、D信号的正余弦编码器可以视作一种模拟式的单圈绝对编码器......
    什么是绝对值编码器?特性有哪些?怎样安装编码器呢?;什么是绝对值编码器? 绝对编码器在几圈之后仍然可以提供绝对位置,并且在不使用时重置。多翻译设备包括为用户提供最佳解决方案的内部传输设备。主接......
    的过程中,要保证电机的转子不同,否则会失去转子的相对位置。如果失去了相对位置,老电机则需要用示波器来调整编码器的安装位置,新电机则可以依据电机转子轴上的标志来判断调整编码器的安装位置时,即可......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>