ARM中的异常中断是如何实现进入中断程序的,比如如何进入...

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM中的异常中断是如何实现进入中断程序的,比如如何进入...相关的知识,希望对你有一定的参考价值。

ARM中的异常中断是如何实现进入中断程序的,比如如何进入...
swi(0x00) void SwiHandle1(int Handle);其实没有函数体,执行这个语句后就自动把Handle的值赋给了R0,接着执行下面的代码。__swi(0x00)是软件中断,0为软中断指令中的24位立即数,但是通过R0寄存器来传递参数具体的函数体,当然是要在swi的中断处理程序中去找了可以在复位时的异常向量表里面找到swi中断服务程序的入口地址。
SWI 执行的流程是,先进入异常中断向量表,然后跳到向量地址处,接着一小段汇编操作,把功能号读入到一个寄存器中,然后 switch 判断这个功能号是多少,接着跳转到对应的终端服务程序,如果函数有参数,则根据ATPCS规则进行参数的传递;如只有一个参数,则用 R0 来传递,超过4个参数,超出的部分用堆栈来传递。
__swi是ADS编译器的关键字,用它做前缀可以声明一个软中断调用,格式为:
__swi(功能号) 返回值 名称 (参数列表)
功能号:即软中断指令中的24位立即数,软中断号
名 称:即调用软中断时用于描述软中断的函数名称
参 数:软中断函数的参数,根据ATPCS规则,如果软中断函数有不超过4个参数时,通过R0~R3传递,超过4个参数时用堆栈来传递。
__swi(0x00) void SwiHandle1(int Handle)。其中0x00为软中断功能号(软中断号);软中断函数名称为SwiHandle1;只有一个参数,则使用R0来传递;函数没有返回值。紧接着这句代码的是定义了4个宏,分别表示禁能IRQ函数、使能IRQ函数、禁能FIQ函数、使能IFQ函数,其实调用的软中断函数是一样的,只是参数不同而已。例如在用户程序中调用“IRQEnable( );”时,处理器会产生软中断。位于启动代码中的那些是软中断处理函数,当发生软中断时,PC被强制指向0x00000008,这个地址中存放的是软中断异常的处理函数的地址,所以程序会跳转至标号“SoftwareInterrupt ”处执行。SoftwareInterrupt 函数的功能是判断R0的值(R0的值为软中断函数传递过来的参数)是否小于4,如果小于4则跳转至标号“SwiFunction”执行,如果不是则函数返回。SwiFunction函数是一个散转函数,它的功能是根据R0的值跳转至对应的函数处执行,即如果参数为1,则函数会跳转至IRQEnable处执行,将IRQ中断使能。

本文件SWI.s位于ARM Executable Image for LPC2294工程模板中,故不考虑SWI触发前为Thumb态;SWI异常一旦触发,内核硬件完成:
♂ 进入Supervisor模式;
♂ 拷贝CPSR至SPSR_svc
♂ 拷贝异常返回地址至LR_svc
♂ 将0x00000008装入PC
因此,当触发SWI软中断前内核处于Supervisor模式,SPSR_svc、LR_svc中的值将被破坏;
3、SWI指令编码中自带24bit数据作为软中断号(swi_num),因此可通过取SWI指令编码获取软中断号;LDR r0,[lr,#-4]就是这样;
4、SWI_Exception_Function函数一般采用C编码(也可汇编),采用C编码可直接套用switch根据swi_nun软中断号切换,SWI_Exception_Function函数的编制是灵活的,比如可以为带参或不带参函数;
5、一个SWI调用允许带1~4个字型参数和1~4个字型返回值,触发SWI调用时四个参数依次保存在R0~R3中,返回值也......
参考技术A __swi(0x00)是软件中断,0为软中断指令中的24位立即数,但是通过R0寄存器进入Supervisor模式; ♂ 拷贝CPSR至SPSR_svc ♂ 拷贝异常返回地址至LR_svc

arm体系如何对SWI功能

ARM架构对SWI(软件中断)功能没有直接影响。SWI是一种由软件生成的中断,可以通过执行程序中的特定指令(通常称为“SWI”或“SVC”)来触发。SWI功能的实现取决于运行在基于ARM的系统上的操作系统、编译器和其他软件组件。ARM架构提供了用于实现SWI功能的通用寄存器、指令集和内存管理单元。 参考技术A 软中断指令,后面用24位立即数表示软中断类型,cpu遇到这条指令会跳转到中断向量表中软中断指令处,然后根据那条指令跳转到swi
handler,在swi
handler中需要通过LR寄存器,用指令
LDR
R0,[LR,#-4];BIC
R0,R0,#0xff000000来获得那个24位立即数(LR中保存的是SWI
0x123456的下一条指令地址,也就是软中断返回地址),然后做进一步处理
参考技术B 使用汇编
__ASM("SWI 1");
在中断函数里做相应处理
LDR r0 ,[LR,-0x04]
r = 1
参考技术C 使用汇编
__ASM("SWI 1");
在中断函数里做相应处理
LDR r0 ,[LR,-0x04]
r = 1
参考技术D 当别人有冲动的想法时,自己应该保持冷静。因为与人发生口头冲突或武力冲突不是件好事,保持冷静也章显一个人的格局和智慧。

以上是关于ARM中的异常中断是如何实现进入中断程序的,比如如何进入...的主要内容,如果未能解决你的问题,请参考以下文章

S5PV210-arm裸机-异常中的中断实现过程

ARM中断深入分析几点

智能小车37:异常在ARMJAVA硬件里的实现

嵌入式系统的中断处理的主要过程是啥?

ARM的七种工作模式

LINUX-内核-中断分析-中断向量表-arm