屏蔽中断问题

请问各位高手

1.屏蔽中断的函数InterruptDisable(), Interruptlock()的区别是什么啊?

帮助上说Interruptlock()有保护代码的功能,也就是在一段代码上面和下面分别

加上 Interruptlock()和InterruptUnlock()函数,是不是说在这段代码执行过程

中,所有CPU的中断全部屏蔽(我是希望所有中断都被屏蔽的)?比如时钟中断

什么的。但是我的键盘在那段时间还是能输入啊,还是说我的用法错了?

spinlock* spin=new intrspin_t;
memset(spin,0,sizeof(intrspin_t));
InterruptLock(spin);

InterruptUnlock(spin);

  1. 帮助还说 Interruptlock()要比InterruptDisable()要更合适,为什么啊?

Disable/Enable 就是通常意义上的关中断,对系统的实时性会有影响,要慎用(我主张要禁用)

Mask/Unmask 是用来"屏蔽"某一个中断,这个是最常用的。通常在离开中断服务程序,激活用户态服务程序时会用到。

Lock/Unlock 更像是一个可以在中断服务程序里用的互斥锁,当某一块数据在ISR和用户程序都会被读写到时,要用这个进行保护。

哦,按照您的解释,Lock和Unlock就没有屏蔽中断的功能了。

我其实想要屏蔽所有的中断,那我就必须使用您不推荐的Disable ?

您所说的Disable对于实时性能的影响是什么啊?

本来中断是嵌套的。高优先级中断可以“中断”低优先级中断。如果disable,那么就是说有更紧要的事件时,系统都不能立即响应了。用Disable的话,要尽快Enable。使Disable的时间越短越好。

Disable/Enable只对当前CPU有作用,所以在SMP系统中是无效的.

我试了一下InterruptDisable函数,我CPU是双核四线程的,我将主线程以及3个

子线程分别绑定到这4个核上,然后分别都调用InterruptDisable函数,但是我试

了试键盘,还是可以输入的,请问这是问什么呢? :question:

InterruptDisable/InterruptEnable之间不能有kernel call.

您的意思是说 因为在我在Disable和Enable之间使用了pthread_join()和

pthread_barrier_wait(),所以中断又开启了?

任何内核调用都会重新打开中断.

除非万不得已不要用InterruptDisable/InterruptEnable,而是通过其它手段来实现.
说说你想干什么,大家可以给你建议建议.