还有几天的时间,反反复复,借这个机会,重来一下bootloader,一直以来是一个yihan.
也复习一下,6410的裸版开发。这么些天没有学习,大概一个月的时间,好好整理一下心情,进入工作了!加油啊!
step 1 :set arm cpsr
mrs r0,cpsr #将cpsr中的内容取出来,放在r0中。
bic r0,r0 #0x80取0x80的非,清楚第七位(0-7,也是第八)
msr r0,cpsr #将处理好的数据,放回到cpsr中。
step 2:set Vectored Interrupt Controller(两个VIC其中有64位个中断源,watdog是VIC 0中的26位)
step 3:irq source
*******************************************************************************
vector.s异常处理如下(共七种):
undefine 与swi是在译码阶段发生异常,其它异常发在执行阶段;(取指,译码,执行,访存,回写),而pc指针,总是指向取指的那一条指令。在发生异常的时候,下面的代码是选择跳过发生异常的指令。所以在非undefine与swi时,我们就要sub lr,lr,#4;执行发生错误,下一条指令还在译码,下下条指令才是在取指,减4是为了不跳过正在译码的那条指令。
b reset
b und
b swi
b pre_abt
b data_abt
.word 0x0
b irq
b firq
reset:
und:
mov sp,#0x56000000 //这里申请一个栈,地址0x5600 0000
mov ip,sp //压栈保存上一个模式的现场
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4
//处理异常,打印一句话。在arm中调用一个函数(arm过程调用,归定将参数放在r0-r3寄存器中,过多的参数放在栈中)
ldr r0,=string_und
ldr r1,printf
blx r1 //调用函数
mov sp,#0x5600 0000 //回到之前的模式
ldmdb sp,{fp,sp,pc}^
swi:
mov sp,#0x56000000
mov ip,sp
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4
ldr r0,=string_swi
ldr r1,printf
blx r1
mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
pre_abt:
data_abt:
mov sp,#0x56000000
mov ip,sp
sub lr,lr,#4
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4
ldr r0,=string_pre_abt
ldr r1,printf
blx r1
mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
irq:
mov sp,#0x56000000
mov ip,sp
sub lr,lr,#4
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4
#ldr r0,=0x71200014
#mov r1,#0x4000000
#str r1,[r0]
//当watdog中断一打开,watdog中断一来,就进入vector.s: b irq;执行中断处理程序。进来的第一步就是清 除中断源,这时watdog已经打开。
ldr r0,=0x7120001C
mov r1,#0xffffffff
str r1,[r0]
ldr r0,=string_irq
ldr r1,printf
blx r1
mov sp,#0x56000000
ldmdb sp,{fp,sp,pc}^
firq:
printf:
.word 0x57e11d4c
string_und:
.asciz "hello undefine \n"
.align 2
string_swi:
.asciz "hello swi\n"
.align 2
string_pre_abt:
.asciz "hell data_abt\n"
.align 2
string_irq:
.asciz "hello irq ,wang wang wang\n"
.align 2
*********************************************************************
test.s我们的主程序,最开始就从这里执行起:
#interrupt
mov ip,sp
stmdb sp!,{fp,ip,lr}
sub fp,ip,#4
mrs r0,cpsr
bic r0,r0,#0x80
msr cpsr,r0
#enable
ldr r0,=0x71200010
mov r1,#0x4000000
str r1,[r0]
#select
ldr r0,=0x7120000C
mov r1,#0
str r1,[r0]
#softirq
ldr r0,=0x71200018
mov r1,#0x4000000 //There is one bit of the register for each interrupt source.
str r1,[r0]
//.....进入vector.s处理,watdog中断。
ldr r0,=string
ldr r1,printf
blx r1
sub sp,fp,#8
ldmia sp,{fp,sp,pc}
string:
.asciz "welcome back\n"
.align 2
printf:
.word 0x57e11d4c
*************************************************************************************
makefile:
all:
arm-none-linux-gnueabi-gcc -c vector.s -o vector.o
arm-none-linux-gnueabi-ld -Ttext=0 vector.o -o vetor
arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -O binary vector vector.bin
cp vector.bin /tftpboot/
arm-none-linux-gnueabi-gcc -c test.s -o test.o
arm-none-linux-gnueabi-ld -Ttext=0x51000000 test.o -o test
arm-none-linux-gnueabi-objcopy -Ielf32-littlearm -O binary test test.bin
cp test.bin /tftpboot/
clean:
rm -rf *.o *.bin /tftpboot/*.bin