(1)内部中断—watdog

原创 2013年12月05日 15:39:58

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



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

OpenGLes学习之路(一)————opengles内部执行顺序(1)

公认OpenGLes是入门很难,难在哪里,我认为,初学时过分追求对于OpenGLes本身API的学习,而忽视了其只是作为一种3D渲染的手段工具,就像我们学汽车一样,我们首先是会开了汽车,然后逐渐了解汽...

watdog(3)

把watdog一直开着,当来一个watdog 中断,打印一句话,当灯亮/灯灭。 ************************************************************...

Linux学习资料—内部资料

  • 2008-10-07 13:35
  • 415KB
  • 下载

3G技术手册—华为内部版

  • 2010-05-14 10:27
  • 3.70MB
  • 下载

Java—内部类(一)

内部类定义:就是将类的定义放在另一个类的内部。

黑马程序员————引用型变量的形式参数和返回值,权限修饰符,内部类

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一.形式参数和返回值         形式参数:基本数据类型和引用数据类型   &...
  • lgplf
  • lgplf
  • 2015-06-04 23:50
  • 483
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)