嵌入式知识点总结 ARM体系与架构 专题提升(三)-中断与异常

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。

目录

1.中断与异常有何区别?

2.中断与DMA有何区别?

3.中断能不能睡眠,为什么?下半部能不能睡眠?

4.中断的响应执行流程是什么?

5.当一个异常出现以后,ARM微处理器会执行哪几步操作?

6.写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的?

7.为什么FIQ比IRQ要快?

8.中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动?


1.中断与异常有何区别?

中断 :由外部事件触发,如外设请求服务(例如串口接收数据、计时器溢出、键盘输入)。

异常 :由内部事件触发,通常是处理器在执行指令时检测到的错误或特定条件(如除零错误、非法指令)。

中断是指外部硬件 产生的一个电信号从CPU的中断引脚进入,打断CPU的运行。

异常是指软件运行过程中发生了一些必须作出处理 的事件,CPU自动产生一个陷入来打断CPU的运行。异常在处理的时候必须考虑与处理器的时钟同步 ,实际上异常也称为同步中断,在处理器执行到因编译错误而导致的错误指令时,或者在执行期间出现特殊错误,必须靠内核处理的时候,处理器就会产生-个异常。

2.中断与DMA有何区别?

DMA :是一种无须CPU的参与,就可以让外设与系统内存 之间进行双向数据传输 的硬件机制,使用DMA可以使系统CPU从实际的I/0数据传输过程中摆脱出来,从而大大提高系统的吞吐率。
中断 :是指CPU在执行程序的过程中,出现了某些突发事件 时,CPU必须暂停执行 当前的程序,转去处理突发事件 ,处理完毕后CPU又返回 源程序被中断的位置并继续执行。

所以中断和DMA的区别就是:DMA不需CPU参与,而中断是需要CPU参与的

其实本质也不是一类东西。一个是执行的动作,一个是数据转运的方式。

3.中断能不能睡眠,为什么?下半部能不能睡眠?

1.中断处理的时候,不应该发生进程切换。因为在中断上下文中,唯一能打断当前中断handler的只有更高优先级的中断 ,它不会被进程打断 。如果在中断上下文中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的 ,而在中断上下文中,没有进程的概念,没有一个task struct(这点对于softirq和tasklet一样)。因此真的休眠了,比如调用了会导致阻塞的例程内核几乎肯定会死。

2.schedule()在切换进程时,保存当前的进程上下文 (CPU寄存器的值、进程的状态以及堆栈中的内容),以便以后恢复此进程运行。中断发生后,内核会先保存当前被中断的进程上下文 (在调用中断处理程序后恢复)。

但在中断处理程序里,CPU寄存器的值肯定已经变化了(最重要的程序计数器PC、堆栈SP等)。如果此时因为睡眠或阻塞操作调用了schedule(),则保存的进程上下文就不是当前的进程上下文,所以,不可以在中浙处理程序中调用schedule()

3.2.4内核中schedule()函数本身在进来的时候判断是否处于中断上下文:

公众号:嵌入式与Linux那些事 CSDN:嵌入式与Linux那些事 来源网络,个人整理,转载声明

if(unlikely(in interrupt())

BUG();

因此,强行调用schedule()的结果就是内核BUG,但看2.6.18的内核schedule()的实现却没有这句,改掉了。

4.中断handler会使用被中断的进程内核堆栈,但不会对它有任何影响,因为handler使用完后会完全清除它使用的那部分堆栈,恢复被中断前的原貌。5.处于中断上下文时候,内核是不可抢占的。因此,如果休眠,则内核一定挂起。

特性 中断上半部 中断下半部
是否可以睡眠 是(前提是能被调度)
执行上下文 中断上下文 进程上下文
调度能力 不可调度 可调度
典型场景 硬件事件的快速响应 延迟处理非实时任务

4.中断的响应执行流程是什么?

中断的响应流程:cpu接受中断->保存中断上下文跳转到中断处理历程->执行中断上半部->执行中断下半 部->恢复中断上下文。

5.当一个异常出现以后,ARM微处理器会执行哪几步操作?

1.将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,则LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量这样,异常处理程序就不需要确定异常是从何种状态进入的。例如:在软件中断异常SW!,指令MOV PC,R14 svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。

2.将CPSR复制到相应的SPSR中,

3.根据异常类型,强制设置CPSR的运行模式位。

4.强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

  • 异常触发
  • 保存CPSR到SPSR
  • 切换模式并屏蔽中断(可选)
  • 跳转到异常向量表地址
  • 执行异常处理程序
  • 恢复状态并返回

6.写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的?

1.写一个中断服务程序要注意快进快出 ,在中断服务程序里面尽量快速采集信息 ,包括硬件信息,然后退出中断,要做其它事情可以使用工作队列 或者tasklet方式 。也就是中断上半部和下半部。2.中断服务程序中不能有阻塞操作 。应为中断期间是完全占用CPU的(即不存在内核调度),中断被阻塞住,其他进程将无法操作。

3.中断服务程序注意返回值 ,要用操作系统定义的宏做为返回值,而不是自己定义的。

4.如果要做的事情较多,应将这些任务放在后半段(tasklet,等待队列等)处理。

7.为什么FIQ比IRQ要快?

FIQ模式下,ARM处理器提供了一组专用的寄存器,可以避免上下文切换时保存和恢复通用寄存器的开销:

  • 专用寄存器:FIQ模式下的 R8 ~ R14 是专用寄存器,而 IRQ 和普通模式共享寄存器。
  • 优势:当进入FIQ中断时,R8~R14已经独立,不需要保存通用寄存器的上下文,直接可用,从而加快中断响应速度。
特性 FIQ IRQ
优先级 更高(最高优先级) 较低
寄存器使用 使用专用的 R8~R14 与用户模式共享寄存器
中断屏蔽 自动屏蔽所有IRQ中断 可能被FIQ中断抢占
适用场景 紧急、实时、短时间任务处理 通常的中断服务
响应速度 较快 较慢

8.中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动?

中断是CPU处于被动状态 下来接受设备的信号,而轮询是CPU主动去查询 该设备是否有请求。

凡事都是两面性,所以,看效率不能简单的说那个效率高。如果是请求设备是一个频繁请求 cpu的设备,或者有大量数据 请求的网络设备,那么轮询 的效率是比中断高。如果是一般设备,并且该设备请求cpu的频率比较低 ,则用中断效率要高一些。主要是看请求频率。

相关推荐
xuxg20051 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT3 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen3 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
acrelwwj6 小时前
智慧照明新引擎,ASL600 4GWJ开启城市照明精细化管理新时代
大数据·经验分享·物联网
全栈游侠6 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_6 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
陌上花开缓缓归以7 小时前
LiteOS和RTOS 系统选型分析
arm开发
深圳市九鼎创展科技8 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计8 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦10 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习