ARM基础学习-SWI异常中断处理

最新更新时间:2021-11-26来源: eefocus关键字:ARM  SWI  异常中断处理 手机看文章 扫描二维码
随时随地手机看文章

在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;

关键字:ARM  SWI  异常中断处理 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic555707.html

上一篇:ARM基础学习-存储管理单元MMU
下一篇:ARM基础学习-异常中断处理

推荐阅读

收购截止期将近,英伟达ARM提交长文:ARM市场影响力被夸大
据报道,一直以来,美国图形芯片巨头英伟达计划以400亿美元的代价,从日本软银集团手中买下英国芯片设计巨头ARM,但是这一交易的进展并不顺利。  最初收购交易的截止期限是今年三月份,眼看着就要错过。而这一交易在美国、英国、欧洲等地都遭到了反垄断监管部门的审核,监管担心,交易将会削弱市场竞争。  按照最初计划,软银集团、英伟达和ARM计划在2020年9月以后的一年半时间内完成交易。  科技市场研究公司高德纳的分析师阿兰·普雷斯利(Alan Priestley)和一些股市投资人认为,一国和多个国家监管机构否决这一交易的可能性很大。  不过,英伟达和ARM并未坐以待毙。  本周一,交易双方提交给英国“竞争市场局”的一份长达28页的文件
发表于 2022-01-12
嵌入式4412开发板QT5.7编译安装到arm
平台:iTOP-4412精英版+4.3寸屏有学东西写文章的习惯,毕竟都是入门,在这里记录一下安装过程,虽然可能短期内用不到了,但以后用到的时候可以作为参考。********************************华丽的分割线***************************1、从网上下载所有最新的源码Ubuntu16.0 amd64版本第一个,这个就不要源码了,直接安装就好了QT5.7.0,万能的度娘一找就找到了(官网下载),注意是下载源码,linux版本的源码。ARM-NONE-LINUX-GNUEABI-GCC4.8,arm-***以后就这么写了,名字太长,这个选择源码或者选择编译好的都可以,有一个博客(http
发表于 2022-01-11
嵌入式4412开发板QT5.7编译安装到<font color='red'>arm</font>
ARM Cortex-A9 (tiny 4412)
要求移植linux增加系统调用并烧写至开发板详细步骤一、搭建linux编译环境1、GCC 编译器的安装:tar xzvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz  -C/arm-linux-gcc -v //查看GCC版本2、gedit ~/.bashrcexport PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin3、reboot -p 重启4、cp -f tiny4412_android_defconfig .configmake -->编译5、安装libz.soyum install zlib.i6866、挂载红帽
发表于 2022-01-11
<font color='red'>ARM</font> Cortex-A9 (tiny 4412)
ARM开发板实现双系统引导的一种方法
前言  本文所用的uboot代码为迅为官方提供,开发板是迅为iTOP-4412开发板(不带设备树)。  首先,我们确定一下系统启动的流程:首先启动uboot,uboot启动内核并挂载rootfs(根文件系统),内核启动完成且rootfs工作完成后,挂载emmc上的文件系统,操作系统正式开始工作。(读者要弄懂根文件系统和普通文件系统的区别与联系,网上资料很多,本文不作赘述。)  本文实现的双系统引导,都是基于Linux的,即两个系统使用同一个内核、同一个根文件系统,只是emmc上的文件系统有所不同。第一个系统是一个最小Linux系统,第二个系统是一个带Qt/E的Linux系统。uboot启动后会从emmc的特定位置读取一定长度的字符串
发表于 2022-01-11
<font color='red'>ARM</font>开发板实现双系统引导的一种方法
英伟达回应与ARM合并案:外界夸大宣传 禁止收购后果严重
Nvidia在2020年9月份宣布斥资400亿美元收购ARM公司,由于NVIDIA股价大涨,这笔交易实际价值超过500亿美元,也就是3000多亿人民币,然而一年多过去,收购ARM的希望越来越小,反对声在加大。有可能对这起收购案带来致命一击的是美国FTC的介入,去年初宣布起诉NVIDIA收购ARM一事之后,最近FTC又发了长文剖析了这笔交易,数落了NVIDIA收购ARM的120宗罪过,解释为什么不能允许他们收购ARM公司。简单来说,FTC认为NVIDIA收购ARM之后会影响市场竞争,会用ARM来打击对手,这同时也会损害ARM生态,而让ARM保持中立的话,可以让大家相安无事,谁也控制不了谁。对于这一番指控,NVIDIA前不久也发表49
发表于 2022-01-11
ARM汇编语言学习笔记(一)介绍
的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。简单的来说,就是通过特定的语言直接操作计算机中的寄存器等,来直接控制计算机的运行。二、ARM汇编由于对于特定的机器架构需要采用不同的汇编语言,对于嵌入式语言的开发者来说,ARM无疑是比重最大的那一块。学习ARM架构,有助于我们从机器底层来理解计算机的每一条指令的运行方式,中断的进入和出,出栈入栈的操作。三、为什么要学习ARM汇编我在CJSON的里面写到,只需要了解CJSON的函数的使用和怎么解析和构造JSON函数就可以啦。我们可以简单的将其视为一个黑盒子,有一个进口和一个出口。里面是什么和我们无关。但是,这里我认为并不一样,keil和一些编译工具帮助我们做了大量
发表于 2022-01-10
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved