dcd
1
请问各位高手
1.屏蔽中断的函数InterruptDisable(), Interruptlock()的区别是什么啊?
帮助上说Interruptlock()有保护代码的功能,也就是在一段代码上面和下面分别
加上 Interruptlock()和InterruptUnlock()函数,是不是说在这段代码执行过程
中,所有CPU的中断全部屏蔽(我是希望所有中断都被屏蔽的)?比如时钟中断
什么的。但是我的键盘在那段时间还是能输入啊,还是说我的用法错了?
spinlock* spin=new intrspin_t;
memset(spin,0,sizeof(intrspin_t));
InterruptLock(spin);
…
InterruptUnlock(spin);
-
帮助还说 Interruptlock()要比InterruptDisable()要更合适,为什么啊?
-
xtang1
2
Disable/Enable 就是通常意义上的关中断,对系统的实时性会有影响,要慎用(我主张要禁用)
Mask/Unmask 是用来"屏蔽"某一个中断,这个是最常用的。通常在离开中断服务程序,激活用户态服务程序时会用到。
Lock/Unlock 更像是一个可以在中断服务程序里用的互斥锁,当某一块数据在ISR和用户程序都会被读写到时,要用这个进行保护。
dcd
3
哦,按照您的解释,Lock和Unlock就没有屏蔽中断的功能了。
我其实想要屏蔽所有的中断,那我就必须使用您不推荐的Disable ?
您所说的Disable对于实时性能的影响是什么啊?
xtang1
4
本来中断是嵌套的。高优先级中断可以“中断”低优先级中断。如果disable,那么就是说有更紧要的事件时,系统都不能立即响应了。用Disable的话,要尽快Enable。使Disable的时间越短越好。
Disable/Enable只对当前CPU有作用,所以在SMP系统中是无效的.
dcd
6
我试了一下InterruptDisable函数,我CPU是双核四线程的,我将主线程以及3个
子线程分别绑定到这4个核上,然后分别都调用InterruptDisable函数,但是我试
了试键盘,还是可以输入的,请问这是问什么呢?
InterruptDisable/InterruptEnable之间不能有kernel call.
dcd
8
您的意思是说 因为在我在Disable和Enable之间使用了pthread_join()和
pthread_barrier_wait(),所以中断又开启了?
除非万不得已不要用InterruptDisable/InterruptEnable,而是通过其它手段来实现.
说说你想干什么,大家可以给你建议建议.