arm b bl 地址无关码_ARM_异常和中断

news/2024/7/5 3:20:28

7a15ca39861e9e177a369507f5276b25.png

ARM_异常和中断

问题1.中断向量表为于存储器的什么位置?

ARM7系列,除ARM720T可以放高端地址,ARM9或更高都放高端地址上。

2.FIQ或IRQ异常返回指令是什么?

答案见下面。。。。

3.什么类型的异常优先级最高?

复位(Reset)

4.什么指令可以放在中断向量表?

①B 指令(优点:操作方便;缺点:范围PC正负32MB) 为什么BL不可以?

②MOV (优点4G范围内不受地址范围,但是受合法立即数的限制)

③LDR 不受空间限制,不受立即数限制,但它是伪指令,编译器自动转换为

LDR PC,[PC,#offset] 缺点offset的范围是 正负4095

5.FIQ的什么特点使得它处理的速度比IRQ快?(面试题)

①FIQ向量位于向量表的最末端,不需执行跳转指令,可以往后直接执行ISR

②FIQ有5个的私有寄存器(r8_fiq到r12_fiq),异常处理时不需要考虑保护及异常处理返回时的恢复

6.在嵌套的中断处理程序中,如何确保LR没被破坏?

①模式的切换

一、异常处理

二、异常返回指令

1.MOVS PC,LR 当PC作为目的寄存器时,S 表示pc给lr的同时,恢复SPSR_<MODE>到CPSR

2.从SWI(管理模式)和undef异常返回:MOVS PC,LR

3.从FIQ, IQR和预取异常(prefect abort)返回:subs pc, lr, #4

4.从数据异常(Data Abort)返回:SUBS PC, LR, #8

5.如果LR之前被压栈的话使用LDM “^”: LDMFD SP ! , {PC}^

三、异常的优先级

1.先理解下中断的优先级(嵌套。。。)高优先级可以中断低优先级的;

1.异常在当前指令执行完成之后才被响应。

2.多个异常可以在同一时间产生

3. 当高优先和低优先级同时出现异常时:异常指定了优先级和固定的服务顺序。(Reset最高,Undefined 最低)

四、向量表指令 B MOV LDR

五、异常处理中的工作

1.与异常发生相关的模式改变意味着所调用的异常处理程序至少访问:

①私有的SP_<mode>(堆指针)

②私有的LR_<mode>(链接结存器)

③私有的SPSR_<mode>(备份程序状态寄存器)

④在FIQ异常处理中,另有5个私有的通用寄存器(r

8_fiq - r12_fiq)

⑤其他寄存器是所有模式共用的。

2.异常处理程序必须确保其他的寄存器在退出前恢复到原来的状态

3.这可以通过将任何正在使用的寄存器的内容保存在堆栈中,并在返回前恢复来实现。

六、中断处理

1.ARM 有2级外部中断FIQ和IRQ;

①什么是外部中断?外部中断一般是由计算机外设发出的中断请求,外部中断是可以屏蔽的中断,即可以利用中断控制器可以屏蔽这些外部设备的中断请求。从内核的角度,nFIQ和nIRQ(2根中断线);从硅片的角度

②SFR(特殊功能寄存器)适用于管理外设,有地址

③通用寄存器,实现通用的目的,无地址可言

2.

3.注意:通常中断处理程序总是应该包含清除中断的代码。

七、FIQ和IRQ

1.当多个中断产生时,CPU优先处理FIQ

2.处理FIQ时禁止IRQ,知道FIQ处理完成;

3.可以有多个FIQ中断源,但是考虑到系统性能应避免嵌套。

八、C语言中的简单中断处理程序

1.在C中可以在函数定义时使用关键词“__irq”(只能IDE编译环境中,armcc)

2.程序退出使用正确的返回指令(修正pc = lr – 4 并从spsr恢复cpsr)

3.启动代码,写好了堆栈的分配(1097行)

九、中断处理函数的3大特点

1.所有的中断不能显示调用,必须中断触发,被动执行

2.中断处理函数,不能传参(外设中断,swp不是外设触发的)

3.外设中断不能有返回值

十、中断重新使能的问题

1.当另外一个中断抢先当前中断,如果程序员使用下边特殊的步骤来防止系统状态丢失,中断可以嵌套

①保存IRQ状态的LR(LR_irq)

②保存IRQ状态的SPSR(SPSR_IRQ)

2.当中断可重入时(不可重入就是中断不能被打破),在中断处理程序中使用“BL”必须特别小心,如果第2个中断产生,BL调用的返回值(LR_irq)可能被冲掉,子程序将错误的返回,导致无限循环。解决方法:在使用”BL”之前改变模式(通常使用sys系统模式LR_usr)来避免LR_irq被冲掉。。。。

3.处理程序结束后,必须切换回IRQ模式,同时禁止中断(来避免在恢复SPSR_irq到一个临时的寄存器中后被冲掉)

十一、软中断

1.用户主动调用SWI

2.SWI调用

1.汇编中SWI的调用使用“SWI中断号”实现; 例如: SWI 0x12

2.小心在汇编中如果SWI调用时处于Supervisor模式将会冲掉LR_SVC(管理模式下的LR)。

解决方法:在SWI调用之前对LR_svc压栈保护。(因为不能预知什么IRQ会发生)

3.传递参数到SWIs,C语言中,关键字“__swi”允许最多4个参数,使用r0-r3来传递,注意:因为SWI调用将切换到supervisor模式,所以不能采用堆栈来传递参数(因为模式切换,SP也伴随切换,即就找不到之前模式下栈的位置)

函数的申明:__swi(0x123456) void hander(unsigned op, char *s);

函数的调用:hander(0x4, “hello”);

4.存取SWI号

1.ARM核中不提供直接传递软中断(SWI)号到处理程序的机制。

2.SWI处理程序必须定位SWI指令,并提取SWI指令中的常数域(软中断号)

3.为此,SWI处理程序必须确定SWI调用在哪一种状态(ARM/Thumb)

4.通过ARM状态下LR-4,Thumb状态下LR-2,来确定SWI指令的位置。

C/C++和汇编的混合编程

一、优化级别

a) –O0

b) –O1

c) –O2

二、自动优化

a) C中关键字,Volatitle的作用:①告诉编译器不要对其进行优化②优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

三、内嵌函数inline(执行时间没有调用时间长时??)

a) 内嵌函数通过删除子函数调用的开销来提高性能。

四、C/C++和汇编的混合编程

五、为什么在ARM里要竟可能的避免用除法?

a) 因为除法,需要调用库,空间和效率上双重浪费。

六、参数传递时,被推荐的最大量是多少?

a) r0-r3 共4个,多余的参数使用堆栈。(需要额外的指令和慢速操作的存储)

七、__packed属性(按字节对齐)

我创建了一个关于嵌入式的学习群,大家可以进群一起交流,学习。

嵌入式-物联网学习交流&【955648875】

相关资料 :

ARM之中断GIC分析

ARM体系结构A53新特性

ARM-RTC时钟的运用

Arm引领智能物联新时代


http://lihuaxi.xjx100.cn/news/271551.html

相关文章

php把数组组成xml,php 怎么将数组转xml的函数?

弑天下123456789101112131415161718192021222324252627282930313233343536373839404142<?phpclass A2Xml { private $version 1.0; private $encoding UTF-8; private $root root; private $xml null; function __construct() { $this->xml new X…

用AI还原李焕英老照片动态影像

视学算法报道转载自&#xff1a;机器之心编辑&#xff1a;张倩「从我有记忆开始&#xff0c;妈妈就是中年妇女的模样&#xff0c;所以我会忘记&#xff0c;她也曾是花季少女。」春节档上映的《你好&#xff0c;李焕英》让不少人在影院哭得稀里哗啦&#xff0c;它戳中了每个人心…

Android 中文API (94) —— MediaController

前言 本章内容是android.widget.MediaController&#xff0c;版本为Android 2.3 r1&#xff0c;翻译来自"唐明"&#xff0c;再次感谢"唐明" &#xff01;期待你一起参与Android 中文API的翻译&#xff0c;联系我over140gmail.com。 声明 欢迎转载&#xf…

Hadoop学习之Mapreduce执行过程详解

一、MapReduce执行过程 MapReduce运行时&#xff0c;首先通过Map读取HDFS中的数据&#xff0c;然后经过拆分&#xff0c;将每个文件中的每行数据分拆成键值对&#xff0c;最后输出作为Reduce的输入&#xff0c;大体执行流程如下图所示&#xff1a; 整个流程图具体来说&#xff…

造成机器学习项目失败的7个原因

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达机器学习是一个伟大的工具&#xff0c;它正在改变我们的世界。在许多伟大的应用中&#xff0c;机器学习&#xff0c;尤其是深度学习&#xff0c;已经证明比传统方法优越得…

JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!

点击上方“方志朋”&#xff0c;选择“设为星标”回复”666“获取新整理的面试文章作者&#xff1a;fredalhttps://fredal.xin/java-error-checkCPU磁盘内存GC问题网络线上故障主要会包括cpu、磁盘、内存以及网络问题&#xff0c;而大多数故障可能会包含不止一个层面的问题&…

设置缓存的大小

目录 1 CacheManager级别 2 Cache级别 3 大小衡量 4 配置大小示例 缓存大小的限制可以设置在CacheManager上&#xff0c;也可以设置在单个的Cache上。我们可以设置缓存使用内存的大小&#xff0c;也可以设置缓存使用磁盘的大小&#xff0c;但是使用堆内存的大小…

python解压zip文件_Python中最快解压zip文件的方法

假设现在的上下文(LCTT 译注&#xff1a;context&#xff0c;计算机术语&#xff0c;此处意为业务情景)是这样的&#xff1a;一个 zip 文件被上传到一个Web 服务中&#xff0c;然后 Python 需要解压这个 zip 文件然后分析和处理其中的每个文件。这个特殊的应用查看每个文件各自…