预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共14页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

ARM的SWI异常中断处理程序设计通过SWI异常中断指令,在用户模式下应用程序可以调用系统模式下的代码。在实时操作系统中,通常使用SWI异常中断为用户应用程序提供系统功能的调用。 一.SWI异常中断处理程序的实现 在SWI指令中包括一个24位的立即数(中断调用号),该立即数指示了用户要请求的特定功能,所以需要在SWI的异常中断中读取这个中断号,然后根据中断号,来调用相应的处理程序。 处理过程:(1)SWI中断处理程序为汇编程序,用于确定SWI指令中的24位的立即数。 (2)SWI异常中断处理的功能服务程序是具体实现SWI的各个功能,既可用汇编语言,也可用C语言编程。1.用汇编语言编写的SWI异常中断处理程序 由于SWI异常中断处理程序属于底层操作,所以必须用汇编语言编写。如下例所示:SWI异常中断处理程序中的 blswi_service_func指令用于调用第2步的SWI异常中断处理的功能服务程序,此函数用于实现SWI的各个功能。 汇编语言编写的第1步SWI异常中断处理程序2.SWI异常中断处理的中断服务程序 (用汇编写的) 为了具体实现SWI的各个功能,须编写SWI异常中断处理的功能服务程序,它既可以是汇编语言又可以是C语言。用C语言编写的第2步SWI异常中断处理的中断服务程序。用C语言编写的第2步SWI异常中断处理的中断服务程序的函数原型如下: voidswi_service_func(unsignedintnumber,unsignedint*reg) 注:参数number是SWI的中断调用号,是利用从中断处理函数获得的中断调用号。 参数reg是SWI异常中断第1步中中断处理程序传递来的数据栈指针。 在第1步的SWI异常中断处理程序调用第2步中断处理程序的操作如下: movr1,sp;根据ATPCS将r1中的值作为第二参数传入 blswi_service_func;调用功能服务函数,中断调用号通 过r0传入,参数通过r1传入 第2步SWI异常中断处理的中断服务程序代码如下: voidswi_service_func(unsignedintnumber,unsigedint*reg) { unsignedintreg1,reg2,reg3,reg4; //获取SWI传入的参数 reg1=reg[0]; reg2=reg[1]; reg3=reg[2]; reg4=reg[3]; switch(number) { case0: //dosomething break; 二、SWI异常中断调用 1.特权模式下调用SWI 执行SWI指令后,系统将会把CPSR寄存器的内容保存在寄存器SPSR_svc中,将返回地址保存在寄存器LR_svc中。如果在执行的SWI指令已经在svc模式下时,这时SPSR_svc和LR_svc中的内容就会被破坏。因此在特权模式下调用SWI功能(执行SWI指令),就必须将原始的寄存器SPSR_svc和LR_svc的值保存在数据栈中。二、SWI异常中断调用 2.从应用程序中调用SWI (1)使用汇编指令调用特定的SWI功能 (2)用C程序调用特定的SWI功能 注意:汇编指令调用特定的SWI功能只要将所需的参数按ATPCS要求放置在相应的寄存器中,然后在指令SWI中指定相应24位立即数即可。 例:用汇编指令实现SWI的调用。SWI中断处理程序所需的参数放在寄存器r0中,然后调用功能号0x0的SWI功能调用。 MOVr0,#100 SWI0x0二、SWI异常中断调用 2.从应用程序中调用SWI C程序中调用特定的SWI功能比汇编语言调用要复杂一些,因为C语言中调用特定的SWI特定功能需将C程序的子程序调用映射到一个SWI异常中断处理程序。这些被映射的C语言子程序使用编译器伪操作__SWI来声明。该子程序所需的参数和返回的结果放在R0~R3中,则该SWI可以被视为inline,不需要使用子程序调用过程;否则必须告诉编译器通过结构数据类型来返回参数,这时需要使用编译器伪操作_value_in_reg声明该C语言子程序。 例:提供4个SWI功能调用,功能号分别为0x00,0x01,0x02,0x03。其中SWI0x0和SWI0x1使用两个整型的输入参数,并返回一个结果值;SWI0x2使用4个输入参数,并返回一个结果值;SWI0x3使用4个输入参数,并返回4个结果。C程序中调用特定的SWI功能程序代码: /*头文件—swi.h*/ __swi(0)intmultiply_two(int,int); __swi(1)intadd_two(int,int); __swi(2)intadd_multiply_two(int,int,int,int); structfour_results { inta; i