Defines | |
| #define | INTC_DEFINE_HANDLER(id, handler, level) |
| Define an interrupt handler for an integrated peripheral. | |
| #define | intc_set_irq_data(id, data) |
| Associate a data pointer with an interrupt. | |
| #define | intc_get_irq_data(id, pdata) |
| Get the data pointer associated with an interrupt. | |
| #define | intc_setup_handler(id, level, data) |
| Set up an interrupt handler. | |
| #define | intc_remove_handler(id) |
| Remove an interrupt handler. | |
This module includes functionality to help setting up interrupt handlers for internal (on-chip) interrupts. Such interrupts are generated by chip-internal modules and usually have a very direct path to the interrupt handler in order to minimize interrupt latency.
There may be minor differences between architectures, but in general, handlers for internal interrupts are set up in two steps:
Interrupt numbers are specified correspond to the vector number on AVR, and the interrupt group number on AVR32. An AVR32-specific function, intc_get_group_requests(), can be used to distinguish between multiple interrupts inside of a group.
| #define INTC_DEFINE_HANDLER | ( | id, | |||
| handler, | |||||
| level | ) |
extern void *intc_priv_data_sym(id); \ extern void __attribute__((__signal__)) \ intc_priv_entry_sym(id)(void); \ void intc_priv_entry_sym(id)(void) \ { \ handler(intc_priv_data_sym(id)); \ } \ void *intc_priv_data_sym(id)
Define an interrupt handler for an integrated peripheral.
This binds an interrupt handler function to a low-level entry point, which takes care of saving/restoring registers, finding the handler-specific data, and running any code dealing with soft interrupt handling, etc. before returning.
| id | The interrupt vector ID | |
| handler | The interrupt handler function | |
| level | The priority level of this interrupt |
| #define intc_get_irq_data | ( | id, | |||
| pdata | ) |
do { \ extern void *intc_priv_data_sym(id); \ *(pdata) = intc_priv_data_sym(id); \ } while (0)
Get the data pointer associated with an interrupt.
If the value stored in *pdata is NULL, no interrupt handler has been set up for interrupt id.
| id | The interrupt ID | |
| pdata | Pointer to a variable in which to store the data pointer |
| #define intc_remove_handler | ( | id | ) |
do { \ extern void *intc_priv_data_sym(id); \ intc_priv_data_sym(id) = 0; \ } while (0)
Remove an interrupt handler.
This will remove a registered interrupt handler, making it possible to set up a different one by calling intc_setup_handler().
| id | The interrupt ID to disassociate with the handler |
| #define intc_set_irq_data | ( | id, | |||
| data | ) |
| #define intc_setup_handler | ( | id, | |||
| level, | |||||
| data | ) |
do { \ intc_set_irq_data(id, data); \ } while (0)
Set up an interrupt handler.
This function sets up the internal interrupt controller for handling a given interrupt through the specified handler.
| id | The interrupt number to associate with the handler | |
| level | The priority level for this interrupt | |
| data | Data to be associated with this interrupt |
1.6.3