首页 > 其他分享 >1、异常与中断的概念及处理流程

1、异常与中断的概念及处理流程

时间:2024-07-21 15:08:38浏览次数:15  
标签:pc 中断 流程 ldr 妈妈 异常 CPU

 

1 中断的引入

1.1妈妈怎么知道孩子醒了

妈妈怎么知道卧室里小孩醒了?

① 时不时进房间看一下:查询方式

简单,但是累

② 进去房间陪小孩一起睡觉,小孩醒了会吵醒她:休眠-唤醒

不累,但是妈妈干不了活了

③ 妈妈要干很多活,但是可以陪小孩睡一会,定个闹钟:poll方式

要浪费点时间,但是可以继续干活。

妈妈要么是被小孩吵醒,要么是被闹钟吵醒。

④ 妈妈在客厅干活,小孩醒了他会自己走出房门告诉妈妈:异步通知

妈妈、小孩互不耽误。

 

后面的3种方式,都需要“小孩来中断妈妈”:中断她的睡眠、中断她的工作。

 

实际上,能“中断”妈妈的事情可多了:

① 远处的猫叫:这可以被忽略

② 门铃、小孩哭声:妈妈的应对措施不一样

③ 身体不舒服:那要赶紧休息

④ 有蜘蛛掉下来了:赶紧跑啊,救命

 

 

妈妈当前正在看书,被“中断”后她会怎么做?流程如下:

① 妈妈正在看书

② 发生了各种声音

可忽略的远处猫叫

快递员按门铃

卧室中小孩哭了

③ 妈妈怎么办?

a. 先在书中放入书签,合上书

b. 去处理

对于不同的情况,处理方法不同:

对于门铃:开门取快递

对于哭声:照顾小孩

c. 回来继续看书

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

 

 

CPU在运行的过程中,也会被各种“异常”打断。这些“异常”有:

① 指令未定义

② 指令、数据访问有问题

③ SWI(软中断)

④ 快中断

⑤ 中断

 

中断也属于一种“异常”,导致中断发生的情况有很多,比如:

① 按键

② 定时器

③ ADC转换完成

④ UART发送完数据、收到数据

⑤ 等等

这些众多的“中断源”,汇集到“中断控制器”,由“中断控制器”选择优先级最高的中断并通知CPU。

 

2 中断的处理流程

arm对异常(中断)处理过程:

① 初始化:

a. 设置中断源,让它可以产生中断

b. 设置中断控制器(可以屏蔽某个中断,优先级)

c. 设置CPU总开关(使能中断)

 

② 执行其他程序:正常程序

③ 产生中断:比如按下按键--->中断控制器--->CPU

④ CPU 每执行完一条指令都会检查有无中断/异常产生

⑤ CPU发现有中断/异常产生,开始处理。

对于不同的异常,跳去不同的地址执行程序。

这地址上,只是一条跳转指令,跳去执行某个函数(地址),这个就是异常向量。

③④⑤都是硬件做的。

⑥ 这些函数做什么事情?

软件做的:

a. 保存现场(各种寄存器)

b. 处理异常(中断):

分辨中断源,再调用不同的处理函数

c. 恢复现场

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。

 

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和其他更低的架构。

 

以后在驱动大全里讲解中断时,我们再深入分析,到时会涉及单核、多核等知识。

标签:pc,中断,流程,ldr,妈妈,异常,CPU
From: https://www.cnblogs.com/liusiluandzhangkun/p/18314470

相关文章

  • Java基础之异常
    异常1.概述​代码出现了不正常的现象,在Java中每一个异常都是java一个一个的类,或者叫做异常对象2.异常体系说明Throwable:Error:错误类似于人得了癌症,不能通过处理让代码变正常,必须得重新写Exception:异常(所有异常的父类)类似于人得了感冒可以治疗,可以通过......
  • 我不知道为什么在这种情况下我会收到“发生异常”
    我正在尝试从https://github.com/DDI-Dataset/DDI-Code及其数据集运行代码(已下载并添加到作者指示的文件夹中),并且我收到消息“发生异常:异常请访问https://stanfordaimi.azurewebsites.net/datasets/35866158-8196-48d8-87bf-50dca81df965下载DDI数据......
  • Vip积分管理系统项目JavaWeb开发流程
    1.项目概述1维护客户,提升火锅店运营效率。2目标用户:​ 明确系统的主要用户为火锅店的店长或管理员。1.3系统目标:​提供全面的积分管理功能。​简化日常运营流程。​提供深入的数据分析和报告功能。2.功能需求系统登录与权......
  • 学习流程-2024-07
    学习流程-2024-07-201.cordova项目添加android平台后,用androidstudio打开platforms/android,“在模拟器运行”按钮为灰色不可点。需要点右上角syncprojectwithgradlefiles。但点了之后报错如下,下一步解决该问题:Downloadhttps://services.gradle.org/distributions/gradle-......
  • 农学模型“扩容“,机器学习“把关“,测土配方数据异常无处遁形
    测土配方施肥是现代农业的一项关键技术,通过测试土壤养分含量,为作物量身定制施肥配方,能够显著提高肥料利用率,减少面源污染。但测土配方施肥需要分析海量土壤数据,而这些数据往往来源复杂、标准不一,异常值错误值在所难免,成为影响配方精准性和可靠性的"定时炸弹"。近日,北京市农林科......
  • 【Java面向对象】异常处理
    文章目录1.异常1.1异常类1.2异常类型1.3免检异常和必检异常2.异常的声明、抛出与捕获2.1声明异常2.2抛出与捕获异常2.3从异常中获取信息3.链式异常3.1重新抛出异常3.2链式异常4.创建自定义异常类1.异常1.1异常类异常是对象,而对象都采用类来定义。异常的......
  • 语料处理流程
    处理语料(文本数据)是自然语言处理(NLP)项目中的关键步骤。这个过程通常包括以下几个步骤:数据收集、数据清理、数据预处理、特征提取和数据增强。以下是语料处理流程:1.数据收集特点数据来源可以是网络抓取、公开数据集、公司内部数据等。需要考虑数据的合法性和隐私问题。......
  • 提升效率的秘密武器:FlowUs息流,一站式平台引领团队协作新趋势! 数字革新浪潮:FlowUs息流
    FlowUs息流,作为新一代的知识管理与协作平台,正在重新定义个人和团队处理数字信息的方式。它以云端笔记为基础,融合了在线文档、知识库、文件夹等多形态功能,为用户提供了一个全面、集成的一站式工作中心。云端笔记:随时随地的记录与访问FlowUs的云端笔记功能使用户能够在任何时间......
  • 掌握 C++ 异常艺术:构建健壮程序的秘诀与实战策略「一」
    以下内容为本人的烂笔头,如需要转载,请全文无改动地复制粘贴,原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/WC8CThJ77oHMsCSH0CBzsQ在过去几十年的编程历史中,异常处理的演变仿佛一场文明的进化史,它不仅仅是技术的革新,更是编程思想与哲学的深刻体现。从古早的错......
  • Java基础语法01-运算符&流程控制语句If
    Java基础语法1.运算符1.1算术运算符(理解)1.1.1运算符和表达式运算符:对常量或者变量进行操作的符号表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。​不同运算符连接的表达式体现的是不同类型的表达式。举例说明:inta=10;intb=2......