嵌入式linux中断浅解

        本文简单理一下嵌入式linux对于ARM系列SoC的中断管理。

        我将嵌入式linux的中断分为了3个级别,分别是:

       1. CPU级:

      嵌入式linux只使用了ARM的IRQ中断,当发生一个IRQ时,CPU会自动执行0x00000018(低端向量模式)或0xffff0018(高端向量模式)处的指令,此处一般放置了一条跳转指令b  addr1,linux对异常向量表的填充是在初始化阶段完成的,调用early_trap_init()函数。

       2.linux内核级:

       当CPU跳转到addr1处后,此处的指令属于linux内核,它会去读取CPU中断寄存器的中断号,然后执行一些其他的指令,最后跳转到用request_irq()注册的函数。

       3.linux用户级:

      用户级就是request_irq()注册的函数,它是驱动开发者自己写的函数,在这个函数里面,可以执行任何想要的操作,比如最简单的是调用printk()打印一段文字到终端。

补充:对于裸机程序,在用到CPU的中断资源时,可以直接:b  EventIRQ,然后在EventIRQ里面执行需要的操作,图1简单描述了中断在硬件上的过程:

                                   

                                                                                 图1:ARM中断的硬件过程

       IRQ进入到irq源寄存器,经过优先级判断,进入irqpend寄存器,只要irqpend里面有中断,就会不断向CPU发出中断信号,CPU在处理中断时,不会理会这些请求,但是,若CPU已经处理完当前的中断,就会接受这些请求,再次中断,所以,每当处理完一个中断时,都应该立即清除IRQPND的中断位和SRCPND的中断位,顺序是先清SRCPND,再清IRQPND。

总结:linux内核对ARM中断的管理,其实就是在ARM的基本中断原理上,添加了抽象,使得中断成为了linux所管理的一种系统级资源,驱动开发人员无需关注ARM本身的中断细节,只需要关心在中断时应该做什么事情,像多线程编程一样,调用request_irq()去注册一个执行流就可以了。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南山墨客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值