在程序员面试和笔试中中断是一个经常被问及的很基础的问题,本文对这次问题做一点简单说明。
中断处理过程:一次完整的中断过程由中断请求、中断响应和中断处理三个阶段组成。
中断处理流程:关中断->保存断电保护现场->判断中断源转到相应的中断服务->开中断->执行相应的中断服务程序(ISR)->关中断->恢复现场恢复断点->开中断->返回断点
中断服务程序的限制
(1)ISR 没有参数并且返回类型为 void。
(2)ISR 不可以重复进入,不要在 ISR内允许中断。
(3)当中断发生时系统会自己响应。用户不要调用它。
(4)ISR 中不要调用任何 C 自定义函数,但是内置的函数没有关系。ISR 中可调用汇编函数。
(5)如果 ISR 内包含嵌入汇编指令,那么由于执行这些指令而影响到的寄存器就需要在执行这些指令之前预先保留,待执行完毕恢复寄存器。 因为Holtek的 C编译器只保存由于C语句造成影响的寄存器。
(6)ISR内不能有可能导致阻塞的语句如:malloc等
(7)避免在ISR中做浮点运算,在许多处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额外的寄存器入栈,有些处理器/编译器就不允许在ISR中做浮点运算。此外,ISR应该是段而有效率的,在ISR中做浮点运算是不明智的。
有了以上知识,下面的题目应该是小Case了
下面的ISR有何问题(华硕公司2005年软件工程师面试)
_interrupt double compute_area(double radius)
{
double area = PI*radius*radius;
printf("/nArea=%f",area);
return area;
};
关键字:中断处理 中断服务 ISR
引用地址:
中断处理过程和中断服务程序ISR的限制
推荐阅读最新更新时间:2024-03-16 16:19
Cortex-M3中断服务程序设计
是嵌入式应用系统获取各种事件的基本手段。而事件是实时性问题的讨论基础和事件计算的起点。 中断优先级 不同中断服务程序应有不同优先级,在允许中断嵌套时,最高优先级的中断总是能够得到响应。 只要没关中断,ISR可以中断任何任务的运行,比最高优先级的任务还要高。 Cortex-M3中断资源 抢占优先级:实现中断嵌套 子优先级:当抢占优先级相同的两个中断同时发生时,子优先级高的中断可以首先获得运行权。 中断优先级安排原则 紧迫性:触发中断的事件允许耽误的时间越短,优先级越高。 关键性:触发中断的事件越关键,越高 频繁性:触发中断的事件发生越频繁,越高 快捷性:前三项相近,ISR处理越快,越高。 ISR功能应尽量简单,只要
[单片机]
初探WindowsCE异常和中断服务程序
1.中断/异常相量的装入和执行方式 中断和异常都是异步发生的事件,当该事件发生,系统将停止目前正在执行的代码转而执行事件响应的服务程序。而事件服务程序的入口点就是中断/异常向量所在的位置。ARM的中断向量可以是0x0开始的低地址向量,也可以是在FFFF0000位置的高向量地址。winCE下使用高地址作为trap区,所以在CE下arm使用高地址向量。 VectorINStructiONs ldr pc, ; reset ldr pc, ; undefined inSTruction ldr pc, ; SVC ldr pc, ; Prefetch abort ldr pc, ; data abo
[单片机]
stm32f103基本定时器,定时器中断服务程序里面输出脉冲波形
main.c /**定时器中断TIM3方式,(当基本定时器不用PWM输出) 设计两路输出两路脉冲波: 周期:100us,占空比80% 周期:100us,占空比20%**/ int main(void) { LED_Init();//pc14引脚初始化 BEEP_Init();/pc13引脚初始化 TIME_Init();//定时器初始化 while(1); } time.c #include stm32f10x.h #include time.h #include delay.h #include beep.h #include stdio.h void TIME_Init(void) {
[单片机]
STM32Cube HAL库中断处理机制,以及回调函数实现原理
1写在前面 很多人都知道STM32CubeMX这套工具的一个目的:减少开发者对STM32底层驱动的开发时间,把重心放在应用代码上。 但是,STM32CubeMX只是生成了底层驱动的初始化代码。所以,我们还需要掌握:应用层代码如何调用HAL库函数接口,以及HAL库中断处理机制等相关知识。 HAL库牵涉的内容较多,本文拿HAL库中断处理来讲解,以及相关的回调函数。 HAL库中断处理机制 之前使用标准外设库开发时,中断程序(函数)由我们自己实现。 而HAL库的中断处理函数是按照HAL处理机制来实现,如USART1,统一由HAL_UART_IRQHandler来进行处理,如下图: 其它大部分外设(TIM、SPI、CAN
[单片机]
ATMEL精妙的IRQ中断处理过程
A: 从栈地址开始,栈顶为AT91SAM7S64的16K片内RAM尽头0x00204000 IRQ_STACK_SIZE = 3*8*4 FIQ_STACK_SIZE = 0x004 ABT_STACK_SIZE = 0x004 UND_STACK_SIZE = 0x004 SVC_STACK_SIZE = 0x800 SYS_STACK_SIZE = 0x400 irq栈为什么用3*8*4=96B呢?因为irq最多8级嵌套,ARM字长4B,而3,是由于每次进栈均破坏了3个寄存器r0、spsr、lr,所以需要压栈保存的也就是3。计算十分精准,没有一个字浪费,这是AT第一牛X的地方。 当irq发生时,下列操作处理器自动完成: 1。r
[单片机]
从零开始学51单片机定时器
基于单片机的定时器电路原理图如下所示: 我们学单片机是首先学的就是 led 闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们能用定时器来实现灯的闪烁的功能。 例 1:查询方式 ORG 0000H AJMP START ORG 30H START: MOV P1,#0FFH ;关所 灯 MOV TMOD,#00000001B ;定时/计数器 0 工作于方式 1 MOV TH0,#15H MOV TL0,#0A0H ;即数 5536 SETB TR0 ;定时/计数器 0 开始运行 LOOP:JBC TF
[单片机]
最简短且高效的中断处理程序
通过用手动逐个向8051单片机的 /INT0 输入单脉冲,向单片机申请中断。 单片机每中断一次,依次向 P1 口输出 55H,AAH,55H,AAH……。 ;============================================ 最佳答案:下列程序,经过调试,完全符合题目要求。 ORG 0000H LJMP START XRL P1, #255 JNB P3.2, $ RETI START: SETB IT0 SETB EX0 SETB EA MOV P1, #55H SJMP $ END ;=====================================
[单片机]
分析2440中的中断处理部分
这个 2440test里面的中断写的向量有些隐蔽,兜了很多个圈,也难怪这么难理解,下面 就对这个东西抽丝剥茧,看清楚这究竟是一个怎么样的过程。 中断向量 b HandlerIRQ ;handler for IRQ interrupt 很自然,因为所有的单片机都是那样,中断向量一般放在开头,用过单片机的人都会很熟悉 那就不多说了。 异常服务程序 这里不用中断(interrupt)而用异常(exception),毕竟中断只是异常的一种情况,呵呵 下面主要分析的是“中断异常”说白了,就是我们平时单片机里面用的中断!!!所有有器件 引起的中断,例如TIMER中断,UART中断,外部中断等等,都有一个统一的入口,那就是中断 异常 I
[单片机]