当前位置: 首页 > article >正文

嵌入式知识点总结 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已经独立,不需要保存通用寄存器的上下文,直接可用,从而加快中断响应速度。
特性FIQIRQ
优先级更高(最高优先级)较低
寄存器使用使用专用的 R8~R14与用户模式共享寄存器
中断屏蔽自动屏蔽所有IRQ中断可能被FIQ中断抢占
适用场景紧急、实时、短时间任务处理通常的中断服务
响应速度较快较慢

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

中断是CPU处于被动状态下来接受设备的信号,而轮询是CPU主动去查询该设备是否有请求。
凡事都是两面性,所以,看效率不能简单的说那个效率高。如果是请求设备是一个频繁请求cpu的设备,或者有大量数据请求的网络设备,那么轮询的效率是比中断高。如果是一般设备,并且该设备请求cpu的频率比较低,则用中断效率要高一些。主要是看请求频率。


http://www.kler.cn/a/516006.html

相关文章:

  • MyBatis-Plus的插件
  • 优化使用 Flask 构建视频转 GIF 工具
  • 新年好(Dijkstra+dfs/全排列)
  • 数据结构:二叉树
  • 【C】本地变量与全局变量
  • 2024年博客之星主题创作|从零到一:我的技术成长与创作之路
  • 字节跳动自研HTTP开源框架Hertz简介附使用示例
  • 人工智能如何重塑音频、视觉及多模态领域的应用格局
  • 詳細講一下在RN(ReactNative)中,6個比較常用的組件以及詳細的用法
  • can not be imported as a dangling index
  • 低代码平台放入外部链接有缓存不生效
  • 【全栈】SprintBoot+vue3迷你商城-扩展:vue的基本用法
  • springboot 调用 c++生成的so库文件
  • selenium clear()方法清除文本框内容
  • 单例模式 - 单例模式的实现与应用
  • 动静态库的制作与使用(Linux操作系统)
  • 深圳大学-计算机系统(3)-实验四处理器结构实验一
  • 设计模式的艺术-迭代器模式
  • Unity|小游戏复刻|见缝插针1(C#)
  • mybatis(57/134)
  • Python 轻松扫描,快速检测:高效IP网段扫描工具全解析
  • Web 音视频(二)在浏览器中解析视频
  • Lisp语言的区块链
  • H266/VVC 量化编码中 TCQ(或 DQ)技术
  • oppo25届秋招补录内推来啦
  • 算法中的时间复杂度和空间复杂度