[请教]关于中断和优先级

QNX的中断有优先级的吧。
譬如使用 pidin, 看到一个 audio 的中断的优先级是50。

那么,如果一个线程有更高的优先级,比方说100,
这样的话此线程在执行的时候会被那个 audio 中断么?

顺便问一下,怎样改变一个已经运行的进程/线程的优先级?

还有,当一个call back函数的条件满足的时候,接下来的操作是怎样的?
系统是立刻响应,生成一个新的线程,立刻执行call back函数呢?
还是仅仅给与这个线程一定的优先级,然后执行现有的最高优先级的线程呢?

感谢答复!

有两个概念你搞混了。

“中断”的优先级永运高于线程。也就是说,不管当前运行线程的优先级是什么,CPU接到中断后会立即跳去“中断服务程序“ (Interrupt Service Routine - ISR)。在QNX里,ISR是通过 InterruptAttach()来挂接的。

更多的时候,QNX可以用InterruptAttachEvent()在中断上挂接一个”事件”,这样中断发生时,CPU立即跳去处理那个“事件”,而这个事件,则很可能激活用户空间的某个线程,由这个用户空间的线程,对中断进行处理。在这种情况下,用户空间的线程的优先级决定了不同中断处理的先后关系。

用你的例子,如果audio有个为中断服务的线程运行在50上;audio有中断来,这线程正在50上处理中断。另一个中断发生,CPU立即跳转处理新中断的事件,其结果,导致另一个优先级100的线程被激活;这时,这个100的线程会抢占CPU,audio的中断处理会被暂停下来。虽然它们都是处理中断的线程,但在系统调度上,只是把它们当作一般的用户线程进行调度的。

[url=http://www.qnx.com/developers/docs/6.4.1/neutrino/lib_ref/p/pthread_setschedparam.html] pthread_setschedparam() [/url] 用来修改优先级。

那么,那么说的话,我是不是可以这么认为:

如果一个中断激活了某线程,那么它会作为处理中断的线程而得到立刻执行。但是因为系统把它当作一般的用户线程而进行调度,所以当它的时间片结束,或者是有其它中断,或者是有更高优先级的用户线程,它将被暂停,系统会转为处理其它的任务。

是这样么?


还有,关于call back函数的问题。是挂接在硬件中断上的”事件”么?
能不能详细解释一下系统执行call back函数的流程呢?

最后,感谢答复。

这个是用来设定将要创建的线程的优先级吧。
我想问的是如何修改已经在运行的线程的优先级。。。

是。而且“处理中断的线程得到立刻执行“也是不正确的。只能说“处理中断的线程被激活,参与调度”,也可能在那个时候,已经有别的更高优先级的线程正在运行呢。

所谓call back,不是一个操作系统概念。我猜你这里是在讲io-usb的callback,这个具体是由中断处理线程直接回调,还是通过别的线程“摆渡”一下,还得看io-usb是怎么设计的。

不是。这个函数的第一个参数就是线程id,在创建线程前显然是不知道 thread id 的。当然你也可以直接调用内核调用 SchedSet() (不太推荐)。或者直接用 “slay -T -P " 来改。

顺便提一下,“将要创建的线程的优先级” (或是别的设定),是通过 pthread_attr_*()来设一个合适的pthread_attr_t, 然后在 pthread_create()时,把attr传进去来实现的。

看了官网关于那2个函数的解释。我是不是可以这么认为:

InterruptAttach()函数就是一直以来沿用至今的中断,用尽可能少的时间处理中断的相关事务。它只能被中断。(那么,它是以什么身份运行的?哪一个进程或者线程运行它呢?优先级又怎么确定?)

而函数InterruptAttachEvent()则是生成/激活一个线程,并向其传递某“事件”(这里的事件是什么东西?),至于它是否能够马上运行,要看其优先级。
Interrupt handling code runs at the thread’s priority, which lets you specify the priority of the interrupt handling.
就是说,处理中断的就是这个线程,而其优先级可以被指定。
There might be a delay before the interrupt handling code runs (until the thread is scheduled to run).
但是因为作为普通线程被调度,可能无法马上执行。

io-usb 怎么设计的还不知道。估计很难知道。。。
这么说,call back 不是中断的一种?。。。

抱歉,我之前搞错了。

是。准确地说,是“用尽可能短的时间开始执行ISR“,也就是通常说的最短的中断延迟。(Interrupt Latency). 至于“处理”一个中断所要的时间,是由你写的ISR来决定的。

这个时候,ISR是在“内核态”运行的。它没有什么优先级(或者说它高于一切用户态的线程优先级)。内核收到中断,检查中断向量号,(地址空间翻转),直接调用ISR。

正确。这里的事件是一个 sigevent 结构。通常可以是个脉冲,或者一个“中断事件”。