(1)内部中断—watdog

还有几天的时间,反反复复,借这个机会,重来一下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



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值