当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > ARM处理器中SWI异常中断处理程序的实现

ARM处理器中SWI异常中断处理程序的实现 时间:2018-09-26      来源:未知

在ARM处理器中,我们常常使用SWI指令来产生一个软中断。软中断指令SWI指令中包含了一个24位的立即数,这个立即数指示了用户请求的特定的SWI功能,即这个立即数表示的是SWI指令所想要触发中断的中断号。SWI指令的格式如图1所示:

图1 SWI指令编码格式

所以,当SWI指令触发了一次异常后进入异常处理的程序时,异常程序必须要从SWI指令中提取出来中断号,即提出出来SWI指令中低24位的值,从而得到用户请求的特定的SWI功能。

通常情况下,SWI异常中断处理函数分为两级,第一级的SWI处理函数用于从SWI指令中提取24位的立即数即中断号,通第一级函数通过汇编语言、内嵌汇编来完成。第二级SWI异常中断处理程序实现各个SWI的具体功能,第二级程序可以是汇编程序,也可以是C程序。

第一级SWI异常处理程序通过LR寄存器内容得到SWI指令地址,LR寄存器中保存的是该SWI指令的下一条指令的地址,并从存储器中得到SWI指令编码,从而提取出来24位中断号。下面的例子显示了提取中断向量号的标准过程。

LDR R0, [LR, #-4]

BIC R0, R0, #0xFF000000

在这个例子中,使用LR-4得到SWI指令的地址,再通过“BIC r0, r0, #0xff000000”指令提取SWI指令中断号。

在第一级中断处理函数中我们已经将中断号提取到寄存器r0中,所以根据AAPCS函数调用规则,可以直接使用BL指令跳转到C语言函数,而且中断向量号作为第一个参数被传递到C函数。例如,汇编中使用了“BL C_SWI_Handler”跳转到C语言的第二级处理函数,在第二级程序中我们可以通过判断SWI指令中的中断号来执行特定的功能,第二级的C语言函数示例如下:

void C_SWI_handler(unsigned number)

{

switch(number)

{

case 0:

//中断号是0的处理程序

break;

case 1:

//中断号是1的处理程序

break;

… …

default:

//未知的中断号处理程序

break;

}

}

上一篇:moc文件分析

下一篇:Shell脚本编程——for循环

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部