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

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

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中断使能。

本文件SWIs位于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中,返回值也

1、中断请求:中断事件一旦发生或者中断条件一旦构成,中断源提交“申请报告”,与请求CPU暂时放下目前的工作而转为中断源作为专项服务

2、中断屏蔽:虽然中断源提交了“申请报告”,但是,是否得到CPU的响应,还要取决于“申请报告”是否能够通过2道或者3道“关卡”(中断屏蔽)送达CPU(相应的中断屏蔽位等于1,为关卡放行;反之相应的中断屏蔽位等于0,为关卡禁止通行);

3、中断响应:如果一路放行,则CPU响应中断后,将被打断的工作断点记录下来(把断点地址保护到堆栈),挂起“不再受理其他申请报告牌”(清除全局中断标志位GIE=0),跳转到中断服务子程序

4、保护现场:在处理新任务时可能破坏原有的工作现场,所以需要对工作现场和工作环境进行适当保护;

5、调查中断源:检查“申请报告”是由哪个中断源提交的,以便作出有针对性的服务;

6、中断处理:开始对查明的中断源进行有针对性的中断服务;

7、清除标志:在处理完毕相应的任务之后,需要进行撤消登记(清除中断标志),以避免造成重复响应;

8、恢复现场:恢复前面曾经被保护起来的工作现场,以便继续执行被中断的工作;

9、中断返回:将被打断的工作断点找回来(从堆栈中恢复断点地址),并摘下“不再受理其他申请报告牌”(GIE=1),继续执行原先被打断的工作。

中断源初始化和中断源程序是两个不同的概念。中断源初始化是指在系统启动时,对中断控制器和各个设备的中断源进行初始化,包括设置中断源的优先级、中断处理程序的入口地址等。中断源初始化的目的是为了让系统在发生中断时,能够正确地调用相应的中断处理程序,保证系统的正常运行。中断源程序是指中断处理程序,也就是中断响应程序,当系统发生中断时,中断控制器会通过中断向量表找到相应的中断源程序,并跳转到程序入口地址开始执行。中断源程序的功能是处理中断事件,包括保存CPU现场、处理中断请求、恢复CPU现场等 *** 作,最终返回到中断发生前的执行位置,继续执行系统的正常流程。因此中断源初始化和中断源程序是两个不同的概念,中断源初始化是为了确保中断源程序能够正确运行,而中断源程序则是处理中断事件的具体实现。

以上就是关于ARM中的异常中断是如何实现进入中断程序的,比如如何进入...全部的内容,包括:ARM中的异常中断是如何实现进入中断程序的,比如如何进入...、中断服务子程序应至少包括哪些内容、中断源初始化程序与中断服务程序有什么不同,因果关系是怎样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9798011.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存