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进行的文件共享。


3)将文件解压到opt目录下:
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)

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

part2  start.s

@声明全局
.global _start  
_start:

@重新映射异常向量表到0x4100 0000
ldr r0, =0x41000000
mcr p15, 0, r0, c12, c0, 0
@除了r0之外,其他的都是固定程序

@发生了异常,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

@模拟未定义指令
.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

 
异常端:

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

swi:
abt_pre:
abt_dat:
reserved:
irq:
fiq:

undef_str:
.asciz " hello define mode cpsr = 0x%x\n"

loop:
b loop


5)SWI异常程序分析

a。swi的作用:将user模式-----》svc模式
b。例子

arm端
.global _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

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

原创粉丝点击