秦天qintian0303 发表于 2024-3-15 12:30

《原子Linux驱动开发》基础阅读6:Linux中断

<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在我们进行裸机或linux开发的时候,中断都是会被频繁使用的功能,在裸机中使用中断需要做许多工作,比如配置寄存器、使能中断、初始化等等,Linux内核提供完整的中断框架,我们只需要申请,然后注册中断处理函数即可,非常的方便。</div>

<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在裸机中断的处理方法,先是使能中断,然后初始化相应的寄存器,接下来注册中断服务函数,然后当中断发生的时候进入中断服务函数进行处理。而在Linux内核中提供了大量的中断相关的API函数,接下来我们就了解一下。</div>

<div>&nbsp;</div>

<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中断号:每一个中断都有一个中断号,通过中断号区分不同的中断。在Linux内核中使用一个int变量表示中断号;</div>

<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Request_irq函数:在Linux内核中,如果想要使用某个中断需要申请,该函数用于申请中断,有可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码中使用该函数,函数会使能中断,我们不需要手动去使能中断;</div>

<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Free_irq函数:我们在申请中断中使能了中断,在完成之后,要通过这个函数释放掉相应的中断;</div>

<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中断处理函数:使用Request_irq函数申请中断的时候需要设置对应的中断处理函数,也就是说要把相应的中断号与对应的处理函数指针相关联;</div>

<div>&nbsp;</div>

<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里我们要了解一下上半部和下半部的概念,或者是顶半部与底半部,我们使用Request_irq申请中断的时候注册的中断服务函数属于中断处理的上半部,然后中断触发,那么中断处理函数就会执行,我们都知道中断处理函数一定要快速执行,越短越好,但是有一些中断过程可能是比较费时间的,我们必须要进行一些处理来缩短执行时间。这个时候中断触发进入中断处理函数,如果时间比较短,就可以直接在上半部完成;比较耗时,就需要把这些耗时的代码提出来,交给下半部去完成,来实现中断处理函数的快进快出。</div>

<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那么如何实现下半部的机制呢,其一就是软中断功能,软中断必须在编译的时候静态注册;Tesklet是利用软中断实现另外一种下半部的机制,我们更建议使用这种方法;第三种执行方式就是工作队列,在进行上下文执行时,工作队列将要推后的工作交给一个内核线程去执行,因此工作队列工作在进程上下文,所以其允许睡眠或重新调度。每一个worker都有一个工作队列线程,处理自己工作队列中的所有工作,在实际驱动开发中,只需要定义工作即可。而关于工作队列和工作线程,我们基本不用去管,简单创建就可以了</div>

<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设备数中需要对中断属性信息进行设置,linux内核,通过读取设备树中的中断属性信息来配置中断。编写驱动的时候需要用到中断号,可以直接通过对应的函数从属性中提取对应的设备号。</div>

Jacktang 发表于 2024-3-16 07:35

<p>Linux中断学习了</p>

<p>谢谢分享</p>
页: [1]
查看完整版本: 《原子Linux驱动开发》基础阅读6:Linux中断