У меня есть две процедуры обслуживания прерываний (ISR), которые в основном выполняют то же самое , но каждый обрабатывает прерывание с другого устройства (хотя тот же тип устройства). Поэтому логика одна и та же, но они имеют доступ к различным регистрам процессора и ячейкам памяти.Как избежать дублирования кода между аналогичными 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 с использованием языка сценариев более высокого уровня, но я бы предпочел решение, используя только макросы препроцессора C или C.
С использованием компилятора я должен был бы объявить CommonISR явным образом, чтобы избежать вызова функции. В противном случае это, вероятно, то, что я буду делать. Благодарю. – davitenio