0

ich das folgende Makro in C geschrieben haben:IAR Compiler Warnung: "Makro erstellen kein gültiges Token"

#define __HAL_CLK_ENABLE(CONTROL_STRUCT,REG,CLK) do { \ 
SET_BIT(CONTROL_STRUCT->REG,##CONTROL_STRUCT##_##REG##_##CLK##EN);\ 
} while(0) 

Makroaufruf in main.c/Alle Parameter werden in cpu spezifischen Header definiert Dateien:

__HAL_CLK_ENABLE(RCC,AHB1ENR,GPIOA); 

Das Ergebnis sollte sein:

SET_BIT(RCC->AHB1ENR,RCC_AHB1ENR_GPIOAEN) 

Dieses Makro funktioniert und aktiviert meinen GPIOA-Port korrekt, aber ich erhalte zwei Compiler-Warnungen. (IAR EW 7.6)

  1. Makro Der Parameter "CONTROL_STRUCT" wird sowohl in erweiterter als auch in Rohform verwendet. (Ich werde diese Warnung ignorieren, denn in diesem Fall ist es richtig, beiden Formen zu verwenden!)

2. Verkettung mit „RCC_AHB1ENR_GPIOAEN“ in Makro „__HAL_CLK_ENABLE“ erstellen kein gültiges Token. (Was bedeutet es, weil die Token wird nach dem Aufruf dieses Makros korrekt und meine Uhr funktioniert aktiviert?)

Dank

EDIT1:

Makrodefinitionen:

#define SET_BIT(REG, BIT)  ((REG) |= (BIT)) 

#define RCC     ((RCC_TypeDef *) RCC_BASE) 

typedef struct 
{ 
...       
__IO uint32_t AHB1ENR; 
... 
} RCC_TypeDef; 

#define GPIOA    ((GPIO_TypeDef *) GPIOA_BASE) 
+2

Sie müssen die Definitionen aller Makros anzeigen. Bitte erstellen Sie ein minimales Beispiel. – 2501

+0

Okay, ich habe alle verwendet Makrodefinitionen – Passe

+0

Ist es möglich, dass der Fehler von der Definition von GPIOA abhängt? – Passe

Antwort

1

„Die Reihenfolge der Auswertung von # und ## Operatoren ist nicht spezifiziert.“ (ISO C99/C11 6.10.3.2, 6.10.3.3) bedeutet ein Makro kann Programmierer Absicht mit einem Compiler nicht aber ein anderer nicht.

In Ihrem Fall ist dies kein großes Problem, wie Ouss4 erwähnt, MISRA-C mehr # oder ## Betreiber empfiehlt gegen, meist Verschleierungs (also eine beratende Leitlinie seiner einzige).

zu vermeiden, aber ihre möglich, mehr # # operators könnte zu einem undefinierten Verhalten führen, wenn eine ## Operation zu einem ungültigen Token führt und dies ist es, worüber IAR warnt.Dies und ein einfaches Beispiel an dem MISRA-C Forum diskutiert "Rule 19.12 (# and ## operator) real issue?”:

define m(a,b) a##.##b

m(1,e30)

das Verhalten auf einem von links nach rechts Auswertung definiert, aber nicht definiert Verhalten auf rechts- nach links, weil .e30 zwei Vorverarbeitungstoken ist.

0

In ##CONTROL_STRUCT##_##REG##_##CLK##EN entfernen Sie die erste ##.

Beachten Sie, dass das, was Sie tun, fehleranfällig ist und von eingebetteten Codierungsstandards nicht empfohlen wird.

MISRA C:

Regel 19.12 (erforderlich): Es wird höchstens ein Auftreten der # oder ## Operatoren in eine einzelne Makrodefinition sein.


Regel 19.13 (Hinweis): Die Operatoren # und ## sollten nicht verwendet werden.

Verwandte Themen