专题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

转载于:https://www.cnblogs.com/free-1122/p/11452037.html

第二季-专题9--代码搬移不可少相关推荐

  1. 【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )

    文章目录 一. ARM 启动流程 1. 各种类型开发板启动流程 ( 1 ) 2440 开发板启动流程简介 ( ① Nand Flash 拷贝 4 KB -> SRAM 垫脚石 | ② PC 指向 ...

  2. 学习 ARM 系列 -- FS2410 开发板上 Nand Flash 到内存的代码搬移

    一.目的    通过将 Nand Flash 前 4K 代码搬移到 SDRAM 中,了解如何初始化并使用 ARM 的内存,    为编写 ARM bootloader 和搬移内核到内存作准备. 二.代 ...

  3. fs2410开发板搭建网站服务器,学习 ARM 系列 -- FS2410 开发板上 Nand Flash 到内存的代码搬移...

    一.目的 前面做过一个实验,搬移 Nand Flash 里的前 4k 代码到内存指定位置,这其实是把 SRAM 从 0x40000000 开始的 4K 代码复制到 SDRAM 的指定位置,并没有涉及到 ...

  4. F28335 学习系列一——FLASH 搬移到 RAM 运行实现方法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! F283 ...

  5. 重构改善既有代码设计--重构手法11:Move Field (搬移字段)

    你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段.        动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系 ...

  6. PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性

    思维导图 索引: Ø Move Method(搬移函数) Ø Move Field (搬移值域) Ø Extract Class (提炼类) Ø Inline Class (将类内联化,就是把当前的类 ...

  7. 火星人敏捷开发1001问(第二季)-陈勇-专题视频课程

    火星人敏捷开发1001问(第二季)-17497人已学习 课程介绍         此课程为敏捷开发的课程,聚焦于敏捷开发中似是而非的各种问题.每个问题都会有分析与解决的环节,从而令学员不但得到可行的答 ...

  8. 跟着王进老师学开发C#篇第二季:面向对象-王进-专题视频课程

    跟着王进老师学开发C#篇第二季:面向对象-9471人已学习 课程介绍         面向对象的思想在现在程序开发中非常重要,很多刚入门的程序员没有真正理解面向对象的思想而被挡在在软件开发的门外,本次 ...

  9. Python可以这样学(第二季:tkinter案例精选)-董付国-专题视频课程

    Python可以这样学(第二季:tkinter案例精选)-3592人已学习 课程介绍         董付国老师系列教材<Python程序设计基础>(ISBN:9787302410584) ...

  10. 点不到的按钮表白代码_DNF心动表白季第二季上线 表白也需要浪漫+运气

    DNF心动表白季第二季时间从2019年的5月9号到5月23号结束,玩家在活动期间每日登录可以获得3个.在推荐地下城中击杀怪物可以获得,地下城过关各账号每日最多可以获得30个.获得数量于每日06点初始化 ...

最新文章

  1. 2010中国城市GDP排名
  2. 45. GameProject9+输入检测
  3. python3的数据类型的有序无序
  4. 计算机组成测试题目及答案,计算机组成原理期中测试试卷一(含题目和答案)
  5. python unicode error_关于GAE中运行python出现unicode decode error
  6. zabbix常用key和自定义key的讲解
  7. shell脚本执行命令错误处理
  8. 微服务启动顺序_微服务框架Demo.MicroServer运行手册
  9. java sqlite 多线程并发_Android中Sqlite数据库多线程并发问题
  10. java中13%(-3)_Java面试题汇总(十三)《算法分析及手写代码661-675》
  11. 洛谷 P1313 计算系数 Label:杨辉三角形 多项式计算
  12. extjs4.1单击treepanel节点收缩叶子节点
  13. 高仿微信聊天界面长按弹框样式
  14. 面向对象-java控制台计算器简单实现[50行]
  15. Netty学习4—NIO服务端报错 远程主机强迫关闭了一个现有的连接
  16. javascript学习资料汇集
  17. 谈朋友圈——周围的朋友们
  18. 概率论——随机变量和的期望
  19. 创业公司的抗争,共享单车的合并
  20. 用Python写一个最简单的计时秒表

热门文章

  1. Doc2EDAG: An End-to-End Document-level Framework for Chinese Financial Event Extraction
  2. Flutter实战之底部导航栏 BottomNavigation
  3. 听阿里P8聊完这个 SpringBoot 的项目,瞬间觉得自己白学了…
  4. Android中如何实现无缝切码流
  5. 程序员,30岁前最好都找大厂,好好做技术
  6. FFmpeg总结(十四)FFmpeg如何解析直播点播m3u8
  7. python基本数据类型 整数、小数、字符串、布尔、空值、列表、元组、字典、集合、bytes
  8. php 代码格式化命令,go fmt命令——格式化代码文件
  9. java 动态转换器_非常简单的Java动态转换
  10. mssql 查询无记录时sum_SQL常见面试题查询