snifer

[原创]Blackfin嵌入式系统的Poling and Interrupts(轮询和中断)

0
阅读(3372)

今天发了个很有意思的事情,利用Blackfin嵌入式系统的中断操作时候,因为要查询各种中断的次数,自己编个程序还不好解决,查了下资料,发现了这个有趣的应用,分享给大家。

每一次给设备命令(例如“把读磁头移到软盘的第42扇区“)的时候,设备驱动程序都可以选择采用什么手段来判断命令是否已经执行结束。设备驱动程序可以轮询设备或者使用中断。

轮询设备通常意味着不断读取它的状态寄存器,直到设备的状态改变指示它已经完成了请求。因为设备驱动程序是内核的一部分,如果驱动程序一直在轮询,Blackfin内核在设备完成请求之前不能运行其它任何东西,会是惨重的损失。所以轮询的设备驱动程序使用一个系统计时器,让内核在晚些时候调用设备驱动程序中的一个例程。这个定时器例程会检查命令的状态,uLinux的软盘驱动程序就是这样工作的。使用计时器进行轮询是一种最好的近似,而更加有效的方法是使用中断。

中断驱动的设备驱动程序在它控制的硬件设备需要服务时,会发出一个硬件中断。例如:当在网络上接收到一个以太网报文时,以太网设备驱动程序会被设备中断。Linux内核要有能力把从硬件设备来的中断转发到正确的设备驱动程序。这通过设备驱动程序向内核登记它所使用的中断来实现。它登记中断处理程序例程的地址和它希望拥有的中断编号。你通过/proc/interrupts可以看到设备驱动使用了哪些中断和每一类型的中断使用了多少次:

0: 727432 timer

1: 20534 keyboard

2: 0 cascade

3: 79691 + serial

4: 28258 + serial

5: 1 sound blaster

11: 20868 + aic7xxx

13: 1 math error

14: 247 + ide0

15: 170 + ide1

对于中断资源的请求发生在驱动程序初始化时。系统中有些中断是固定的,这是IBM PC体系结构的遗留物。例如,软驱控制器总是用中断6。其它中断,例如PCI设备的中断,在启动的时候动态分配。这时设备驱动程序必须首先找出它所控制的设备的中断号,然后才能请求拥有这个中断的处理权。对于PCI中断,Linux支持标准的PCI BIOS回调(callback)来确定系统中设备的信息,包括它们的IRQ。

一个中断本身如何被转发到CPU,依赖于体系结构。但是在大多数的体系结构上,中断都用一种特殊的模式传递,在这种模式下,系统中其它的中断将被停止。设备驱动程序在它的中断处理例程中应该做尽可能少的工作,以便Linux内核可以结束中断,返回到它被中断以前的地方。收到中断后需要做大量工作的设备驱动程序可以使用内核的bottom half handler或者任务队列把例程排在后面,以便在以后调用。

ADI的产品使用起来很棒,能发现很多惊喜哦!

Baidu
map