e28f400e0c
This patch introduces the interrupt.h header file which provides some helper macros to set a interrupt handler and disable/enable maskable hardware interrupts. Since there is no easy way to write an Interrupt Service Routines (ISR) in C (for further information on this, see [1]), we introduce the SET_INTERRUPT_HANDLER helper macro. The macro does two things: 1) Defines an assembly trampolin to a C function that will, indeed, handle the interrupt. 2) Sets the corresponding interrupt gate descriptor in IDT. The macro usage is pretty straightforward. The macro is defined as SET_INTERRUPT_HANDLER(num, has_error_code, handler) where: @num: Interrupt number (0-255) @has_error_code: 0 if processor doesn't push error code onto the stack. Otherwise, set this argument to 1. @handler: Pointer to function that should be called once the interrupt is raised. In case has_error_code == 0 the function prototype should be the following: void handler(void) Otherwise, it should be: void handler(struct interrupt_context context) For instance, let's say we want to set a handler for a device interrupt (for example, interrupt number 101). Remember, hardware interrupts don't have error code. So we should have something like this: void interrupt_handler(void) { /* Handling code here */ } void my_device_init(void) { ... SET_INTERRUPT_HANDLER(101, 0, interrupt_handler); ... } Now, let's say we want to set an interrupt handler for Page Fault (interrupt number 14). Some exceptions, such as Page Fault, pushes an error code onto the stack and may require registers values in order to be properly be handled. Thus, the code should look like this: void pagefault_handler(struct interrupt_context context) { /* Handling code here */ } void init_memory(void) { ... SET_INTERRUPT_HANDLER(14, 1, pagefault_handler); ... } For further information about exceptions and error code, refer to Intel Combined Manual, Vol. 3, Sections 6.3 and 6.13. Finally, we don't define any API to unregister interrupt handlers since we believe that it wouldn't be useful at all, at least at this moment. Considering Contiki's context, interrupt handler registration is pretty "static" and defined at compile-time by platform code (or the device drivers used by the platform). [1] http://wiki.osdev.org/Interrupt_Service_Routines |
||
---|---|---|
.. | ||
6502 | ||
arm | ||
avr | ||
cc26xx-cc13xx | ||
cc253x | ||
cc2430 | ||
cc2538 | ||
mc1322x | ||
msp430 | ||
native | ||
pic32 | ||
rl78 | ||
stm32w108 | ||
x86 |