嵌入式Linux应用开发-基础知识-第十七章异常与中断的概念及处理流程

嵌入式Linux应用开发-基础知识-第十七章异常与中断的概念及处理流程

  • 第十七章 异常与中断的概念及处理流程
    • 17.1 中断的引入
      • 17.1.1 妈妈怎么知道孩子醒了
      • 17.1.2 嵌入系统中也有类似的情况
    • 17.2 中断的处理流程
    • 17.3 异常向量表
    • 17.4 参考资料

第十七章 异常与中断的概念及处理流程

在这里插入图片描述

在Linux开发中,异常和中断是操作系统中非常重要的概念。它们都是处理器在运行时遇到特殊情况时触发的事件,但是它们有一些不同之处。

  1. 异常(Exception):异常是由程序执行时发生的问题引起的,这种问题通常与程序的错误有关。例如,当程序尝试除以零或访问无效的内存地址时,就会发生异常。当处理器检测到异常时,它会停止当前程序的执行,并将控制权转移到操作系统内核的异常处理程序。如果异常处理程序能够解决问题并返回控制权给原程序,则程序可以继续执行。否则,程序可能会终止并产生错误消息。
  2. 中断(Interrupt):中断是由硬件设备发出的信号,通知操作系统有事件发生。例如,当用户按下键盘上的键或者定时器计时到达时,就会发生中断。与异常不同,中断是异步事件,处理器在任何时刻都可能接收到中断。当处理器接收到中断时,它会停止当前程序的执行,并将控制权转移到操作系统内核的中断处理程序。中断处理程序会根据事件类型执行相应的操作,例如读取键盘输入或处理计时器事件。在处理完中断后,处理器会将控制权返回给被中断的程序,使其继续执行。

异常和中断的处理流程如下:

  1. 处理器在运行时遇到异常或接收到中断信号。
  2. 处理器将当前程序的执行状态保存到内核栈中,以便在处理异常或中断后能够恢复执行状态。
  3. 处理器将控制权转移到操作系统内核的异常处理程序或中断处理程序。
  4. 异常处理程序或中断处理程序执行相应的操作来解决问题或处理事件。
  5. 处理程序返回控制权给被中断的程序,使其继续执行。

在Linux中,异常和中断的处理流程如下:

  1. 当处理器遇到异常或接收到中断信号时,它会将当前程序的执行状态保存到内核栈中。
  2. 处理器将控制权转移到Linux内核的异常处理程序或中断处理程序。
  3. 处理程序根据异常类型或事件类型执行相应的操作。
  4. 处理程序返回控制权给被中断的程序,使其继续执行。

需要注意的是,在Linux中,异常和中断的处理程序是由内核提供的,并且这些处理程序通常是用C语言编写的。因此,开发人员可以编写自己的内核模块来扩展Linux内核的功能,并编写自己的异常和中断处理程序来处理特定的事件。

处理器遇到异常/接收中断 --> 保存处理器状态到内核栈 --> 转移控制权到内核的异常/中断处理程序 --> 处理程序处理异常/中断 --> 恢复被中断的程序的执行/终止程序并生成错误报告

17.1 中断的引入

17.1.1 妈妈怎么知道孩子醒了

妈妈怎么知道卧室里小孩醒了?
在这里插入图片描述

① 时不时进房间看一下:查询方式
简单,但是累
② 进去房间陪小孩一起睡觉,小孩醒了会吵醒她:休眠-唤醒
不累,但是妈妈干不了活了
③ 妈妈要干很多活,但是可以陪小孩睡一会,定个闹钟:poll方式 要浪费点时间,但是可以继续干活。
妈妈要么是被小孩吵醒,要么是被闹钟吵醒。
④ 妈妈在客厅干活,小孩醒了他会自己走出房门告诉妈妈:异步通知 妈妈、小孩互不耽误。
后面的 3种方式,都需要“小孩来中断妈妈”:中断她的睡眠、中断她的工作。
实际上,能“中断”妈妈的事情可多了:
① 远处的猫叫:这可以被忽略
② 门铃、小孩哭声:妈妈的应对措施不一样 ③ 身体不舒服:那要赶紧休息
④ 有蜘蛛掉下来了:赶紧跑啊,救命
在这里插入图片描述

妈妈当前正在看书,被“中断”后她会怎么做?流程如下:
① 妈妈正在看书
② 发生了各种声音
可忽略的远处猫叫
快递员按门铃
卧室中小孩哭了
③ 妈妈怎么办?
a. 先在书中放入书签,合上书
b. 去处理
对于不同的情况,处理方法不同: 对于门铃:开门取快递
对于哭声:照顾小孩
c. 回来继续看书

17.1.2 嵌入系统中也有类似的情况

在这里插入图片描述

CPU在运行的过程中,也会被各种“异常”打断。这些“异常”有:
① 指令未定义
② 指令、数据访问有问题
③ SWI(软中断)
④ 快中断
⑤ 中断

中断也属于一种“异常”,导致中断发生的情况有很多,比如:
① 按键
② 定时器
③ ADC转换完成
④ UART发送完数据、收到数据
⑤ 等等
这些众多的“中断源”,汇集到“中断控制器”,由“中断控制器”选择优先级最高的中断并通知 CPU。

17.2 中断的处理流程

arm对异常(中断)处理过程:
① 初始化:
a. 设置中断源,让它可以产生中断
b. 设置中断控制器(可以屏蔽某个中断,优先级) c. 设置CPU总开关(使能中断)
② 执行其他程序:正常程序
③ 产生中断:比如按下按键—>中断控制器—>CPU
④ CPU 每执行完一条指令都会检查有无中断/异常产生
⑤ CPU发现有中断/异常产生,开始处理。
对于不同的异常,跳去不同的地址执行程序。
这地址上,只是一条跳转指令,跳去执行某个函数(地址),这个就是异常向量。
③④⑤都是硬件做的。
⑥ 这些函数做什么事情?
软件做的:
a. 保存现场(各种寄存器) b. 处理异常(中断):
分辨中断源,再调用不同的处理函数 c. 恢复现场

17.3 异常向量表

u-boot或是 Linux内核,都有类似如下的代码:

_start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq //发生中断时,CPU跳到这个地址执行该指令 **假设地址为 0x18** ldr pc, _fiq 

这就是异常向量表,每一条指令对应一种异常。
发生复位时,CPU就去 执行第 1条指令:b reset。
发生中断时,CPU就去执行“ldr pc, _irq”这条指令。
这些指令存放的位置是固定的,比如对于 ARM9芯片中断向量的地址是 0x18。
当发生中断时,CPU就强制跳去执行 0x18处的代码。
在向量表里,一般都是放置一条跳转指令,发生该异常时,CPU就会执行向量表中的跳转指令,去调用更复杂的函数。
当然,向量表的位置并不总是从 0地址开始,很多芯片可以设置某个 vector base寄存器,指定向量表在其他位置,比如设置 vector base为 0x80000000,指定为 DDR的某个地址。但是表中的各个异常向量的偏移地址,是固定的:复位向量偏移地址是 0,中断是 0x18。

17.4 参考资料

对于 ARM的中断控制器,述语上称之为 GIC (Generic Interrupt Controller),到目前已经更新到 v4版本了。
各个版本的差别可以看这里:
https://developer.arm.com/ip-products/system-ip/system-controllers/interrupt-controllers
简单地说,GIC v3/v4用于 ARMv8 架构,即 64位 ARM芯片。 而 GIC v2用于 ARMv7和其他更低的架构。
以后在驱动大全里讲解中断时,我们再深入分析,到时会涉及单核、多核等知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/143803.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF绑定单变量Binding和绑定多变量MultiBinding 字符串格式化 UI绑定数据,数据变化自动更新UI,UI变化自动更新数据

UI绑定数据,数据变化自动更新UI,UI变化自动更新数据。 支持多设备,同时下载。 绑定单变量 在WPF (Windows Presentation Foundation) 中,您可以使用数据绑定来将变量绑定到界面元素。这允许您在界面上显示变量的值,…

CYEZ 模拟赛 7

A 弹珠 妙妙题。 先每个组分一个小球。等价于 n − k n-k n−k 拆分为任意个 [ 1 , k ] [1,k] [1,k] 的数的方案数。 本质是根据面积的转换,直观解释: 完全背包即可。代码。 B C 总结

深入理解传输层协议:TCP与UDP的比较与应用

目录 前言什么是TCP/UDPTCP/UDP应用TCP和UDP的对比总结 前言 传输层是TCP/IP协议栈中的第四层,它为应用程序提供服务,定义了主机应用程序之间端到端的连通性。在本文章,我们将深入探讨传输层协议,特别是TCP和UDP协议的原理和区别…

Cruise 建立自己的文件路径

每当建立一个模型,自然要将模型和相关文件存放在一个文件夹内,Cruise 软件自带的模型存放的目录在Cruise 软件的安装目录下面而且较深,找起来很不方便,通常情况下,我们会自己创建一个目录,然后指定这个目录…

【JAVA】飞机大战

代码和图片放在这个地址了: https://gitee.com/r77683962/fighting/tree/master 最新的代码运行,可以有两架飞机,分别通过WASD(方向),F(发子弹);上下左右(控…

二十,镜面IBL--打印BRDF积分贴图

比起以往&#xff0c;这节应该是最轻松的了&#xff0c; 运行结果如下 代码如下&#xff1a; #include <osg/TextureCubeMap> #include <osg/TexGen> #include <osg/TexEnvCombine> #include <osgUtil/ReflectionMapGenerator> #include <osgDB/Re…

kafka环境搭建以及基本原理

kafka最先是作为日志数据采集&#xff0c;后用于消息传递&#xff0c;kafka能承担tb级别数据存储&#xff0c;确保服务的可用性&#xff0c;允许少量数据的丢失 作为消息中间件就有异步、解耦、削峰三个作用 一、单机搭建 单机ip&#xff1a;192.168.64.133 下载地址&#…

启动 React APP 后经历了哪些过程

本文作者为 360 奇舞团前端开发工程师 前言 本文中使用的React版本为18&#xff0c;在摘取代码的过程中删减了部分代码&#xff0c;具体以源代码为准。 在React 18里&#xff0c;通过ReactDOM.createRoot创建根节点。并且通过调用原型链上的render来渲染。 本文主要是从以下两个…

刘强东再次拿起低价武器,杀入这个万亿市场

京东的低价策略也要在汽车后市场打起来了&#xff1f; 9月26日&#xff0c;途虎养车于港交所挂牌上市当天&#xff0c;京东集团副总裁、京东零售汽车事业部总裁缪钦在朋友圈发文祝贺&#xff0c;同时表示京东养车“所有‘震虎价’商品都比友商低5%”。贺词与战书&#xff0c;同…

紧固螺栓的常见类型有哪些?

大螺丝、小螺丝 螺丝有各种各样的叫法。螺丝、小螺丝、螺栓、鋲螺、螺杆、螺子、小螺钉等。螺丝的大小、以现代的技术细的可以加工到1毫米以下。例如用于手表、计算机、手机等螺丝能加工到0.5毫米。粗的螺丝一般使用到50毫米&#xff0c;主要用于建筑、桥梁等。根据需要可加工…

使用cpolar端口映射的方法轻松实现在Linux环境下SVN服务器的搭建与公网访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

Spring 学习(八)事务管理

1. 事务 1.1 事务的 ACID 原则 数据库事务&#xff08;transaction&#xff09;是访问并可能操作各种数据项的一个数据库操作序列。事务必须满足 ACID 原则——即原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Iso…

【EI会议征稿】2023年第二届信号处理、计算机网络与通信国际学术会议(SPCNC2023)

2023年第二届信号处理、计算机网络与通信国际学术会议&#xff08;SPCNC2023&#xff09; The 2nd International Conference on Signal Processing, Computer Networks and Communications 2023年第二届信号处理、计算机网络与通信国际学术会议&#xff08;SPCNC2023&#x…

基于Linux系统聊天室增加数据库sqlite功能实现(08)

全部掌握后&#xff0c;开始进入本篇。 一. 调整目录结构 为了方便编译&#xff0c;现在我们将前面文章的代码结构做如下调整。 rootubuntu:/mnt/hgfs/code/chat# tree . . ├── chat_client │ ├── include │ ├── Makefile │ ├── obj │ │ └── …

CSS滚动条详解(::-webkit-scrollbar )

滚动条出现的事件&#xff1a; 当设置定宽或者定高的元素添加overflow:scroll属性&#xff0c;会出现滚动条&#xff0c;但是原生样式的会比较丑影响美观。 <div class"content"><div class"contain"></div> </div>.content {wid…

我试试专属勋章

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

windows:批处理bat实例

文章目录 文件/文件夹管理实例批量更改文件名创建编号从0到9的10个文件自动循环运行某个程序显示批处理的完整路径信息将文件名更名为当前系统日期使用批处理命令自动接收用户输入的信息计算当前目录及子目录&#xff08;中文件&#xff09;所占硬盘空间自动删除当前目录及子目…

深信服云桌面用户忘记密码后的处理

深信服云桌面用户忘记了密码&#xff0c;分两种情况&#xff0c;一个是忘记了登录深信服云桌面的密码&#xff0c;另外一个是忘记了进入操作系统的密码。 一、忘记了登录深信服云桌面的密码 登录虚拟桌面接入管理系统界面&#xff0c;在用户管理中选择用户后&#xff0c;点击后…

7.网络原理之TCP_IP(下)

文章目录 4.传输层重点协议4.1TCP协议4.1.1TCP协议段格式4.1.2TCP原理4.1.2.1确认应答机制 ACK&#xff08;安全机制&#xff09;4.1.2.2超时重传机制&#xff08;安全机制&#xff09;4.1.2.3连接管理机制&#xff08;安全机制&#xff09;4.1.2.4滑动窗口&#xff08;效率机制…

IntelliJ IDEA 左侧Commit栏不见了

1.点击File->Settings->Version Control->Commit 2.勾选Use non-modal commit interface