历史上的今天
今天是:2025年04月18日(星期五)
2020年04月18日 | 【s3c2440】第三课:代码重定位
2020-04-18 来源:eefocus
什么是重定位
简单来说就是把程序从内存的一个位置复制到另一个位置。
重定位的重要性
若s3c2440使用Nand Flash启动,则CPU会将Nand Flash的前4k拷贝到s3c2440 soc内部的SRAM。如果程序没有重定位代码,则只能运行Nand flash前4k的程序。
若s3c2440使用Nor Flash启动,则CPU无法修改Nor Flash内存中的数据。如果程序没有重定位代码,则会因为无法修改全局变量、静态变量的值导致程序运行出错。
链接脚本
链接脚本的格式如下:
SECTIONS
{
sectname start BLICK(align) (NOLOAD) : AT( ldadr )
{ contents } >region :phdr =fill
...
}
主要会用到的格式如下:
SECTIONS
{
.sectname : AT( ldadr )
{ contents }
...
}

具体的代码如下:
SECTIONS
{
. = 0x30000000; #表示relocate addr从0x3000000(sdram的基地址)开始
__code_start = .; #声明一个变量用于重定位,其值等于0x30000000(该变量的地址就是他的值)
. = ALIGN(4); #4字节对齐
.text : #一个标号
{
*(.text) #表示.text里的内容是所有的text段
}
. = ALIGN(4);
.rodata : { *(.rodata) } #只读数据段
. = ALIGN(4);
.data : { *(.data) } #初值不为0的全局变量段
. = ALIGN(4);
__bss_start = .; #声明一个变量用于之后清除bss和comment段,也用于重定位
.bss : { *(.bss) *(.COMMON) } #bss段和comment段
_end = .; #用于清除bss和comment段的变量
}
重定位函数:
void relocate_to_sdram(void)
{
/* 要从lds文件中获得 __code_start, __bss_start
* 然后从0地址把数据复制到__code_start
*/
extern int __code_start, __bss_start; //在lds文件里的变量需要extern声明
volatile unsigned int *dest = (volatile unsigned int *)&__code_start;//变量的地址就是变量的值
volatile unsigned int *end = (volatile unsigned int *)&__bss_start;
volatile unsigned int *src = (volatile unsigned int *)0;
while (dest < end)
{
*dest++ = *src++;//循环复制代码
}
}
void clean_bss(void)
{
/* 要从lds文件中获得 __bss_start, _end
*/
extern int _end, __bss_start;
volatile unsigned int *start = (volatile unsigned int *)&__bss_start;
volatile unsigned int *end = (volatile unsigned int *)&_end;
while (start <= end)
{
*start++ = 0;//循环删除bss段和comment段
}
}
史海拾趣
|
电子竞赛中的30m的频率通讯电路图出来了 https://bbs.eeworld.com.cn/thread-85045-1-1.html 电子大赛之最大功率跟踪 https://bbs.eeworld.com.cn/thread-85046-1-1.html 大赛B题 自制声源 https://bbs.eeworld.com.cn/viewthread.php?tid=85080 ...… 查看全部问答> |
|
一、嵌入式系统的概念 着重理解“嵌入”的概念 主要从三个方面上来理解。 1、从硬件上,将基于CPU的处围器件,整合到CPU芯片内部,比如早期基于X86体系结构 ...… 查看全部问答> |
|
中*美*爱*梯*科*技, .NET外企软件工程师班将于2007年9月10日开课, 开课第一周免费试听, 欢迎大家踊跃报名参加! 中*美*爱*梯*科*技向学员郑重承诺: 百分之百保证就业, 月薪3000——8000, 就不了业者退还全部学费! ...… 查看全部问答> |
|
在淘宝上买的铁牛单片机,本来之前用还好好的,后来不知道烧了一个什么程序,导致每次通电之后继电器都会响一声,同时继电器下面那个绿灯也闪了一下,就一下。。。。烧录程序过程中,继电器就一直响,绿灯也一直闪烁。求高手们解答这是什么问题。? ...… 查看全部问答> |
|
最近由于在研究无线定位算法,所以上传一些资料和大伙共享下,这都是我从各个渠道汇集而来的,希望对大家有用,也希望下载过的朋友留下个脚印。 [ 本帖最后由 wateras1 于 2012-5-3 22:01 编辑 ]… 查看全部问答> |
|
第一个例程我昨天晚上就跑通了。今天看到网友说得好像很不容易,我把我的方法及遇到的问题说下。为以后扫清道路。 首先只要严格按照用户手册去做就应该没有问题。在这里再传下手册。同时自己也MARK一下。 我首先是下bootlaod: 手册上说很明确了 ...… 查看全部问答> |




