start.S源码:

.globl _start

_start:

// 硬件相关的设置 

    // Peri port setup 

    ldr r0, =0x70000000

    orr r0, r0, #0x13

    mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)

    

// 关看门狗 

    // 往WTCON(0x7E004000)写0 

    ldr r0, =0x7E004000

    mov r1, #0

    str r1, [r0]

// 重定位 

    adr r0, _start          // 伪指令,取_start的当前地址

    ldr r1, =_start        // _start的链接地址:在连接脚本中划分的地址

    ldr r2, =bss_start   //bss_start的链接地址

    cmp r0, r1             //比较当前地址和链接地址是否相同,即代码是否已经在链接地址处运行

    beq clean_bss      //相等的话直接去清BSS段

copy_loop:               //不相等重定位代码

    ldr r3, [r0], #4       //把r0对应的值给r3,再把r0加4

    str r3, [r1], #4       //把r3的值给r1对应的空间,再把r1加4

    cmp r1, r2            //比较r1和r2,_start地址拷贝到bss_start为止,看代码段有没有拷贝完成

    bne copy_loop    //不相等继续循环

        

// 清bss段 

clean_bss:

    ldr r0, =bss_start  // bss_start的链接地址

    ldr r1, =bss_end   // bss_end的链接地址

    mov r2, #0

clean_loop:

    str r2, [r0], #4

    cmp r0, r1

    bne clean_loop    

    // 设置栈 

    ldr sp, =8*1024

    ldr pc, =main     //跳到链接地址处运行

    //bl main           //依然在原地址处运行

halt:

    b halt    

====================================================================

led.c源码:

void delay()

{

    volatile int i = 0x10000;

    while (i--);

}

volatile int i = 0;

volatile int j = 0x12345678;

volatile int k = 0;

volatile int g;

int main(void)

{

    volatile unsigned long *gpmcon = (volatile unsigned long *)0x7F008820;

    volatile unsigned long *gpmdat = (volatile unsigned long *)0x7F008824;

    

    // gpm0,1,2,3设为输出引脚 

    *gpmcon = 0x1111;

    

    if (k != 0)

        return;

    while (1)

    {

        *gpmdat = i;

        i++;

        if (i == 16)

            i = 0;

        delay();

    }

    return 0;

}

====================================================================

Makefile:


led.bin: start.o led.o

    arm-linux-ld -T leds.lds -o led.elf start.o led.o

    arm-linux-objcopy -O binary led.elf led.bin

    arm-linux-objdump -D led.elf > led.dis

start.o : start.S

    arm-linux-gcc -o start.o start.S -c

led.o : led.c

    arm-linux-gcc -o led.o led.c -c

clean:

    rm *.o led.elf led.bin led.dis -f

====================================================================

leds.lds:

SECTIONS

{

    . = 0x1000;     //链接地址在片内内存4096的位置

    .text : {

        start.o

        * (.text)

    }

            

    .data : {

        * (.data)

    }

    

    bss_start = .;  // 0x1150 

    .bss : {

        * (.bss)

    }

    bss_end  = .;    

}

====================================================================

注意:

         s3c6410启动时自动拷贝nand flash前4页的内容到片内内存执行,而且拷贝时只拷每页中的前2KByte好像是为了兼容2k页的 所有copy2ddr函数中不要把所有数据全部照搬过去,只搬每页的前2k到ddr连接起来 。


关键字:OK6410  裸机  片内内存  重定位代码 引用地址:OK6410裸机片内内存中重定位代码

上一篇:OK6410裸机之DDR片外内存访问
下一篇:OK6410启动分析

推荐阅读

当在S3C6410跑操作系统的时候,我们不太会注意S3C6410的内存使用情况,但是,当我们做裸板测试时,该处理器的8K的片内内存的使用就不得不注意,一旦编写的程序大小超过了片内内存的大小,我们就不能得到正确的结果,究其原因,我们先看一下S3C6410的启动过程。本文引用地址:http://www.eepw.com.cn/article/203124.htm  S3C6410如果选用NANDflash启动,...
自动驾驶汽车的发展面临多种障碍,比如恶劣的天气和公众接受度等,其实还有许多早前未曾预料到的难题也亟待研究人员去解决,像虫子、污垢就是个令人头疼的问题。若这类恼人的虫子落在自动驾驶汽车上,将激光雷达等传感器遮挡后,恐怕情况就变得更严重了。自2017年以来,福特就一直与自动驾驶公司Argo AI开展合作,共同研发自动驾驶汽车。如今,两家公司再...
10月10日,杭州士兰微电子股份有限公司新增一家对外投资企业——上海超丰科技有限公司。图片来源:企查查上海超丰科技有限公司成立于2020年10月10日,注册资本1000万元人民币,经营范围包括半导体科技、电子科技、集成电路科技、仪器仪表科技领域的技术开发、技术转让、技术咨询、技术服务;集成电路芯片设计及服务;半导体分立器件销售;集成电路销售;电...
据移动分析公司Mixpanel称,自9月20日更新发布以来,iOS15的安装率估计已达到19.3%。  Mixpanel根据使用其移动分析SDK的网站和应用的访问量来衡量iOS的安装情况,因此该数据并非官方数据。苹果公司尚未分享iOS15的安装统计数字,上次报告iOS14的安装率是在6月,为85%。  到目前为止,iOS15的安装率似乎仍比iOS14的安装率慢,这可能有几个原因,包括苹...

史海拾趣

问答坊 | AI 解惑

WINCE 中用C#语言,怎么把EXE文件中的ICO图标读出来?

WINCE 中用C#语言,怎么把EXE文件中的ICO图标读出来? 我现在想把EXE中的图标读出来,然后再存存储为PNG的格式. 现在卡在不知道如何读取 EXE中的图标. 之前找到过一个方法,代码如下 using System.Runtime.InteropServices; [DllImport(\"shell32.d ...…

查看全部问答∨

【拜求】单片机与AT24C64通信

单片机与AT24C64通信,我搞了好几天还是没能控制它的数据读写,没办法,只好求助于各位,24C64是I2C串行总线接口,有64K空间的EEPROM,单片机是STC89S52,我用程序模拟I2C协议,于24C64通信,请教高手,能不能把单片机与AT24C64之间的读写时序解释 ...…

查看全部问答∨

PPC模拟器和PC通信出问题 救命

同样的程序代码  用VB编写能实现连接通信   而用EVB却一直出现连接问题    另外   Pocket PC模拟器 和PC通信是不是要先用ActiveSync这东西现同步起来才能通信? 这个东西学了2个月... 困扰了2个月... ...…

查看全部问答∨

wince平台下线程开启数量的上线

在wince平台下,进程分配线程有没有上限,线程是运行的基本单位,但是总的来说系统的资源和运行时间都是有限制的。不指导在wince平台下,一个进程最大能够产生多少个子线程。在windows平台呢,在net托管框架下,也是有限制的吗,上限是多少?…

查看全部问答∨

ST地域技术支持要跟上啊

在ST和NXP之间选择 我推荐负责人ST的,但是负责人说,ST最先搞cortex,相对成熟,但是ST在成都技术支持不如NXP。周立功在成都有分公司,有个团队在做。而ST只有利源一个增值代理商 遂选择NXP,尽管我用了1年多的STM32,但是还是被否决了…

查看全部问答∨

多串口ARM

那个人用过 CANTUS128这个芯片,我目前正在搞,有人用过一起讨论一下。这个芯片串口8个,时钟100M,集成了各种功能模块很好用, …

查看全部问答∨

C64x 网络培训(一)

  是否大家在DSP产品开发的过程中,会出现以下问题;内核处理能力不能满足应用要求;数据处理时的数据存储问题;单个芯片不能满足整个系统的要求,需要多个芯片之间做协同处理,但是系统之间的互联不够灵活。 通过此次培训课程,会让您了解 ...…

查看全部问答∨

出售最后一个全新OK2440 开发板

http://item.taobao.com/item.htm?id=4010659248 淘宝链接 http://item.taobao.com/item.htm?id=4010659248 清仓处理, 256M nand 64M SDRAM 3.5 寸LCD 300RMB ,不议价! 本人是卖开发板的,信誉良好,快四钻了。也是一线wince/android ...…

查看全部问答∨

两轮自动平衡小车

本设计采用瑞萨RL78/G14作为核心控制板,结合角速度传感器和电机驱动电路共同完成。…

查看全部问答∨

晒WEBENCH设计的过程+ 8至12V电源输入 5V2A输出

本来这个软件就是为了方便设计的,下面我来试一下8至12V电源输入 5V2A输出的大致过程,其中有很多细节,需要自己慢慢揣摩吧,毕竟这功能是强大的好啦,上图 …

查看全部问答∨
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved