Forum: Compiler & IDEs IAR STM32 inline problem


von Entwickler (Gast)


Lesenswert?

Hi,

ich habe folgende Funktion geschrieben die mir Variablen über die UART 
ausgiebt.
1
void uart (char *text, uint32_t data){ 
2
   static uint8_t first = 0;
3
     
4
   if (first < 1){
5
      printf1("%s:\t", text);
6
      first = 1;
7
   }
8
   else{
9
      printf1("%04u\t", data);    
10
   }   
11
}

Funktioniert soweit auch prima. Beim erstaufruf wird die Überschrift 
ausgegeben und bei allen weiteren aufrufen wird der Wert ausgegeben. 
Somit lässt sich das ganze schön in excel importieren.

Jetzt würde ich diese Funktion gerne mehrfach verwenden. Das heist es 
soll zu jeder Variablen die passende Überschrift ausgegeben werden. 
Deshalb bräuchte ich für jede Funktion die Variable "static uint8_t 
first".

Ich habe versucht dies mit #pragma inline bzw. #pragma inline=forced zu 
lösen.
Leider bekomm ich dabei vom Linker folgenden Fehler:

Error[Li005]: no definition for "uart" [referenced from 
C:\WORKSPACE\proj\EWARM\proj Configuration\Obj\main.o]

Ich vermwende IAR auf einem STM32F4

Hat jemand eine Idee?

von Little B. (lil-b)


Lesenswert?

Was du vor hast, wird mit inlining nicht funktionieren.

Macros könnten dein problem lösen.

Unterschied:
Inline greift immer auf die selbe static variable "first" zu, da nur der 
code, nicht jedoch die variablen vervielfacht werden.
Macros werden vom Präprozessor verarbeitet. So kann eine ganze 
subfunktion mit allen statischen variablen vervielfältigt werden.

Probier mal das aus:
1
#define uart(text,data) {       \
2
   static uint8_t first = 0;    \
3
                                \
4
   if (first < 1){              \
5
      printf1("%s:\t", text);   \
6
      first = 1;                \
7
   }                            \
8
   else{                        \
9
      printf1("%04u\t", data);  \ 
10
   }                            \
11
}

von Entwickler (Gast)


Lesenswert?

gute Idee
Danke
funktioniert

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.