arm b bl 地址无关码_ARM_异常和中断
![](/assets/blank.gif)
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引领智能物联新时代
arm b bl 地址无关码_ARM_异常和中断相关推荐
- arm b bl 地址无关码_ARM汇编语言入门(六)
Part 6:条件状态和分支 在探讨CPSR时我们已经接触了条件状态.我们通过跳转(分支)或者一些只有满足特定条件才执行的指令来控制程序在运行时的执行流.通过CPSR寄存器中的特定bit位来表示条件状 ...
- arm b bl 地址无关码_32位和64位下的arm_pwn初探
32位和64位下的arm_pwn初探 前言: pwn的学习之路一直在进行,今天看了arm_pwn,搞环境就搞了半天,琢磨工具使用到做题,这里总结下,希望能帮助到大家,少走一点弯路,后期有机会继续更新. ...
- arm b bl 地址无关码_海边同居有甜有虐,又一部BL日剧来了
关注公众号日剧部屋,每天都有日剧看 最近BL剧特别多,<到了30岁还是处男,就会变成魔法师>很多人都在苦苦等着每周的更新吧,本季还有一部BL剧,Kis-My-Ft2两位成员玉森裕太和宫田俊 ...
- 地址有关码和地址无关码
几个地址的说明: (cpu看来) (程序员看来) 1.运行地址<---->链接地址 2.加载地址<---->存储地址 他们对应等价,只是从不同的角度说. 进一步阐述 ...
- arm workbench ide 用户指南_ARM_异常和中断
ARM_异常和中断 问题1.中断向量表为于存储器的什么位置? ARM7系列,除ARM720T可以放高端地址,ARM9或更高都放高端地址上. 2.FIQ或IRQ异常返回指令是什么? 答案见下面.... ...
- ARM裸机篇(五)——异常和中断
linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...
- 移植 u-boot-2020.07 到 iTOP-4412(二)地址相关码 boot
文章目录 前言 一.重新编写脚本 1. init_env.sh 2. build.sh 3. sdflush.sh 二.spl 启动流程 1. start.S 2. board_init_f() 2. ...
- 【ARM】Tiny4412裸板编程之异常
00. 目录 文章目录 00. 目录 01. 开发环境 02. 概述 03. ARM处理器模式 04. 异常类型 05. 异常处理 5.1 异常处理伪代码 5.2 复位异常 5.3 未定义指令异常 5 ...
- Cortex-M3 动态加载一(地址无关代码实现)
这篇文章是自己疑惑究竟地址无关性是如何实现,然后查看汇编和CPU指令手册,最后分析解除自己疑惑的,高手不要鄙视,哈哈. 编译C代码时候需要制定--acps/ropi选项,如下例子: 1 void Sy ...
最新文章
- Android入门(十七)Android多线程
- Python os.path模块的使用
- 怎样查看MySQL是否区分大小写
- 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
- 使用netsh interface ip set 命令实现快速切换IP地址及DNS地址
- 十日均线算法oracle,十日均线买卖法则,简单管用!
- if函数写并列条件 sql_excel if函数同时满足多个条件:明白这2点,就能随心所欲!...
- c语言.jpg图片转成数组_如何把pdf图片转成jpg?快看高手私藏实用的技巧
- 解决LaTeX中的\pdfendlink ended up in different nesting level than \pdfstartlink.问题
- Windows防火墙添加禁用规则——以禁用微信为例
- 一文openpose姿态估计
- gpu的单位表示_现代企业中的GPU计算!
- IDEA 支持vue
- ABCD过桥题的规律
- 如何完美解决Sqoop导入导出MySQL数据错位问题
- MATLAB2013实现图像处理GUI界面设计
- 10.前端JavaScript之【函数】【全局变量与局部变量】
- 《财富》评论:盛大新游戏——陈天桥欲打造中国迪斯尼
- sql server数据库怎样收缩数据库?
- aix服务器查看文件编码格式,Linux stat命令和AIX istat命令 (查看文件修改时间)(示例代码)...
热门文章
- AI 是否拥有意识?从意识的定义说起
- PyTorch核心开发者灵魂发问:我们怎么越来越像Julia了?
- 求捐“一杯奶茶钱”,西北大学真成“最穷211”?
- 太胖就会变秃,这回真的有依据了!日本学者发现肥胖会诱导毛囊衰竭 | Nature...
- 大规模神经网络的训练优化入门
- 脑洞大开!Adobe等新研究把「自拍」变「他拍」,魔幻修图效果感人
- VMware中Ubuntu系统不全屏问题
- springboot在centos下安装环境+部署war包
- Zookeeper源码分析:Follower角色初始化
- celery中间件:broker