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 在获取锁之前禁止软件中断, 但是硬件中断留作打开的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)