关闭

(1)内部中断—watdog

标签: 异常
363人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:122147次
    • 积分:4223
    • 等级:
    • 排名:第7181名
    • 原创:302篇
    • 转载:50篇
    • 译文:2篇
    • 评论:7条
    最新评论