zoukankan      html  css  js  c++  java
  • 第二季-专题9--代码搬移不可少

    专题9--代码搬移不可少

    1. ARM启动流程回顾

    假设都是从nand flash启动的

    2440:从nand flash启动需要垫脚石(SRAM)的作用,垫脚石只有4kb。u-boot的大小一般就有100kb左右,垫脚石先将nand flash中的4kb内容拷贝其中,之火垫脚石将多余的内存拷贝到内存中。

    6410:它一上电就会在SROM中运行bootloader0,将nand flash中的8kb拷贝到内存(SRAM)中,利用这8kb的内存将剩余的内存全部拷贝。

    210;它本身也有烧写好的bootloader0(在SROM中),拷入垫脚石之后,先将nand flash中的内容拷贝到IRAM中(96kb),当96kb大小不够时,再将所有的内容拷贝到内存中。

    2440、6410和210的垫脚石都不能满足bootloader的大小,需要代码的搬移。

    1. 代码搬移编程

    (1)起点:SRAM(0地址处开始),也就是垫脚石。

    我们自己编写的bootloader大小不到4KB,在第一步会全部搬移进入SRAM垫脚石之中。实际上这样可以直接就在垫脚石中运行,但是为了显示过程,我们还是将它放在内存中运行。

    垫脚石的起始地址在不同开发板之间是不同的。

    2440:0x0000000

    6410:0x0C000000

    210:0xD0020000

    (2)终点

    连接地址:

    在我们使用链接器脚本的时候,我们会在开头(以2440为例)加上. = 0x30000000,使用反汇编指令,我们会开到在_start之前就显示这个地址。当程序执行到这一步的时候,就会将这个值传给PC指针。

    绝对跳转:

             直接修改PC指针这种跳转。

    相对跳转:

             b和bl用的就是间接跳转,不是讲跳转的地址直接赋值给pc指针,而是将跳转之间的差值加给pc指针。

    (3)程序:

    reset:

             bl set_svc

             bl disable_watchdog

             bl disable_interrupt

             bl disable_mmu

             bl init_clock

             bl init_sdram

             bl copy_to_ram

             bl light_led

    copy_to_ram:

             ldr r0, =0x0   @起点

             ldr r1, =0x30008000    @终点

             add r3, r0, #1024*4   @假设复制4Kb的内容

    copy_loop:               @循环语句

             ldr r2, [r0], #4    @读出来

             str r2, [r1], #4    @写进去

             cmp r0, r3       @对比

             bne copy_loop    @没完成复制的话重新循环

             mov pc, lr

  • 相关阅读:
    【项目】项目27
    【项目】项目26
    【项目】项目25
    【项目】项目24
    【项目】项目23
    【项目】项目22
    【项目】项目21
    【项目】项目20
    【项目】项目19
    【项目】项目18【项目】项目18
  • 原文地址:https://www.cnblogs.com/free-1122/p/11452037.html
Copyright © 2011-2022 走看看