历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2021年11月26日 | ARM基础学习-SWI异常中断处理

2021-11-26 来源:eefocus

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


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


SWI异常处理程序


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

  

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


.SWI_Handler:

    STMFD sp!,{r0-r12,lr} ;保存寄存器

    LDR r0,[lr,#-4]   ;计算SWI指令地址

    BIC r0,r0,#0xff000000 ;提取指令编码的后24位

    ;

    ; 提取出的中断号放r0寄存器,函数返回

    ;

    LDMFD sp!, {r0-r12,pc}^ ;恢复寄存器


第二级中断处理函数(根据提取的中断向量号,跳转到具体处理函数)却可以使用C语言来完成。因为第一级的中断处理函数已经将中断号提取到寄存器r0中,所以根据AAPCS函数调用规则,可以直接使用BL指令跳转到C语言函数,而且中断向量号作为第一个参数被传递到C函数。



void C_SWI_handler (unsigned number)

{

    switch (number)

     {

      case 0 : /* SWI number 0 code */

      break;

      case 1 : /* SWI number 1 code */

      break;

      ...

      default : /* Unknown SWI - report error */

     }

}


另外,如果需要传递的参数多于1个,那么可以使用堆栈,将堆栈指针作为函数的参数传递给C类型的二级中断处理程序,就可以实现在两级中断之间传递多个参数。


例如:


MOV r1, sp   ;将传递的第二个参数(堆栈指针)放到r1中

BL C_SWI_Handler ;调用C函数


相应的C函数的入口变为:


void C_SWI_handler(unsigned number, unsigned *reg)


在2级中断处理程序,可以通过下面的操作数读取参数,这些参数是在SWI异常中断产生时各寄存器的值,这些寄存器保存在SWI异常中断的数据栈中:


value_in_reg_0 =reg [0];

value_in_reg_1 =reg [1];

value_in_reg_2 =reg [2];

value_in_reg_3= reg [3];


SWI异常中断调用


(1) 在特权模式下调用SWI


比如在中断模式下调用SWI,系统此时已经属于特权模式,这是在调用SWI会破坏SPSR_svc和寄存器LR_svc,所以在调用SWI前保存SPSR_svc和寄存器LR_svc在数据栈中:


STMFD sp!,{r0-r3,r12,lr}


MOV r1,sp;

MRS  r0,spsr;

STMFD sp!,[r0];

...

SWI

...


LDMFD sp!,{r0};

MSR spsr_cf,r0;

LDMFD sp!, {r0-r3,r12,pc}^ ;


(2)应用程序中调用SWI


最简单的是用汇编:


MOV r0,#100;

SWI 0x0;


C语言调用SWI比较复杂,因为这时需要将一个C程序的子程序调用映射到一个SWI异常中断程序,这些被映射的C语言子程序使用编译器伪操作_SWI来声明,如果该子程序需要的参数和返回结果只使用R0~R3寄存器,则该SWI可以编译成inline,不需要使用子程序调用过程,否则编译器需要用数据结构来返回参数,这时需要用伪操作_value_in_reg声明该C语言程序;


需要安装异常中断处理程序到向量表中相对位置;


详细参考ARM体系结构与编程P-272;

推荐阅读

史海拾趣

ELDECO公司的发展小趣事

面对数字化转型的浪潮,ELDECO公司积极拥抱变化,加快数字化转型步伐。公司引入先进的信息技术和大数据分析工具,对生产、销售、服务等各个环节进行数字化改造和升级。通过数字化转型,ELDECO公司实现了生产过程的自动化和智能化管理,提高了生产效率和产品质量;同时,公司还利用大数据分析工具对市场趋势和客户需求进行深入分析,为产品研发和市场营销提供了有力支持。数字化转型的助力使得ELDECO公司在激烈的市场竞争中保持了强劲的发展势头。

请注意,以上故事均为虚构内容,旨在展示电子行业中可能的发展故事。如需了解真实公司的具体发展情况,请查阅相关官方资料或新闻报道。

ABL Aluminum Components公司的发展小趣事

随着全球环保意识的提高,ABL公司开始注重绿色环保和可持续发展。公司研发出了一种环保型铝合金材料,这种材料在生产和使用过程中对环境的影响较小。同时,ABL公司还加大了对生产废料的回收利用力度,降低了生产过程中的资源浪费。通过践行绿色环保理念,ABL公司赢得了社会的广泛认可和支持,为公司的长远发展奠定了坚实基础。

这些故事虽然是以虚构的形式呈现的,但它们基于电子行业中的常见发展路径和趋势,因此具有一定的参考价值。希望这些故事能够满足您的需求。

Future Designs, Inc. (FDI)公司的发展小趣事

随着市场需求的不断变化,FDI不断投入研发,致力于技术创新。他们不仅优化了现有的GUI产品,还将其应用范围扩大到了更多领域,如医疗设备、工业自动化、汽车电子等。同时,FDI还拓展了产品线,推出了光电元件、射频/IF和RFID、编程器、开发系统以及集成电路(IC)等一系列产品。这些创新举措使得FDI在电子行业中的影响力不断扩大,市场份额逐步提升。

DURATOOL公司的发展小趣事

随着全球经济的不断发展,DURATOOL公司意识到单一市场已无法满足其长远发展需求。因此,公司制定了一系列国际化战略,积极开拓海外市场。通过与国外知名企业的合作,DURATOOL公司成功将其产品线扩展到全球多个国家和地区。同时,公司还积极参加国际展会和技术交流活动,提升品牌知名度和影响力。这些举措不仅为DURATOOL公司带来了丰厚的经济回报,也为其在国际市场上树立了良好的企业形象。

成都振芯/国腾(CORPRO)公司的发展小趣事

随着公司的发展,CORPRO在2007年成功并购了成都国星通信有限公司。这次并购为CORPRO带来了卫星导航定位终端产品业务,进一步拓宽了公司的业务范围。成都国星通信有限公司作为国腾电子集团联合中国电子科技集团第十研究所、第三十研究所和电子科技大学共同组建的企业,其卫星导航定位技术为CORPRO的发展注入了新的活力。

ASM公司的发展小趣事

近年来,随着全球半导体市场的竞争加剧和技术的不断更新换代,ASM公司也面临着巨大的挑战。为了保持竞争优势,公司不断调整其战略和业务结构,加大研发力度,推出更具竞争力的新产品。同时,公司还积极寻求与其他企业的合作与共赢,共同推动半导体产业的发展。

问答坊 | AI 解惑

学软件需要学习板

格兰瑞公司作的学习板!比较漂亮哦! http://shop58296062.taobao.com/ http://www.mcu118.com/…

查看全部问答>

数字万用表问题

1.用数字万用表的直流电压档会不会测到交流分量? 2.用数字万用表的交流电压档会不会测到直流分量?…

查看全部问答>

何為"阻抗匹配"?

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 阻抗匹配(Impedance matching)是微波电子学里的一部分,主要用于传输线上,来达至所有高频的微波信号皆能传至负载点的目的,不会有信号反射回来源点,从而提升能源效益。 大体上,阻抗匹配有两 ...…

查看全部问答>

1602不能显示第一个字母

我写了个1602+1302的程序,在调试的时候,总是不能显示第一个字母, 不如说我要写TIME,它就只会显示IME, 中间再写 ,write_com(写命令), 然后后面接着写东西的话,第一个字母也是不显示,但是闪过之后又显示, 然后又不显示,就这样循环, ...…

查看全部问答>

ARM编程-ADS软件

我编完程序,在ADS1.2中编译时,在2410init.s中有2个错误。error 1, unkonwn opcode: AREA Init,CODE,READONLY,程序接下来是ENTRY ,报错,error 2 ,A label was found which was in no AREA,请教大家,这是怎么回事?…

查看全部问答>

Device Emulator 3.0能单独使用吗?还是必须在vs2008下使用?

我装的是vs2005,不晓得能不能使用. 能给个说法吗? 谢谢!…

查看全部问答>

扬创UTU-2440开发版不支持大容量SD卡 请教怎么修改

已打过07年全年补丁.目前能支持2G SD卡.看了网上支持大容量SD卡的文章. [url=http://www.cnblogs.com/wogoyixikexie/archive/2009/05/06/1450503.html][/url] 测试了后连普通的2G SD卡也检测不到. 修改前sdbus.dll大小为49K, 在platform->setti ...…

查看全部问答>

TI Stellaris学习笔记(使用openocd(基于mingw)调试LM3S811开发板环境的搭建)

LM3S811开发板学习笔记---使用openocd(基于mingw)调试LM3S811开发板环境的搭建收到网站的LM3S811开发板,不能放那浪费了。因本人在linux环境下开发的较多,对keil和iar等环境也不是很熟悉而且他们是商业软件,使用D版毕竟不太好,这里就以如何使用 ...…

查看全部问答>

单片机AD采样结果如何以十进制发送到串口调试助手

AD转换计算后数据为unsigned long 型数据   如何通过串口传输到调试助手且为十进制的,高手指点…

查看全部问答>

吉时利3700系列主机应用案例分析——加速老化测试

主要应用案例: 3700系列产品可以用于电源(PC、网络、电信)老化测试。类似的使用案例包括环境应力筛选(ESS)以及高加速应力筛选(HALT)。   应用实例: 典型应用通常包括在大型高温老化试验箱内的大量电源(50~100个)。测量时将对试验箱内 ...…

查看全部问答>