历史上的今天
返回首页

历史上的今天

今天是:2024年10月11日(星期五)

正在发生

2018年10月11日 | OK6410裸机片内内存中重定位代码

2018-10-11 来源:eefocus

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连接起来 。


推荐阅读

史海拾趣

CBM_America_Corporation公司的发展小趣事

随着环保意识的提高,CBM_America_Corporation开始关注自身的社会责任和可持续发展。公司积极采用环保材料和生产工艺,减少了对环境的污染。同时,CBM还参与了多项公益事业,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,还吸引了更多消费者的关注和支持。在可持续发展的道路上,CBM不断前行,为电子行业的绿色发展树立了榜样。

这些故事虽然是虚构的,但它们反映了电子行业中公司可能经历的一些典型情况和挑战。您可以根据这些故事框架进行进一步的创作和修改,以适应您特定的需求和背景。

Califia Lighting公司的发展小趣事

Califia Lighting深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、包装等各个环节都进行严格把关。同时,公司还注重客户服务和售后支持,及时解决客户在使用过程中遇到的问题,赢得了客户的信赖和好评。

Efficient Power Conversion公司的发展小趣事

随着EPC公司在氮化镓技术领域的领先地位日益稳固,一些竞争对手开始试图通过不正当手段获取其技术。为了维护自身的合法权益,EPC公司积极寻求法律途径来保护其专利。2023年,EPC公司向美国联邦法院和美国国际贸易委员会提起诉讼,指控英诺赛科(珠海)科技有限公司及其子公司侵犯了其基础专利组合中的四项专利。这一诉讼引起了行业的广泛关注,也再次证明了EPC公司对专利保护的重视。

BVLED公司的发展小趣事

随着公司规模的扩大和业务范围的拓展,BVLED公司开始注重产业链的整合和成本控制。公司通过与上游供应商建立长期稳定的合作关系,确保了原材料的稳定供应和质量保障;同时,公司还加强了对生产过程的监控和管理,通过优化生产流程和降低能耗等方式降低了生产成本。这些措施使得公司在激烈的市场竞争中保持了较强的竞争力。

ELECTRONIC ASSEMBLY公司的发展小趣事

在竞争激烈的电子组装市场中,一家名为“精准电子组装”的公司凭借其精准的市场定位脱颖而出。公司深入研究行业趋势和客户需求,准确把握市场脉搏,专注于为高端客户提供定制化的电子组装服务。通过不断挖掘客户需求、提升服务水平,精准电子组装在高端市场上占据了一席之地,实现了快速发展。

DZUS公司的发展小趣事

在XX世纪XX年代,DZUS公司的创始人John Doe看到了航空工业对高质量紧固件的迫切需求。他凭借自己在机械工程领域的深厚造诣,设计并制造了第一款DZUS快拆紧固件。这款产品在航空工业中迅速获得了认可,为DZUS公司的发展奠定了坚实的基础。John Doe的创业精神和对品质的坚持,成为了DZUS公司的核心价值观。

问答坊 | AI 解惑

一种新型高电压充电方式

目前对于UPS、EPS、逆变电源等的大功率产品,开发设计者设计的蓄电池逆变电压往往很高。面对由很多蓄电池串联而成的高电压蓄电池组,设计者对蓄电池组的充电往往以市电经过变压器升压后整流或市电整流后经高频电子BOOST升压的传统方式来实现。前者 ...…

查看全部问答>

【讨论】“嵌入式裸奔”、“嵌入式OS”、“OS”各适合什么场合?

如果你只能用的心: A)如果你手上是4位MCU? B)如果你手上是8位MCU? C)如果你手上是16位MCU? D)如果你手上是外设不多的32位MCU? E)如果你手上是外设丰富的32位MCU? F)如果你手上是外设极其丰富的64位MCU? 你要做什么产品: a)如果你 ...…

查看全部问答>

DSP分类

怎么从名称熵推知是TI还ADI的 DSP ?…

查看全部问答>

电子变压器

求助: 交流220V转交流110V 20A 的电子变压器型号,哪儿有售? 或上说电子变压器的电路图 谢谢!…

查看全部问答>

74LS08 74LS30中文资料

74LS08    74LS30中文资料…

查看全部问答>

方向识别,高手指导一下!

我在做一个东西,想找一个成本比较的识别方法,来实现识别五米开外的物体。原想用红外源发射接收的但是找了市面上找了都只有开关式的红外,高手指导一下,多谢了~~…

查看全部问答>

两路CMOS摄像头同时输入到TI DM6446 的方法请教讨论

HI,大家好,想在TI DM6446平台上,同时输入两路CMOS摄像头的方法,请教下可否用以下方法实现: 硬件上,两个CMOS数据输入到一个二选一的高速转换器的输入口中,输入直接到 DM6446 的视频输入口 软件上,在RAM里面 建立两个 视频流的区域,即A区和B区,程序 ...…

查看全部问答>

EVC的模拟器能否和PC串口上的GPRS模块进行通信?

EVC的模拟器能否和PC串口上的GPRS模块进行通信? 有人做过类似模拟器和PC串口上的设备进行通信的吗?…

查看全部问答>

.net下,如何删除gdi对象?

Bitmap bmp = new Bitmap(\"\\\\pics\\\\a.jpg\"); IntPtr hBitmap = bmp.GetHbitmap(); pictureBox1.Image = System.Drawing.Image.FromHbitmap(hBitmap); 如果不及时删除hBitmap 所指向的GDI对象,调用次数多了,内存会溢出。 msdn中的例 ...…

查看全部问答>