![ADS异常处理课件_第1页](http://file4.renrendoc.com/view6/M00/3D/2B/wKhkGWeLXeCASWsCAABy8acps_c924.jpg)
![ADS异常处理课件_第2页](http://file4.renrendoc.com/view6/M00/3D/2B/wKhkGWeLXeCASWsCAABy8acps_c9242.jpg)
![ADS异常处理课件_第3页](http://file4.renrendoc.com/view6/M00/3D/2B/wKhkGWeLXeCASWsCAABy8acps_c9243.jpg)
![ADS异常处理课件_第4页](http://file4.renrendoc.com/view6/M00/3D/2B/wKhkGWeLXeCASWsCAABy8acps_c9244.jpg)
![ADS异常处理课件_第5页](http://file4.renrendoc.com/view6/M00/3D/2B/wKhkGWeLXeCASWsCAABy8acps_c9245.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
异常处理
ADS异常处理Agenda序言
中断处理
软中断(SWI)处理
其它异常处理ADS异常处理VectorTableVectortablecanbeat
0xFFFF0000onARM720T
andonARM9/10familydevicesFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionReset0x1C0x180x140x100x0C0x080x040x00异常处理当异常产生时,ARMcore:拷贝CPSR到SPSR_<mode>设置适当的CPSR位:改变处理器状态进入ARM状态改变处理器模式进入相应的异常模式设置中断禁止位禁止相应中断(如果需要)保存返回地址到LR_<mode>设置PC位相应的异常向量返回时,异常处理需要:从SPSR_<mode>恢复CPSR从LR_<mode>恢复PCNote:这些操作只能在ARM态执行.ADS异常处理从SWI和Undef异常返回 MOVS
pc,lr从FIQ,IRQ和预取异常(PrefectAbort)返回
SUBS
pc,lr,#4
从数据异常(DataAbort)返回
SUBS
pc,lr,#8
如果LR之前被压栈的话使用LDM“^” LDMFDsp!,{pc}^异常返回:使用一数据处理指令:相应的指令取决于什么样的异常在特权模式不仅仅更新PC,而且拷贝SPSR到CPSR设置CPSR,“S”bitPC做为目的寄存器异常返回指令Seeendofpresentationforbackground
informationontheseinstructionsADS异常处理异常优先级异常在当前指令执行完成之后才被响应多个异常可以在同一时间产生
异常指定了优先级和固定的服务顺序:ResetDataAbortFIQIRQPrefetchAbortSWIUndefinedinstructionADS异常处理向量表指令>32Mbytes<4KbytesLiteralpoolcontainingaddressofUndefHandlerIRQhandlerwithin32MBytesBranch
instructionrangeSWIExceptionhandlerplacedonapplicableaddressboundaryFIQhandlerfollowsvectortable
Undefhandleroutside32MBytes
branchinstructionrange0x00x10000x20000000xFFC0x80x180x300000000xFFFFFFFF0x1C0x4MOVPC,#0x30000000BIRQ_handler0x30008000IRQHandlerSWIHandlerFIQHandlerLDRPC,[PC,#+0xFF0]UndefHandler0x30008000ADS异常处理ARMorThumb?Thumb/ARM混合应用程序ARMCodeARMCodeThumb
CodeFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionResetADS异常处理异常处理中的寄存器使用与异常发生相关的模式改变意味着所调用的异常处理程序至少要访问:私有的SP_<mode>
(stackpointer).私有的LR_<mode>(linkregister).私有的SPSR_<mode>
(savedprogramstatusregister).在FIQ异常处理中,另有5个私有的通用寄存器(r8_fiqtor12_fiq).其它的寄存器是所有模式公用的.异常处理程序必须确保其他的寄存器在退出前恢复到原来的状态这可以通过将任何正在使用的寄存器的内容保存在堆栈中,并在返回前恢复来实现任何所需寄存器的初始化要有应用程序的起始代码来完成,参阅:“EmbeddedSoftwareDevelopment”ADS异常处理Agenda
序言
中断处理
软中断(SWI)处理
其它异常处理ADS异常处理中断处理ARM有两级外部中断FIQ,IRQ.可是大多数的基于ARM的系统有>2个的中断源!因此需要一个中断控制器(通常是地址映射的)来控制中断是怎样传递给ARM的。在许多系统中,一些中断的优先级比其它中断的优先级高,他们要抢先任何正在处理的低优先级中断。Note:通常中断处理程序总是应该包含清除中断源的代码。地址映射中断控制器nIRQnFIQARMMultiple
Peripheral
interrupt
sourcesARM读控制器寄存器并找到IRQ/FIQ中断源ARM写外设寄存器清相应中断源ADS异常处理FIQvsIRQFIQ和IRQ提供了非常基本的优先级级别。在下边两种情况下,FIQs有高于IRQs的优先级:当多个中断产生时,FIQ高于IRQ.处理FIQ时禁止IRQs.IRQs将不会被响应直到FIQ处理完成.FIQs的设计使中断处理尽可能的快.FIQ向量位于中断向量表的最末.为了使中断处理程序可从中断向量处连续执行FIQ模式有5个额外的私有寄存器(r8-r12)中断处理必须保护其使用的非私有寄存器可以有多个FIQ中断源,但是考虑到系统性能应避免嵌套。ADS异常处理C语言简单中断处理程序在C中可以在函数定义时使用关键词“__irq”来写一个简单的中断处理程序.这将导致:函数所有用到的寄存器被保护如果可能,任何远程调用所使用的其他寄存器也被保护函数退出使用正确的返回指令(修正pc=lr-4并从spsr恢复cpsr)__irq仅仅可在armcc中使用.可是被__irq函数调用的子程序可以用tcc编译.确保IRQ的堆栈指针已经设置!ADS异常处理C中断处理示例
__irqvoidIRQHandler(void) {volatileunsignedint*source=(unsignedint*)0x80000000;if(*source==1) //whichinterruptwasit int_handler_1(); //processtheinterrupt //insertchecksforotherinterruptsourceshere *(source+1)=0; //cleartheinterrupt }Outputwithout__irq Outputwith__irq
STMFDsp!,{r4,lr} STMFDsp!,{r0-r4,r12,lr} MOVr4,#0x80000000 MOVr4,#0x80000000 LDRr0,[r4,#0] LDRr0,[r4,#0] CMPr0,#1 CMPr0,#1 BLEQint_handler_1 BLEQint_handler_1 MOVr0,#0 MOVr0,#0dfg STRr0,[r4,#4] STRr0,[r4,#4] LDMFDsp!,{r4,pc} LDMFDsp!,{r0-r4,r12,lr} SUBSpc,lr,#4ADS异常处理C中断处理示例__irqvoidIRQHandler(void){ volatileunsignedint*source=(unsignedint*)0x80000000; if(*source==1) //whichinterruptwasit?
int_handler_1(); //processtheinterrupt //insertchecksforotherinterruptsourceshere *(source+1)=0; //cleartheinterrupt
}
Outputwithout__irq Outputwith__irqSTMFDsp!,{r4,lr}MOVr4,#0x80000000LDRr0,[r4,#0]CMPr0,#1LEQint_handler_1MOVr0,#0STRr0,[r4,#4]LDMFDsp!,{r4,pc}STMFDsp!,{r0-r4,r12,lr}MOVr4,#0x80000000LDRr0,[r4,#0]CMPr0,#1BLEQint_handler_1MOVr0,#0STRr0,[r4,#4]LDMFDsp!,{r0-r4,r12,lr}SUBSpc,lr,#4ADS异常处理中断重新使能的问题当另外一个中断抢先当前中断时,如果程序员使用下边特殊的步骤来防止系统状态丢失,中断是可以嵌套:保存IRQ状态下的LR(LR_irq)保存IRQ状态下的SPSR(SPSR_IRQ)当中断可重入时,在中断处理程序中使用“BL…”必须特别小心:如果第二个中断产生,BL调用的返回地址(LR_irq)可能被冲掉,子程序将错误的返回–导致无限循环!解决方法是在使用“BL…”之前改变模式来避免LR_irq被冲掉通常使用“System”模式(
这时BL使用LR_usr)在处理程序结束,必须:切换回IRQ模式禁止中断(来避免在恢复SPSR_irq到一个临时的寄存器中后它被冲掉).__irq不能用来写可重入中断处理程序必须采用采用下页中汇编代码段来代替。ADS异常处理
C可重入中断示例IRQHandlerSUB lr,lr,#4STMFD sp!,{lr}MRS r14,SPSRSTMFD sp!,{r12,r14}
MOV r12,#IntBaseLDR r12,[r12,#IntSource]
MRS r14,CPSR
BIC r14,r14,#0x9F
ORR r14,r14,#0x1F
MSR CPSR_c,r14
STMFD sp!,{r0-r3,lr}MOV r0,r12BL C_irq_handlerLDMFD sp!,{r0-r3,lr}
MRS r12,CPSR
BIC r12,r12,0x1F
ORR r12,r12,0x92MSR CPSR_c,r12
LDMFD sp!,{r12,r14}MSR SPSR_csxf,r14LDMFD sp!,{PC}^切换到IRQ模式同时禁止IRQ.LR_irq,SPSR_irq和工作寄存器(r12)压栈保护来避免下一次中断发生使它们被冲掉}保存R0-3,LR_user到user栈中,然后调用C子程序,中断源(R0)作为一个参数传入C处理函数。}恢复LR_irq,SPSR_irq和工作寄存器(r12),然后退出中断处理使用修正后的LR}读/清中断控制器中断源{切换到System模式同时使能IRQ{{ADS异常处理Quiz1) 中断向量表位于存储器的什么位置?2) IRQ或FIQ异常的返回指令是什么?3) 什么类型的中断优先级最高?4) 什么指令可以放在中断向量表?5) FIQ的什么特点使得它处理的速度比IRQ快?6) 在嵌套的中断处理程序中,如何确保LR没有被破坏?ADS异常处理Agenda
序言 中断处理软中断(SWI)处理
其它异常处理ADS异常处理软中断SWI0x01向量表用户程序(C/ASM)SWI处理程序(ASM)(可选)SWI处理程序(C)用户程序调用SWISWI中断处理程序包含汇编部分和可选用的C部分ADS异常处理SWI调用汇编中,SWI调用使用“SWI中断号”实现,e.g:
SWI0x24小心在汇编中如果SWI调用时处于Supervisor模式将会冲掉LR_svc.例如:在SWI处理程序中的二级调用解决方法:在SWI调用之前对LR_svc压栈保护
C中,使用关键词“__swi”来定义一个软中断函数.
ForExamplecompilesto:__swi(0x24)voidmy_swi(void);
voidfoo(void){my_swi();} fooSTMFD sp!,{lr}SWI 0x24LDMFD sp!,{pc}ADS异常处理传递参数到SWIs参数传递使用:SWI号(e.g.semi-hosting,使用0x123456(ARM)or0xAB(Thumb)内核寄存器汇编中,简单设置需要的寄存器,然后调用SWI即可:
LDRr1,=Text ;stringpointer
MOVr0,#4 ;SYS_WRITE0
SWI0x123456 ;ARMsemihostingSWI : Text DCB"ARM”,0
C中,关键字“__swi”允许最多
4个参数,使用r0-r3来传递Note:因为SWI调用将切换到supervisor模式,所以不能采用堆栈来传递参数函数声明__swi(0x123456)voidSemihosting(unsignedop,char*s);函数调用
Semihosting(0x4,“ARM”);ADS异常处理ARM内核不提供直接传递软中断(SWI)号到处理程序的机制:SWI处理程序必须定位SWI指令,并提取SWI指令中的常数域为此,SWI处理程序必须确定SWI调用是在哪一种状态(ARM/Thumb).检查SPSR的T-bitSWI指令在ARM状态下在LR-4位置,Thumb状态下在LR-2位置SWI指令按相应的格式译码:ARM态格式:Thumb态格式:存取SWI号283124270
Cond1111SWInumber231587011011111SWInumberADS异常处理存取SWI参数汇编中,存取调用者设置的寄存器即可.在返回之前,修改寄存器的值,传回参数给调用者.传参数给C,通常采用压栈的方法.将参数压栈给调用的函数传递一个指向这些参数的指针也可以通过将参数值写回到适当的堆栈位置,将参数传回ADS异常处理软中断(SWI)处理示例
T_bit EQU0x20
SWI_Handler
STMFDsp!,{r0-r3,r12,lr}
MOVr1,sp
MRSr0,spsr
STMFDsp!,{r0}
TSTr0,#T_bit
LDRNEHr0,[lr,#-2]
BICNEr0,r0,#0xff00
LDREQr0,[lr,#-4]
BICEQr0,r0,#0xff000000
;r0nowcontainsSWInumber
;r1nowcontainspointertoparametersonstack
BLC_SWI_Handler
LDMFDsp!,{r1}
MSRspsr_csxf,r1
LDMFDsp!,{r0-r3,r12,pc}^提取SWI指令的常量域(24-bits:如果从ARM中调用,8-bits:如果从Thumb中调用)恢复寄存器并返回取出spsr并压栈保存寄存器压栈,设置堆栈指针调用C
SWI处理程序{}}{ADS异常处理//Memorymappedregistersvolatileunsignedparallel_output,parallel_input;:voidC_SWI_Handler(unsignednumber,int*param)//r0=SWInumber//r1=pointertoSWIparametersinmemory{
switch(number){ case0:parallel_output=param[0];break; case1:param[0]=parallel_input;break; default:break;}}C
SWI处理程序示例ADS异常处理Agenda
序言
中断处理
软中断(SWI)处理其它异常处理ADS异常处理复位(reset)Reset处理程序执行的动作取决于不同的系统.例如它可以:设置异常向量初始化存储器系统(e.g.MMU/PU)初始化所有需要的模式的堆栈和寄存器
初始化所有C所需的变量初始化所有I/O设备使能中断改变处理器模式或/和状态调用主应用程序详细资料请参考“EmbeddedSoftwareDevelopment”模块.ADS异常处理未定义指令下列情况将引起未定义指令异常:ARM试图执行一真正的未定义指令ARM遇到一协处理器指令,可是系统中的协处理器硬件并不存在ARM遇到一协处理器指令,系统中协处理器硬件也存在,可是ARM不是在超级用户模式(privilegedmode)例如:操作协处理器15(cp15)-ARMcache控制器解决方法:在处理程序中执行软协处理器仿真禁止在非超级用户模式下操作报告错误并退出ADS异常处理预取异常不论异常是发生在ARM还是Thumb状态下,导致预取异常的指令地址在lr-4处.处理方法取决于存储器管理策略有存储器管理的系统(e.g.demandpagedvirtualmemory)修正问题(e.g.enablecorrectmemorypage)返回并重新执行预取异常的指令(SUBSpc,lr,#4)没有存储器管理的系统通常表示一个致命的错误报告错误(如果可能)然后退出ADS异常处理数据异常导致异常的指令的地址在lr-8处.处理方法取决于存储器管理策略有存储器管理的系统(e.g.demanddvirtualmemory)如果使用了MMU,数据异常的地址在MMU的“FaultAddress”寄存器中修正问题(e.g.enablecorrectpageofmemory)返回并重新执行数据异常的指令
SUBSpc,lr,#8没有存储器管理的系统通常表示一个致命的错误报告错误(如果可能)然后退出ADS异常处理TheAbortModel许多ARM存储器存取指令将更新基址寄存器:e.g.LDR r0,[r1,#8]! ;“!”将更新R1如果异常是数据异常,对基址寄存器的影响取决于使用的是哪种ARMcore.“BaseRestoredAbortModel”StrongARM,ARM9andARM10系列支持基址寄存器由ARMcore自动恢复.“BaseUpdatedAbortModel”ARM7TDMI系列支持在异常指令重新执行之前基址寄存器必须由处理程序进行恢复两种模式的例子程序包含在ADSexamples目录下。ADS异常处理Quiz1) 预取和数据异常之间的差别是什么?2) 什么会导致未定义指令异常发生?3) 为什么异常只能在arm状态下返回?4)如何禁止中断?5) 为什么在异常处理程序中,你可能想切换到Thumb状态?ADS异常处理更多信息更多信息清参考:ADSDeveloperGuideSection6:HandlingProcessorExceptionsSection4:InterworkingARMandThumbADSToolsGuideSection3:ARMCompilerReferenceApplicationNote30,“SoftwarePrioritizationofInterrupts”ReferencePeripheralSpecification(ARMDDI0062)JumptolastslideADS异常处理异常返回地址ARM状态:在异常产生的时候内核设置LR_mode=PC-4.处理程序需要调整LR_mode(取决于是哪一个异常发生了),以便返回到正确的地址Thumb状态:处理器根据发生的异常自动修改存在LR_mode中的地址不论异常产生时的状态如何,处理器确保处理程序的ARM返回指令能返回到正确的地址(和正确的状态)ADS异常处理从SWIs和未定义指令返回异常是由指令本身引起的,因此内核在计算LR时的PC值并没有被更新.
ARM
ThumbSWI pc-8
pc-4 ;Exceptiontakenherexxx
pc-4
pc-2 ;lr=nextinstructionyyy pc
pc因此返回指令为:
MOVSpc,lrNote:
表示异常返回后将执行的那条指令ADS异常处理从FIQs和IRQs返回异常在当前指令执行完成后才被响应.因此内核在计算LR时的PC值已被更新.
ARM
Thumbwww pc-12
pc-6 Interruptoccurredduringexecutionxxx
pc-8
pc-4yyy p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《大学物理(上册)》课件-第1章
- 2025-2030全球车辆燃油油位计行业调研及趋势分析报告
- 2025-2030全球电积铜行业调研及趋势分析报告
- 2025年全球及中国直接空气捕获和储存(DACS)行业头部企业市场占有率及排名调研报告
- 2025-2030全球多层土壤传感器行业调研及趋势分析报告
- 2025年全球及中国阻燃塑料薄膜和片材行业头部企业市场占有率及排名调研报告
- 2025-2030全球医用手指康复训练仪行业调研及趋势分析报告
- 2025-2030全球化学谷物熏蒸剂行业调研及趋势分析报告
- 2025年全球及中国智慧教育公共服务平台行业头部企业市场占有率及排名调研报告
- 2025年全球及中国工业胶囊填充设备行业头部企业市场占有率及排名调研报告
- 2025年度院感管理工作计划(后附表格版)
- 励志课件-如何做好本职工作
- 化肥销售工作计划
- 2024浙江华数广电网络股份限公司招聘精英18人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年山东省济南市中考英语试题卷(含答案解析)
- 2024年社区警务规范考试题库
- 2025中考英语作文预测:19个热点话题及范文
- 第10讲 牛顿运动定律的综合应用(一)(讲义)(解析版)-2025年高考物理一轮复习讲练测(新教材新高考)
- 静脉治疗护理技术操作标准(2023版)解读 2
- 2024年全国各地中考试题分类汇编(一):现代文阅读含答案
- GB/T 30306-2024家用和类似用途饮用水处理滤芯
评论
0/150
提交评论