Interrupt Handling, Interview Question for Embedded Systems Engineers

Q: How is ISR handled in vxworks ?
A: VxWorks supplies interrupt routines which connect to C functions and pass arguments to the functions to be executed at interrupt level.  To return from an interrupt, the connected function simply returns.  A routine connected to an interrupt in this way is referred to as an interrupt service routine (ISR) or interrupt handler.  When an interrupt occurs, the registers are saved, a stack for the arguments to be passed is set up, then the C function is called. On return from the ISR, stack and registers are restored.

Q: How do you connect the C Function to any interrupt?
A: Using intConnect(INUM_TO_IVEC(intNum), intHandler, argToHandler).
The first argument to this routine is the byte offset of the interrupt vector to connect to. The second argument is the interrupt handler and the last is any argument to this handler.

Q: Is the C Code directly vectored to Hardware interrupts using IntConnect? Explain?
A:No. Interrupts cannot actually vector directly to C functions. Instead, intConnect( ) builds a wrappper,a small amount of code, that saves the necessary registers, sets up a stack entry (either on a special interrupt stack, or on the current task's stack) with the argument to be passed, and calls the connected function. On return from the function it restores the registers and stack, and exits the interrupt;

Q: Does the ISR use the stack of interrupted Task? Explain?
A: It depends on system architecture.
It is preffered to have a seperate interrupt stack, shared between all ISR's. However, some architectures, do not permit using a separate interrupt stack. On such architectures, ISRs use the stack of the interrupted task. In such sytems we must create tasks with enough stack space to handle the worst possible combination of nested interrupts and the worst possible combination of ordinary nested calls.

Q: What  are the important things to be taken care within ISR?
A:
Avoid blocking calls
No wait for semaphore
No receive messages
No malloc() or free() (since they internally wait fro semaphore)

Q: How can ISR's communicate with user tasks?
A: using:
shared memory and ring buffers
release of semaphores
signaling tasks
writing to pipes
sending messages using message queue