第5 章 中断服务程序设计 中断服务程序(ISR)是嵌入式应用系统获取各种事件的基本手段,而“事件”是实时性问题的讨论基础和时间计算的起点。ISR 的设计质量直接影响到系统的实时性指标和操作系统的工作效率。 只要没有关中断,中断服务程序可以中断任何任务的运行,可将中断服务程序可成比最高优先级(0 级)还高的“任务”。 5.1 中断优先级安排原则 中断源是系统及时获取异步事件的主要手段,其优先级安排原则如下: 紧迫性:触发中断的事件允许耽误的时间越短,设定的中断优先级就越高。 关键性:触发中断的事件越关键(重要),设定的中断优先级就越高。 频繁性:触发中断的事件发生越频繁,设定的中断优先级就越高。 快捷性:ISR 处理越快捷(耗时短),设定的中断优先级就越高。 中断服务程的功能应尽量简单,只要将获取的异步事件通信给关联任务,后续处理由关联任务完成。 5.2 不受操作系统管理的中断服务程序 正常情况下,ISR 应受操作系统的管理,因很多任务是靠 ISR 触发的。 但在两种情况下 ISR 不受操作系统管理:①没有必要;②操作系统没有对该 ISR 进行管理。 实时操作系统uC/OS-Ⅱ移植到 ARM7 体系的CPU 上时,没有对 FIQ 进行处理,即 FIQ是不受操作系统管理的。 选用FIQ 来响应实时性要求最高的高速采样操作是一个有效措施,保护现场的工作量很小(FIQ 专有的8 个寄存器不需要保护)。 在工程模板的系统启动文件Startup.s 中,已经把汇编代码部分处理好,用户只需要用C语言编写快速中断服务函数 FIQ_Exception()即可,不需考虑保护现场和恢复现场的问题。 程序: Startup.s 中队 FIQ 的处理 Reset ;异常向量表 LDR PC,ResetAddr ;跳转到复位入口地址 LDR PC,UndefinedAddr LDR PC,SWI_Addr ;跳转到软件中断入口地址 LDR PC,PrefetchAddr LDR PC,DataAbortAddr DCD 0xb9205f80 LDR PC,[PC,#-0xff0] ;跳转到向量中断入口地址(向量中断控制器) LDR PC,FIQ_Addr ;跳转到快速中断入口地址 ResetAddr DCD ResetInit UndefinedAddr DCD Undefined SWI_Addr DCD SoftwareInterrupt PrefetchAddr DCD PrefetchAbort Nouse DCD 0 IRQ_Addr DCD 0 FIQ_Addr DCD FIQ_Handler ;快速中断服务程序入口地址 FIQ_Handler ;快速中断服务程序 STMFD SP!,{R0-R3,LR} ;保护现场 HL FIQ_Exception ;调用C 语言编写的快速...