Ich habe zwei Interrupt-Service-Routinen (ISR), die im Grunde die gleiche Sache, aber jeder behandelt einen Interrupt von einem anderen Gerät (obwohl der gleiche Typ von Gerät). Daher ist die Logik die gleiche, aber sie greifen auf verschiedene CPU-Register und Speicherplätze zu.Wie vermeidet man Code-Duplizierung zwischen ähnlichen ISRs?
Als ein einfaches Beispiel den folgenden Code:
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 */
}
Wie kann ich die Code-Duplizierung mit den Einschränkungen zu vermeiden, die auf ISRs gilt (dh ich kann nicht Parameter übergeben, um die ISR und Funktionsaufrufe sollen vermieden werden wegen ihrer Overhead).
Ich habe daran gedacht, eine Vorlage zu schreiben, aus der die zwei ISRs mit einer höheren Skriptsprache generiert werden, aber ich würde eine Lösung bevorzugen, die nur C oder C Präprozessormakros verwendet.
Mit dem Compiler, den ich verwende, müsste ich CommonISR explizit als Inline deklarieren, um einen Funktionsaufruf zu vermeiden. Ansonsten werde ich das wahrscheinlich tun. Vielen Dank. – davitenio