linux 内核怎么设置中断gpio

linux 内核怎么设置中断gpio,第1张

我也不完全理解,但是比你知道的多点。

Linux中,分内核态和用户态。

你写的所有的驱动,都是出于内核态->可以直接使用内核相关资源;

应用层,都是用户态->无法直接 *** 作底层的东西 ->想要 *** 作,比如获得权限,切换到内核态,然后才能 *** 作。

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

对应你这句

“在中断服务程序中 *** 作另一个外设”

不知道你的目的和打算用的手段是啥

一般的,ISR中, *** 作别的设备,常见的是:

设置对应的(比如该硬件本身,或者别的设备B的)寄存器的对应的位,以便通知其某种事情发送或状态变化了。

然后设备B会:

要么是由于(被修改了寄存器而)发生了中断,然后可以接着处理其所要做的事情;

要么是一直轮训,检测对应的某种资源释放变化,比如上面被改的寄存器的对应的位,发现变化了,再去调用你的函数,做对应的处理。

进入中断时候关闭全局的中断是为了避免程序处理中断过程中,再进入另一个中断打乱执行的顺序,也就是为了防止中断嵌套的情况发生。比如在irq_handler函数中首先就应该关闭中断。或者,在某些 *** 作顺序中是不允许中断发生打断的情况。例如在驱动中常用的方式:

unsigned int flag

local_irq_save(&flag)

... ... ... ...

local_irq_restore(&flag)

spin_loc_irqsave 禁止中断(只在本地处理器)在获得自旋锁之前之前的中断状态保存在 flags 里. 如果你绝对确定在你的处理器上没有禁止中断的(或者, 换句话说, 你确信你应当在你释放你的自旋锁时打开中断),你可以使用 spin_lock_irq 代替, 并且不必保持跟踪 flags. 最后, spin_lock_bh 在获取锁之前禁止软件中断, 但是硬件中断留作打开的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7846021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存