У меня есть две подпрограммы обработки прерываний (ISR), которые в основном делают то же самое
вещь, но каждый обрабатывает прерывание от другого устройства (хотя устройства того же типа). Следовательно, логика одинакова, но они обращаются к разным регистрам ЦП и ячейкам памяти.
В качестве простого примера рассмотрим следующий код:
extern volatile unsigned int dev1_rx_buffer;
extern volatile unsigned int dev2_rx_buffer;
volatile unsigned char data;
void __attribute__((__interrupt__)) _dev1_interrupt(void)
{
/* Clear interrupt flag */
dev1.IF = 0;
if (dev1.IS_FULL) {
/* Read data from device */
data = dev1_rx_buffer;
} else {
/* do something else using registers of device 1 */
}
/* More stuff using registers of device 1 */
}
void __attribute__((__interrupt__)) _dev2_interrupt(void)
{
/* Clear interrupt flag */
dev2.IF = 0;
if (dev2.IS_FULL) {
/* Read data from device */
data = dev2_rx_buffer;
} else {
/* do something else using registers of device 2 */
}
/* More stuff using registers of device 2 */
}
Как я могу избежать дублирования кода с ограничениями, которые применяются к ISR
(т.е. я не могу передать параметры в ISR, и следует избегать вызовов функций
из-за их накладных расходов).
Я подумал о написании шаблона для генерации двух ISR с использованием языка сценариев более высокого уровня, но я бы предпочел решение, использующее только макросы препроцессора C или C.