| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> ARM-Linux开发(一)- 如和实现跳转到SDRAM -> 正文阅读 |
|
[系统运维]ARM-Linux开发(一)- 如和实现跳转到SDRAM |
S3C2440启动可以从Nor flash 或者Nand flash 启动,从Nor启动可以直接在Nor(0地址开始)运行,NAND 启动会先将前4K代码copy到片上的SRAM,然后从0地址开始运行。 不管哪种启动方式,最终都需要将代码拷贝到SDRAM中去,因为一般完整的boot loader都比较大,片上SRAM是放不下的。 实现步骤: 1. 必要的初始化 ??????? 1) 关看狗 ??????? 2) 初始化SDRAM ??????? ??????? 在此过程中很有可能会用到LDR指令,注意,如果编译时链接地址设置位SDRAM的地址,也就是copy到SDRAM中运行的起始地址,那么这里就不能使用LDR,而要用adr(l). 这里说下LDR 和ADR的区别: LDR: 与连接地址相关的绝对地址,比如链接起始地址位0x30000000, 那么用LDR 读到的地址就是0x3xxxxxxx的,而这个时候运行的代码实际上是在片上SRAM或者NOR,都是0地址开始的4K范围内,用LDR已读就读到千里之外去了。注意这里用LDR后,虽然编译后反汇编看到的是PC 偏移,但是这个PC实际上是与链接地址相关的 ???????300000?5c:?? ?e59f0054 ?? ?ldr?? ?r0, [pc, #84]??? ADR(L): ADR 就加载运行地址相关的地址,也就是基于当前运行位置的偏移地址,比如 ADR R0, lable, 这个时候读到的label 的地址就是基于当前运行位置PC偏移后的地址,而不与链接地址相关,如下,它会被转换成ADD指令来读取。 ????????3000004c:?? ?e28f201c ?? ?add?? ?r2, pc, #28 2. copy 代码到SDRAM 3. 跳转到SDRAM执行 ??????? 如果链接地址是从0开始,那么跳转时,只需要加上实际SDRAM运行的起始地址,然后赋值给PC指针即可。 ???????? ldr sp, =0x31000000 ldr r1, main_ofs ldr r0, =_start add lr, r0, r1 add lr, lr, #0x30000000 mov r0, #0 mov pc, lr main_ofs: .long main - _start |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 9:46:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |