微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 异常中断处理程序

异常中断处理程序

时间:11-21 来源:互联网 点击:

Struct four_results

{

int a;

int b;

int c;

int d;

};

__swi(3) __value_in_regs struct four_results

Many operations (int ,int,int,int);

#include

#include “swi.h”

Unsigned *swi_vec=(unsigned *)0x08;

Unsigned install_Handler(unsigned routine, unsigned *vector)

{

Unsigned vec,old_vec;

Vec=(routine –(unsigned)vector-8)>>2;

If (vec & 0xff000000)

{

print(“Handler greter than 32Mbytes from vector”);

vec=0xea000000 |vec;

Old_vec=*vector;

*vector=vec;

Return(old_vec);

}

Int result1,result2;

Struct fcur_results result3;

Install_Handler ((unsigned) SWI_Handler,swi_vec);

Printf(“result1=mutiply_two (2,4)=%d\n”,

Result1=multiply_two(2,4));

Printf(“result2=mutiply_two (3,6)=%d\n”,

Result2=multiply_two(3,6));

Printf(“add_two(result1,result2 ) =%d\n, add_two(result1,result2));

Printf(‘add_multiply_two(2,4,3,6)=&d\n”,add_multiply_two(2,4,3,6));

Res_3=many_operations(12,4,3,1);

Printf(“res_3.a=&d\n”,res_3.a);

Printf(“res_3.b=&d\n”,res_3.b);

Printf(“res_3.c=&d\n”,res_3.c);

Printf(“res_3.d=&d\n”,res_3.d);

Return 0;

}

;第1 级SWI 异常中断处理程序 SWI_Handler

;SWI_Handler 在前面已有详细介绍

AREA SWI_Area, CODE,PEADONLY

EXPORT SWI_Handler

IMPORT C_SWI_Handler

T_bit EQU 0x2c

SWI_Handler

STMED sp!(r0-r3,r12,lr)

MOV r1,sp

MRS r0,spsr

STMFD sp!,(r0)

TST r0,#T_bit

LDRNEH r0(lr,#-2)

BTCNE r0,r0,#0xff00

LDREQ r0,(lr,#-4)

BICEQ r0,r0,#0xff000000

BL C_SWI_Handler

LDMFD sp!,(r0)

MSR spsr cf,r0

LDMFD sp!,(r0-r3,r12,pc)^

END

Void C_SWI_Handler (int swi_num,int *regs)

{

Switch (swi_num)

{

//对应于SWI 0x0

case 0:

regs[0]=regs[0]*regs[1];

break;

//对应于SWI 0x1

case 1:

regs[0]=regs[0]+ regs[1];

break;

//对应于SWI 0x2

case 2:

regs[0]=(regs[0]*regs[1]) +(regs[2]*regs[3]);

break;

//对应于SWI 0x3

case 3:

{int w,x,y,z;

w=regs[0];

x=regs[1];

y=regs[2];

z=regs[3];

regs[0]=w+x+y+z;

regs[1]=w-x-y-z;

regs[2]=w*x*y*z;

regs[3]=(w+x)*(y-z);

}

Break;

}

}

③ 从应用程序中动态调用 SWI

在有些情况下,直到运行时才能够确定需要调用的 SWI 功能号。这时,有两种

方法处理这种情况。

第 1 种方法是在运行时得到 SWI 功能号,然后构造出相应的 SWI 指令的编码,

把这个指令的编码保存在一个存储器单元中,执行该指令即可。

第 2 种方法使用一个通用的 SWI 异常中断处理程序,将运行时需要调用的 SWI

功能号作为参数传递给该通用的 SWI 异常中断处理程序,通用的 SWI 异常中断

处理程序根据参数值调用相应的 SWI 处理程序完成需要的操作。

在汇编程序中很容易实现第 2 中方法。在执行 SWI 指令之前先将需要调用的 SWI

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top