Forum: Mikrocontroller und Digitale Elektronik Handler konfigurierbar machen in C


von HadriansWall (Gast)


Lesenswert?

Hi Leute,

ich stehe etwas auf dem Schlauch, vielleicht hat ja jemand einen 
Lösungsansatz zu folgendes Problem:

Randbedingungen: STM32,Keil-MDK, CMSIS sonst nichts (also kein OS, kein 
HAL, kein PeriphLib)

Ich möchte gerne einen Interrupthandler (Timerinterrupt) für den Empfang 
von Daten verwenden. Momentan ist der statisch einem Timer zugeordnet, 
d.h. der Kollege heisst aktuell
1
void TIM17_IRQHandler (void){
2
 Empfangsroutine();
3
}

Gibt es eine Möglichkeit, dass man in einer Header-File beispielsweise 
"TIM6" einträgt und daraus dann
1
void TIM6_IRQHandler (void){
2
  Empfangsroutine();
3
}

entsteht?

von Micha (Gast)


Lesenswert?

Das ließe sich mit http://arnold.uthar.net/index.php?n=Work.TemplatesC 
machen. Der Ansatz funktioniert, ist allerdings kryptisch zu lesen und 
beim Debuggen siehst du nicht mehr den tatsächlichen Namen. Siehe 
Beitrag "Re: Concatenation und anschließende Zuweisung eines Wertes" und folgende.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das sollte der Präprozessor mit dem ##-Operator hinbekommen.

Ungetestet:
1
#define NAME TIM17
2
//#define NAME TIM6
3
4
5
#define HANDLER NAME##_IRQHandler
6
7
8
void HANDLER(void)
9
{
10
}

Viel Erfolg.

von Micha (Gast)


Lesenswert?

Das ist ja (zu) einfach ;-)

von HadriansWall (Gast)


Lesenswert?

Danke euch beiden!!

Rufus' Methode funktioniert. (Ich habe keine Ahnung, wieso ich nicht 
selbst auf den ##-Operator kam. Offensichtlich zu wenig Koffein im Blut)

@Micha:
Templates mit C kannte ich noch nicht, lese ich mir gerade durch!

von Äääähmmmm (Gast)


Lesenswert?

Warum unbedingt mit Verkettung?
Ich finde es so übersichtlicher:
1
#ifdef TIM6
2
  #define TIMER_HND_EMPFANG TIM6_IRQHandler
3
#elsif TIM7
4
  #define TIMER_HND_EMPFANG TIM7_IRQHandler
5
#else 
6
  #error "...
7
#endif
8
9
...
10
11
void TIMER_HND_EMPFANG (void){
12
  Empfangsroutine();
13
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.