多中断怎么写

我现在刚接触QNX,多串口和IO口的操作没什么问题,但是用中断不会用,主要是InterruptAttach中多中断怎么声明,对中断isr_handler的返回值event怎么设定 ,怎么把中断信号响应与函数联系起来,就是说中断怎么于中断响应函数绑定,肯请各为指教。有例子最好。
main ()
{
pthread_create (NULL, NULL, int_thread, NULL);

}
void * int_thread (void *arg)
{
硬件初始化

InterruptAttach (IRQ7, isr_handler, NULL, 0, 0);/跳线设置中断等级为7/
while (1)
{
InterruptWait (NULL, NULL); /等待中断发生,信号SIGEV_INTR/
采集数据

}
}
isr_handler (void *arg, int id)
{
// look at the hardware to see if it caused the interrupt
// if not, simply return (NULL);

// return a pointer to an event structure (preinitialized
// by main) that contains SIGEV_INTR as its notification type.
// This causes the InterruptWait in “int_thread” to unblock.
return (&event);
}

event可以是pulse, signal, 或者就是像你的例子一样的是个SIGEV_INTR。你的例子基本可以运行了,就是event要初始化一下。注意event一定要定义在中断处理的外面。

main () 
{ 
    pthread_create (NULL, NULL, int_thread, NULL); 
    ... 
} 

struct sigevent event;

void * int_thread (void *arg) 
{ 
    SIGEV_INTR_INIT(&event);

    硬件初始化 
   ... 
    InterruptAttach (IRQ7, isr_handler, NULL, 0, 0);/*跳线设置中断等级为7*/ 
    while (1) 
   { 
        InterruptWait (NULL, NULL); /*等待中断发生,信号SIGEV_INTR*/ 
        采集数据 
     ... 
    } 
} 

isr_handler (void *arg, int id) 
{ 
    // look at the hardware to see if it caused the interrupt 
    // if not, simply return (NULL); 

    // return a pointer to an event structure (preinitialized 
    // by main) that contains SIGEV_INTR as its notification type. 
    // This causes the InterruptWait in "int_thread" to unblock. 
    return (&event); 
}

[/code]

谢谢ETANG的回答,我就是fangxiong;以前的密码给忘记了,我还有两个问题不明白:
(1)我对8259初始化时就死机,弄不懂什么原因,如果我不初始化8259,中断都正常,这是为什么。
(2)如果要写多中断,怎么来区别中断是那个中断号产生的,因为EVENT的返回值都是一样的,我用多中断是用了两个interruptattach(IRQ1,isr_handle),interruptattach(IRQ2,isr_handle)函数,可以改为响应不同的isr_handle函数,但是EVENT返回值一样,还有isr_handle中的ID的值指的是什么,我考虑了增加返回不同的参数的,最有效率的办法是什么。

(1) 有没有 ThreadCtl() 过了呢?具体什么初始化动作会导至死机?我猜是你的isr_handle()里使用了不可以在中断处理中使用的函数。InterruptAttach()的中断处理程序里,有许多函数是被禁示使用的。(程序库文档中,每个函数都有一个是不是 Interrupt Safe 的说明)基本上, 中断服务程序里,什么函数都不能调用,只能看一下硬件寄存器。

(2) 中断服务程序的 “id” 参数,就是InterruptAttach()返回的那个 “id” 。

你的多中断问题,有两种方法。

a) 开两(多个)线程,每个都做InterruptAttach(),然后InterruptWait(),Wait()收到的总是同一个线程Attach()的那个。

b)可以把event改成别的东西。比如,是一个pulse (SIGEV_PULSE_INIT)。这样,主程序就可以用 MsgReceivePulse()来代替InterruptWait()。 Pulse是可以带一个 value 的。

谢谢XTANG !
(1)我初始化8259(中断控制器)时就死机,我初始的时候在目标机上就死机,并且画面上出现stack地址和数据 shutdown等。是不是在QNX上不能对8259初始化,有BIOS初始话就可以,我不初始化8259也可以用,那是BIOS初始话的(x86),但是在DOS下可以初始化的,DOS下的中断向量,在QNX下是一样的吗:如IRQ8 的中断号是8 中断向量是70 ,在QNX有没有类似定义的

(2)用多线程做多中断或改变EVENT的值,那一个实时性能更好。我个人认为做多线程实性好,不知道先生怎么看。

  1. 中断控制器是由操作系统控制的,在内核启动时就被初始化过了。这样才能保证内核收到中断请求并进行适当处理。你为什么需要初始化中断控制器呢?

  2. 用多线程的要好一点。

中断控制器有操作系统控制,那就是说进入操作系统后没办法多控制控制器操作,比喻说是中断的触发方式(电平或边沿) 就没办法改变了吗?像x86只能通过BIOS来设置中断,在QNX操作系统中不能更改BIOS设置了吗。

QNX操作系统的启动,经过IPL, Startup, 然后才是 Kernel。

中断控制器的控制,通过调用“中断外调”(Interrupt Callout)来实现。中断外调是写在startup里的。如果你要修改对中断控制器的控制,你要修改中断外调。如果你有BSP(Board Support Package)的话,startup的源码应该是附在里面的。

关于如何写startup,Help里有详细的说明。在线版本在这里。

http://www.qnx.com/developers/docs/6.3.0SP1/neutrino/building/startup.html

我们公司买的时候说是全套 竟然没有BSP BSP是不是要单独购买?

关于BSP,要问你的供应商。不过,具体你为什么要修改中断控制器呢?