最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【问题解答】linux中,中断注册和中断服务程序只能写在驱动层还是能写在应用层?

Linux Kernel crifan 2951浏览 0评论

【问题】

linux中,中断注册和中断服务程序只能写在驱动层还是能写在应用层?

中的问题:

如果只能写在驱动层,那么两个外设,一个外设触发中断,在中断服务程序中操作另一个外设,该怎么实现?本人只写过GPIO驱动,在驱动中注册中断并调用中断服务程序。理解上的错误还请多多指教。

 

【问题解答】

我也不完全理解,但是比你知道的多点。
Linux中,分内核态和用户态。
你写的所有的驱动,都是出于内核态->可以直接使用内核相关资源;
应用层,都是用户态->无法直接操作底层的东西 -> 想要操作,比如获得权限,切换到内核态,然后才能操作。

你这里的需求,我的理解是:
对应你这句

“在中断服务程序中操作另一个外设”
不知道你的目的和打算用的手段是啥
一般的,ISR中,操作别的设备,常见的是:
设置对应的(比如该硬件本身,或者别的设备B的)寄存器的对应的位,以便通知其某种事情发送或状态变化了。
然后设备B会:
要么是由于(被修改了寄存器而)发生了中断,然后可以接着处理其所要做的事情;
要么是一直轮训,检测对应的某种资源释放变化,比如上面被改的寄存器的对应的位,发现变化了,再去调用你的函数,做对应的处理。

注意:
中断,不论是哪个设备的中断,都不应该占用(CPU)太长时间
-> 导致别的中断或服务无法及时运行

仅供参考。


【追问】

1.ISR应该是在A设备的驱动中,那么既然是在A设备的驱动中,我可以直接调用有关B设备的内核函数对B设备进行操作吗?

2.B设备进行轮训的话,应该也是在B设备的驱动中进行吧?驱动中的轮训,不知道你是否能举个例子描述一下?

3. 假设我在A设备的驱动中,写了一个由A设备某个资源触发的中断,我如何在应用层得知该中断是否触发呢?感谢您的回答!

【回答】

  1. 不可以。因为A设备的驱动,一般都是基于对应的Linux的其下某种框架下写的驱动的代码,没有直接的独立的函数之类的供你(在你的中断里)直接调用

  2. B 设备轮询,本身就是:未必需要中断,如果是中断了,本身就是为了避免轮询,避免浪费CPU才有的中断。一般可以在Linux的程序即app级别,写对应的程序,循环出检测某个东西的状态之类的。比如你驱动去对外通过proc或sysfs之类的提供接口,然后对应的再去发现状态变化,再去执行对应动作

  3. 在应用层,无法像你想的直接获得对应的中断触发。但是一般可以通过Linux中的一些系统的event去实现你要的效果。我之前了解到的,比如U盘插入Linux系统​,内部就是:底层的肯定是Linux 的USB驱动,检测到USB设备插入,然后向上,向内核的上层,抛对应的event,最终一点点,通知到应用层。你这里,也可以想办法,搞清楚系统有哪些可用利用的event,然后程序中去检测对应的event,即可实现:当底层中断发生了,抛了事件,然后上层应用程序可以捕获,执行你要的动作即可。

转载请注明:在路上 » 【问题解答】linux中,中断注册和中断服务程序只能写在驱动层还是能写在应用层?

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.177 seconds, using 22.07MB memory