嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十七) 异常与中断的概念及处理流程

简介: 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十七) 异常与中断的概念及处理流程

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


17.1 中断的引入


17.1.1 妈妈怎么知道孩子醒了


1670922004706.jpg

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

① 时不时进房间看一下:查询方式 简单,但是累

② 进去房间陪小孩一起睡觉,小孩醒了会吵醒她:休眠-唤醒 不累,但是妈妈干不了活了

③ 妈妈要干很多活,但是可以陪小孩睡一会,定个闹钟:poll方式 要浪费点时间,但是可以继续干活。妈妈要么是被小孩吵醒,要么是被闹钟吵醒。

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


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


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

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

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

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

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

1670922021049.jpg

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

① 妈妈正在看书

② 发生了各种声音: 可忽略的远处猫叫 ;快递员按门铃; 卧室中小孩哭了;

③ 妈妈怎么办?

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

b. 去处理

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

对于门铃:开门取快递

对于哭声:照顾小孩

c. 回来继续看书


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


1670922032766.jpg

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


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

相关文章
|
12天前
|
监控 安全 开发工具
鸿蒙HarmonyOS应用开发 | HarmonyOS Next-从应用开发到上架全流程解析
HarmonyOS Next是华为推出的最新版本鸿蒙操作系统,强调多设备协同和分布式技术,提供丰富的开发工具和API接口。本文详细解析了从应用开发到上架的全流程,包括环境搭建、应用设计与开发、多设备适配、测试调试、应用上架及推广等环节,并介绍了鸿蒙原生应用开发者激励计划,帮助开发者更好地融入鸿蒙生态。通过DevEco Studio集成开发环境和华为提供的多种支持工具,开发者可以轻松创建并发布高质量的鸿蒙应用,享受技术和市场推广的双重支持。
166 11
|
1天前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
29 15
|
15天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
75 13
|
2月前
|
小程序 测试技术 API
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
本文详细介绍元服务的开发及上架全流程,涵盖元服务的特点、创建项目、服务卡片、签名打包、开发测试及上架审核等环节,帮助开发者轻松掌握从零开始开发并发布元服务的全过程。元服务以其轻量、免安装、易于使用等特点,成为未来服务提供的重要形式。
92 13
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
|
2月前
|
存储 调度 数据安全/隐私保护
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
鸿蒙应用打包上架流程包括创建应用、打包签名和上传应用。首先,在AppGallery Connect中创建项目、APP ID和元服务。接着,使用Deveco进行手动签名,生成.p12和.csr文件,并在AppGallery Connect中上传CSR文件获取证书。最后,配置签名并打包生成.app文件,上传至应用市场。常见问题包括检查签名配置文件是否正确。参考资料:[应用/服务签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)。
68 3
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
|
27天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
|
2月前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
3月前
|
Linux 开发工具 数据安全/隐私保护
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
这篇文章介绍了在CentOS 7系统中安装Docker时遇到的两个常见问题及其解决方法:用户不在sudoers文件中导致权限不足,以及yum被锁定的问题。
51 2
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
|
3月前
|
监控 安全 Java
linux服务器上启动framework应用程序流程
【10月更文挑战第17天】在Linux服务器上启动Framework应用程序需经过准备工作、部署、启动、监控及访问五个步骤。首先确保服务器满足系统要求并安装依赖项;接着上传应用文件,编译构建,配置参数;然后通过脚本、命令行或系统服务启动应用;启动后检查日志,监控性能;最后确认访问地址,验证应用运行状态。具体操作应参照应用文档。
|
3月前
|
监控 Java Linux
linux服务器上启动framework应用程序流程
【10月更文挑战第18天】在 Linux 服务器上启动框架应用程序的流程包括:准备工作(确保访问权限、上传部署文件、了解启动要求)、检查依赖项、配置环境变量、切换到应用程序目录、启动应用程序、监控启动过程以及验证应用程序是否正常运行。具体步骤可能因应用程序类型和框架而异。