Post by NicolasPost by Hemanth VenkatappaPost by NicolasDo you use sockets to receive data from client ?
Yes. I am receiving the data via socket.
Scenario : client- server communication - client is sender and server is receiver. when the server receives the data on the ethernet interface(UDP) the kernel in the server is triggered. I am using QNX on the server side. server(i.e embedded pc target) is handling interrupts to trigger the embedded pc target (conatining qnx) to gain the attention to execute the newly arrived data. but how to create a ISR to handle this ?? could you please help me ??
Why do you want to use interrupts to "execute" data from client ?
1) Server blocked (waiting for data from client)
2) Incoming data from client -> server unblocked.
3) Server "executes" data
4) goto 1)
When ever the data is received on the Ethernet interface from the client then the interface card will make the hardware interrupt to the microprocessor ( embedded PC target is the server ) . Then microprocessor will make a software interrupt to the kernel to start execute the newly arrived data . The user as to handle the software interrupt .
So i configure the ISR to handle the interrupt and code is shown below:
const struct sigevent *handler1(void *area, int id1)
{
volatile double KernelStartExecutionTime;
struct sigevent *event = (struct sigevent *)area;
KernelStartExecutionTime = GetTimeStamp(); // calculating the time when the kernel starts executing
measurements[18] = KernelStartExecutionTime ;
//return (NULL);
return event;
}
/*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 configureISR(void) //void *ISR (void *arg)
{
/* the software must tell the OS that it wishes to associate the ISR with a particular source of interrupts.
* On x86 platforms, there are generally 16 hardware Interrupt Request lines (IRQs) */
volatile int irq = 0; //0 : A clock that runs at the resolution set by ClockPeriod()
struct sigevent event;
event.sigev_notify = SIGEV_INTR;
ThreadCtl (_NTO_TCTL_IO, NULL); // enables the hardware interrupt
id1 = InterruptAttach(irq, &handler1, &event, sizeof(event), 0); // handler1 is the ISR
InterruptWait( 0, NULL );
InterruptUnmask(irq, id1);
InterruptDetach( id1);
}
int main(int argc, char *argv[])
{
CreateSocket(); // receiving the data from client
configureISR();
// pthread_create (NULL, NULL, ISR, NULL);
return 0;
}
Is the above code is the right way to handle interrupts in qnx??