gpt4 book ai didi

c - qnx中的中断服务程序?

转载 作者:行者123 更新时间:2023-11-30 17:36:30 27 4
gpt4 key购买 nike

场景:客户端正在发送数据,服务器正在通过以太网层(udp)接收来自客户端的数据。当服务器在ip层(内核)接收到来自客户端的数据时。它会中断内核,并且内核会执行客户端的数据,所以我想创建一个中断服务函数来捕获来自网络服务卡的中断。

我使用 Interruptattach api 来处理来自网络接口(interface)卡的中断,并使用 sigevent 结构来调用特定函数。 http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/i/interruptattach.html#HandlerFunction

这是在 qnx 中处理中断的正确方法吗??

volatile int id1, id2, id3;
const struct sigevent *handler1(void *area, int id1)
{
volatile double KernelStartExecutionTime;
KernelStartExecutionTime = GetTimeStamp(); // calculating the time when the kernel starts executing

TASK1(Task2ms_Raster);
return (NULL);

}
const struct sigevent *handler2(void *area, int id2)
{
volatile double KernelStartExecutionTime;
KernelStartExecutionTime = GetTimeStamp(); // calculating the time when the kernel starts executing

TASK2(Task10ms_Raster);
return (NULL);

}

const struct sigevent *handler3(void *area, int id3)
{
volatile double KernelStartExecutionTime;
KernelStartExecutionTime = GetTimeStamp(); // calculating the time when the kernel starts executing

TASK3(Task100ms_Raster);
return (NULL);

}


/*kernel calls attach the interrupt function handler to the hardware interrupt specified by intr(i.e irq) */
// InterruptAttach() : Attach an interrupt handler to an interrupt source
// interrupt source is handler1 for this example
void ISR(void)
{

volatile int irq = 0; //0 : A clock that runs at the resolution set by ClockPeriod()

ThreadCtl (_NTO_TCTL_IO, NULL);
id1 = InterruptAttach(irq, &handler1, NULL, 0, 0);
id2 = InterruptAttach(irq, &handler2, NULL, 0, 0);
id3 = InterruptAttach(irq, &handler3, NULL, 0, 0);


}

int main(int argc, char *argv[])
{
Xcp_Initialize();

CreateSocket();

ISR(); //function call for ISR

return 0;
}

另一个问题:如果我想调用 sigevent 结构中的另一个函数,那么我应该使用另一个 ISR(即如何处理中断中的多个函数)吗?

我按照上面修改了我的代码。如果我像上面那样做的话会有效率吗?一个带有 InterruptAttach API 的 ISR 函数可用于三个不同的处理程序。

最佳答案

这是一个不好的方法:中断(IRQ)处理程序是不可中断的。这意味着:1. 当您在其中执行大量工作时,您的计算机将锁定;2. 您无法调用每个方法。

正确的做法是接收IRQ,调用处理程序。处理程序应该创建一个内存结构,用需要完成的详细信息填充它,并将此“任务数据”添加到队列中。然后,后台线程可以等待队列中的元素并完成工作。

这样,IRQ 处理程序就会小而快。您的后台线程可以像您喜欢的那样复杂。如果线程有错误,最糟糕的情况就是线程中断(当队列已满时,使 IRQ 处理程序丢弃事件)。

请注意,队列的实现方式必须确保向其中添加元素永远不会阻塞。查看文档,应该已经有允许多个线程交换数据的东西了;同样的方法也可用于 IRQ 处理程序。

关于c - qnx中的中断服务程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22660251/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com