ARM裸机部分学习记录

Author: sx                                                          E-mail:[email protected]

资料整理于自己的笔记(有许多的图片和代码块没有添加,后面会慢慢补齐),也有些是博客之类 ,如有侵权,请及时联系我,我会及时删除。因为都是手码的,可能会有些错别字,理解有误的地方请联系我,以便及时修改
-----------------------------------------------------------------------------------------------------------
arm裸机部分:
-----------------------------装驱动部分---------------------------

secureCRT 驱动不用装,只要在设备管理器中看到一下接口就可以了。COM口是可以更改的,更改如图。



-----------------------------
//secrueCTR的设置

协议选择serial
端口选择你需要的端口。
波特率选择115200
VIP: 右边的RTS/CTS必须去掉。


-----------------------------
//fastboot
secureCRT监视串口时,倒数三秒按下回车
输入指令: fastboot
会有如下界面:->



这时间打开windows下CMD窗口:->
找到你存放fastboot的盘(在cmd下盘符是盘符加:eg->d:
dir命令显示目录->
cd进入fastboot目录(可以用tab自动补齐)输入fastboot的命令即可操作:
fastboot devices ->查看当前连接开发板的状态,如下则是正常链接状态。
fastboot reboot -> 重启

-----------------------------
//DNW
DNW安装需要驱动
这个驱动需要自己手动安装,安装步骤,->右击更新驱动程序,手动选择浏览即可。



-----------------------------
//手动点亮LED
step(1) :找到要操作的硬件分析原理
step(2) :查阅手册,按照手册编写代码
GPIO :通用输入输出口,可以编程控制它的工作模式,也可以编程控制他的电压高低。
汇编程序:
ldr :读入寄存器
sub: 将r2的中的数与立即数进行相减,相减完成后的数存放在r2中
cmp: 会进行比较,相等会eq就会=1,不等ne就会=1
mov pc, lr 程序返回TIPs
程序中要注意,写入寄存器的值之间的关系。
这样直接写就是 | 运算




像这样的如果用或运算就是错误的,这里要用与运算



-----------------------------
//反汇编objdump
汇编:assembly
反汇编:disassembly

-----------------------------
//SRAM和重定位
(1)看门狗wcatchdogtimer WCT
在某些特定的场合,程序运行有可能会死机跑飞,这是人有可能又不在边上,那么就需要一个东西去自动复位CPU,这就是看门狗定时器,看门狗定时器就是在某个特定的时间内,需要人为的去喂狗,它接收到喂狗信息以后就会把定时时间清零,就不会去复位。如果它到了一定的时间而我们没有采取喂狗措施,那么它就判断为程序跑飞,他就自动复位。
操作看门狗之类的其实都是操作相应的SFR
-----------------------------
//设置栈
//用汇编来设置栈,实现C语言调用小·
为什么要设置栈呢?
因为C语言运行是需要环境的,(C语言运行时 runtime),C语言中的局部变量都是存放在栈中的,在复位后,ARM的状态自动跳转到SVC,此时应设置一个栈,栈就是需要一段可用的内存,那么在启动阶段DRAM还没被初始化,所以只能用SRAM中的一段内存,S5PV210的手册中,划分了一块1.5k大小的内存,给SVC_STACK所以我们只需要将PC指针写入这快地址即可

-----------------------------
//调用C语言
调用是要加 BL 跳转,否则会产生错误
(tips)-> bad instruction 一般就是不复合汇编语言的规范
-nostdlib ->:编译时不使用系统默认的库函数
分析:为什么汇编可以直接调用C语言
答案就在这里,因为链接到了一起,所以可以直接调用。
C语言运行需要设置栈,所以要在汇编启动阶段设置好栈
这就是基本的启动流程:->

-----------------------------
//Cache
什么是Cache
Cache就是高速缓存,cache又分为2种
(1) iCache
(2)dCache
icache 就是指令cache dcache 就是数据cache
指令在运行是通常先存放在DDR/flash中,然后加载到DRAM中,当CPU,需要时,寄存器从DRAM中加载,但是DRAM虽然容量大而且便宜但是速度非常慢,所以当CPU需要指令时,直接从DRAM中读取的话就会拉低CPU的运行速度,这时就需要一个缓存cache,当CPU需要某些指令时,它会将他周围的指令都缓存进来,当CPU需要的时间,现在这里找,找到后就给寄存器,找不到的话(CPU又跳转到很远的指令肯定找不到)这是cache会自己进行 清楚缓存,重新缓存 ,然后等着下次操作。


利用上面的指令进行开/关icache
技巧:->汇编对某位#(1<<n)
清零: bic 置一:orr
-----------------------------
//重定位
位置无关码:PIC 就是运行地址和链接地址无关的代码
位置有关码:就是运行地址要和链接地址相同的代码


makefile中,给定链接地址就是上图中 -Ttext 这里给定的链接地址0x0,而在DNW中,代码运行的地址是0xd0020010所以这是链接地址和运行地址不同的
三星的启动过程:
先运行BL0,然后加载bootloader中的16k(BL1)到SRAM中运行,BL1(16k的代码会去加载BL2剩下的96-16K代码),BL2初始化DRAM,然后把OS加载到DRAM里,然后开始运行。
Uboot启动:
先运行iROM里的BL0,BL0加载Uboot中前16K(BL1)到SRAM中运行)->开始运行BL1(BL1会去初始化DDR然后把剩下的Uboot加载到DDR里运行,直到启动为止)
运行时地址由什么决定
运行时地址是由运行时的需求决定的比如0xd0020010
链接地址是由什么决定
链接地址是我们预先设定的地址,用-Ttext去指定的
重定位详解:
假设我们代码链接在0xd0024000,而CPU限定这段代码必须在0xd0020010处执行,这样就造成了逻辑地址和物理地址不匹配的问题,那么我们就需要重定位,在0xd0020010处执行一段重定位代码,然后通过这段代码把位置有关码复制到0xd0024000处去执行即可。
链接脚本:
adr:短加载
VVVVVIp:本句加载的是运行地址
ldr:长加载
VVVVVIp :本句加载的是链接地址
(1)加载各个地址
-> adr 加载_start的运行地址
-> ldr 加载_start的链接地址
-> ldr 加载.bss_start的地址用来结束重定位
判断是否相等。相等则不需要重定位
( 2 )不相等
-> 进行重定位,将.bss段上面的代码全部一次拷贝到链接地址,就是在iROM重新写了一份,然后让CPU跳转到这里执行。
(3)清除.bss段
-> ldr加载_bss_start地址 ldr加载_bss_end地址
依次赋值0,完成清除.bss
-----------------------------
//SDRAM引入
SDRAM:动态RAM其实就是内存,和SRAM不同,DRAM需要初始化才能用。
2^10=1K 2^20=1M 2^30=1G 8Bit = 1Byte
210的内存大小为512MB 分为两个部分
0x2000_0000:512MB

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值