Chapter fourteen ARM概述(2)
来源:互联网 发布:最新软件开发方法 编辑:程序博客网 时间:2024/06/01 12:37
14.1.4 GCC开发环境搭建
一、安装GCC编译器
1)下载交叉编译工具包 arm-linux-gcc-4.5.1-v6-vfp-20120301,一般友善之臂提供的百度云里有。
2)使用samba,Vmtools等工具将交叉编译工具拷贝到虚拟机中,我这里是通过Vmtools进行的文件共享。
tar-zxvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz –C /opt
4 )一路cd到bin目录下, 然后输入pwd并复制路径
5 )vi ~/.bashrca,在文档的最后添加一句,export PATH=$PATH:(4.4步中复制的路径)
6)source ~/.bashrc ,重新刷新。
7)检验:arm-linux-gcc -v
二、U-boot的烧写
step one:编译u-boot
1)解压u-boot
2)解压进入该目录后,make distclean(清理)
3)vi makefile,修改CROSSC_CPMPILE为arm编译器
4)make ..._config进行配置,make -j2 (2个线程来编译)
5)生成u-boot.bin文件和u-boot.map文件
step two:将u--boot烧写到nandflash(永久保存)
1.将开关拨到SD卡启动
2.将u-boot下载到DDR,loadb 0x40008000 ,让串口准备接受,然后用超级终端进行发送Kermit协议。 当然,这个可以使用tftp试试。
3.将nandflash进行擦除操作:nand erase 0x0 0x100000 (擦除为0,擦除了1M)
4.将DDR的内容写到nandflash:nand write 0x40008000 0x0 0x100000(从0x40008000写,写到0x0中去,写1M)
5.将开关从SD启动拨到nand启动
14.1.5 异常处理机制
一、ARM异常处理
1)回顾ARM的七种工作模式:suv,undef,swi,user,irq,fiq,abort。回顾寄存器:CPSR状态寄存器;R15--》pc指针;R14--》LR链接寄存器;R13--》SP。R0-R8为通用寄存器,R9-R12可用。其中r0--r4:随意变换,r4--r10:可以保存现场。
2)如果CPU发生异常,它会怎么办?
Soc有一个协处理器,我们可以利用协处理器把异常向量表映射到DDR的某个地址,如0x2000 0000。然后CPU就可以通过协处理器对映射地址进行操作。什么是异常向量表?它就是当模式发生异常时,CPU会自动进行查询的一张 表,通过表中的地址,就可以进行相应的处理。
3)如何映射异常向量表到DDR中?
打开Cotex—A8的技术手册,查询协处理器Secure or Nonsense Vector Base后知道,
MCR p15 ,0,r0,c12, c0, 0---->重新映射异常向量表
4)未定义异常程序分析
模拟步骤方案一:需要超级终端软件
1)loadb 0x41000000(异常处理程序)
2)loadb 0x40008000(模拟异常程序)
3)go 0x40008000(执行excep)
1)loadb 0x41000000(异常处理程序)
2)loadb 0x40008000(模拟异常程序)
3)go 0x40008000(执行excep)
4)看控制台信息
模拟步骤二:SD卡启动
用WindowsForDDR直接下载到SD卡,放到板子上启动运行。
arm端:
part1: makefile
arm.bin:start.o
arm-linux-ld -Ttext=0xd0020010 $^ -o temp //地址必须为此地址,否则无法用SD直接读取
arm-linux-objcopy -O binary temp $@
%.o:%.s
arm-linux-gcc -c $< -o $@
%.o:%.c
arm-linux-gcc -c $< -o $@
.PHONY: clean
clean:
rm *.o *.bin temp
arm-linux-ld -Ttext=0xd0020010 $^ -o temp //地址必须为此地址,否则无法用SD直接读取
arm-linux-objcopy -O binary temp $@
%.o:%.s
arm-linux-gcc -c $< -o $@
%.o:%.c
arm-linux-gcc -c $< -o $@
.PHONY: clean
clean:
rm *.o *.bin temp
part2 start.s
@声明全局
.global _start
_start:
@重新映射异常向量表到0x4100 0000
ldr r0, =0x41000000
mcr p15, 0, r0, c12, c0, 0
_start:
@重新映射异常向量表到0x4100 0000
ldr r0, =0x41000000
mcr p15, 0, r0, c12, c0, 0
@除了r0之外,其他的都是固定程序
@发生了异常,CPU会自动跳转到异常向量表地址0x4100 0000
ldr r0,=str_svc
@发生了异常,CPU会自动跳转到异常向量表地址0x4100 0000
ldr r0,=str_svc
@取cpsr的后5位,也就是将状态位M0--M4放在r1中
mrs r1,cpsr
and r1 ,r1 ,#0x1f
@将pc先保存到lr,然后指向printf的地址,进行打印目前的svc模式信息
mov lr,pc
ldr pc,=0x3ff13e54
mrs r1,cpsr
and r1 ,r1 ,#0x1f
@将pc先保存到lr,然后指向printf的地址,进行打印目前的svc模式信息
mov lr,pc
ldr pc,=0x3ff13e54
@模拟未定义指令
.word 0x77777777
.word 0x77777777
@打印处理完异常程序回来后的测试语句
ldr r0,=str_test
mov lr,pc
ldr pc,=0x3ff13e54
str_svc:
.asciz "Svc mode 0x%x\n"
str_test:
.asciz "Im back\n"
loop:
b loop
ldr r0,=str_test
mov lr,pc
ldr pc,=0x3ff13e54
str_svc:
.asciz "Svc mode 0x%x\n"
str_test:
.asciz "Im back\n"
loop:
b loop
异常端:
part1 与上类似
part2 start.s
.global _start
_start:
@这里开始地址为0x41000000
b reset
b undef
b swi
b abt_pre
b abt_dat
b reserved
b irq
b fiq
reset:
undef:
@模式发生变化,需要初始化栈指针
ldr sp,=0x42000000
@从svc模式切换到undef,需要保存现场
stmfd sp!, {r1-r12, lr}
ldr r0,=undef_str
mrs r1,cpsr @取cpsr到r1
mov lr,pc
and r1 ,r1 , #0x1f @取cpsr的后5位
ldr pc,=0x3ff13e54
ldmfd sp!, {r1-r12, pc}^
@和下面两条语句效果一样
@ldmfd sp! ,{ r1-r12, lr}
@movs pc,lr
@ldmfd sp! ,{ r1-r12, lr}
@movs pc,lr
swi:
abt_pre:
abt_dat:
reserved:
irq:
fiq:
undef_str:
.asciz " hello define mode cpsr = 0x%x\n"
loop:
b loop
5)SWI异常程序分析
b loop
5)SWI异常程序分析
a。swi的作用:将user模式-----》svc模式
b。例子
arm端
.global _start
_start:
_start:
@重新映射异常向量表到0x4100 0000
ldr r0, =0x41000000
mcr p15, 0, r0, c12, c0, 0
@printf current mode--svc mode
ldr r0, =str_curt_mod
mrs r1 ,cpsr
and r1, r1, #0x1f
mov lr, sp
ldr sp, =0x3ff13e54
@set current mode as user
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0x10
msr cpsr, r0
@change user mode to svc mode
swi 0x99
@Now,coming bake to user mode
ldr sp ,=0x42000000
ldr r0,=str_user
mov lr,pc
ldr pc, =0x3ff13e54
str_curt_mod:
.asciz "current mode:svc mode"
str_user:
.asciz "user mode 0x%x\n"
loop:
b loop
except端
.global _start
_start:
@这里开始地址为0x41000000
b reset
b undef
b swi
b abt_pre
b abt_dat
b reserved
b irq
b fiq
reset:
undef:
@初始化栈指针
ldr sp,=0x42000000
stmfd sp!, {r1-r12, lr}
ldr r0,=undef_str
mrs r1,cpsr @取cpsr到r1
mov lr,pc
and r1 ,r1 , #0x1f @取cpsr的后5位
ldr pc,=0x3ff13e54
@ldmfd sp!, {r1-r12, pc}^,和下面两条语句效果一样
ldmfd sp! ,{ r1-r12, lr}
movs pc,lr
.global _start
_start:
@这里开始地址为0x41000000
b reset
b undef
b swi
b abt_pre
b abt_dat
b reserved
b irq
b fiq
reset:
undef:
@初始化栈指针
ldr sp,=0x42000000
stmfd sp!, {r1-r12, lr}
ldr r0,=undef_str
mrs r1,cpsr @取cpsr到r1
mov lr,pc
and r1 ,r1 , #0x1f @取cpsr的后5位
ldr pc,=0x3ff13e54
@ldmfd sp!, {r1-r12, pc}^,和下面两条语句效果一样
ldmfd sp! ,{ r1-r12, lr}
movs pc,lr
swi:
@初始化栈指针
ldr sp,=0x42000000
@ secure the scene
stmfd sp!, {r1-r12, lr}
@get current mode and save it to r1
ldr r0,=swi_str
mrs r1,cpsr @取cpsr到r1
mov lr,pc
and r1 ,r1 , #0x1f @取cpsr的后5位
@get the number and save it to r2 :0x99
sub r3, lr,#4
ldr r2, [r3]
ldr r3, =0xffffff
and r2, r2, r3
@printf
ldr pc,=0x3ff13e54
@recover the scene
@ldmfd sp!, {r1-r12, pc}^,和下面两条语句效果一样
ldmfd sp! ,{ r1-r12, lr}
movs pc,lr
abt_pre:
abt_dat:
reserved:
irq:
fiq:
undef_str:
.asciz " hello define mode cpsr = 0x%x\n"
swi_str:
.asciz "hello, this swi mode , cpsr= 0x%x\n"
loop:
b loop
阅读全文
0 0
- Chapter fourteen ARM概述(2)
- Chapter fourteen ARM概述(1)
- Chapter fourteen ARM概述(3)
- 【Cortex-M0】2 ARM概述
- 老查的ARM学习笔记:chapter-2(linux总线设备驱动详解)
- Chapter 1 Java概述
- Chapter 1. C++概述
- Chapter 01 - JAVA概述
- ARM概述
- ARM概述
- ARM概述
- ARM概述
- ARM概述
- 《C++捷径教程》读书笔记--Chapter 2--C++概述
- Chapter 1 操作系统概述 上(现代操作系统笔记)
- Chapter 1 操作系统概述 下(现代操作系统笔记)
- ARM基础知识教程(四):ARM存储系统概述
- 暑假Fourteen宝岛地图
- 数据库存储通讯录,实现“增删改查”
- Selenium学习笔记20-Table工具类
- [置顶] Glide 使用问题汇总———2017/06/12更新
- Spark如何在一个SparkContext中提交多个任务
- ACM (7) 街区最短路径问题
- Chapter fourteen ARM概述(2)
- 简易在线留言板(中)——树洞留言版
- [Linux] du-查看文件夹大小-并按大小进行排序
- jdbc连接数据库
- HttpClient的使用-爬虫(一)
- 漫谈操作系统6 -- 内存管理
- eclipse clean的作用
- python 计算IP掩码长度
- html中的<span>标签用法