异常与中断的概念及处理

一、内核中断方式

  • 查询方式:简单,但是累
  • 休眠-唤醒:不累,但是休眠干不了活了
  • poll方式:要浪费点时间,但是可以继续干活
  • 异步通知:妈妈、小孩互不耽误

1.1 嵌入式系统的情况

在这里插入图片描述

CPU运行过程中有多种中断源,汇集到中断控制器,由中断控制器选择优先级最高的中断并通知CPU。
比如:① 按键、② 定时器、③ ADC转换完成、④ UART发送完数据、收到数据、⑤ 等等

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

1.2 中断的处理流程

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

  1. 初始化
    • 设置中断源,让它可以产生中断
    • 设置中断控制器(可以屏蔽某个中断,优先级)
    • 设置CPU总开关(使能中断)
  2. 执行其他程序:正常程序
  3. 产生中断:比如按下按键—>中断控制器—>CPU
  4. CPU 每执行完一条指令都会检查有无中断/异常产生
  5. CPU发现有中断/异常产生,开始处理。
    • 软件:保存现场(各种寄存器)、处理异常(中断)、恢复现场

1.3 异常向量表

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

_start: b	reset		//发生复位时,CPU就去 执行第1条指令: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

这些指令存放的位置是固定的,比如对于ARM9芯片中断向量的地址是0x18。
当发生中断时,CPU就强制跳去执行0x18处的代码。
在向量表里,一般都是放置一条跳转指令,发生该异常时,CPU就会执行向量表中的跳转指令,去调用更复杂的函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

习惯就好zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值