Hallo zusammen,
ich "arbeite" mit dem ARM-GCC-none-Eabi. Folgende Definitionen sind
vorhanden:
1 | // Aus der STM424xx.h
|
2 | #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
|
3 | #define GPIO_Pin_5 ((uint16_t)0x0020) /* Pin 5 selected */
|
4 |
|
5 |
|
6 | // Mein Teil
|
7 | #define GLCD_DATA_D0_GPIO GPIOC
|
8 | #define GLCD_DATA_D0_Pin GPIO_Pin_5
|
9 |
|
10 | #define GLCD_DATA_D0_GPIO GPIOC
|
11 | #define GLCD_DATA_D0_Pin GPIO_Pin_5
|
12 | ...
|
Die folgende Funktion ist mit den obigen Definitionen ein konstanter
Ausdruck:
1 | /* Testen, ob alle GPIO-Pins in einer Reihe liegen. Sollte wegoptimiert werden. */
|
2 | static inline bool isInline(void)
|
3 | {
|
4 | if( ((GLCD_DATA_D0_GPIO) == (GLCD_DATA_D1_GPIO)) &&
|
5 | ((GLCD_DATA_D0_GPIO) == (GLCD_DATA_D2_GPIO)) &&
|
6 | ((GLCD_DATA_D0_GPIO) == (GLCD_DATA_D3_GPIO)) &&
|
7 | ((GLCD_DATA_D0_GPIO) == (GLCD_DATA_D4_GPIO)) &&
|
8 | ((GLCD_DATA_D0_GPIO) == (GLCD_DATA_D5_GPIO)) &&
|
9 | ((GLCD_DATA_D0_GPIO) == (GLCD_DATA_D6_GPIO)) &&
|
10 | ((GLCD_DATA_D0_GPIO) == (GLCD_DATA_D7_GPIO)) &&
|
11 | ((GLCD_DATA_D0_Pin)<<1 == (GLCD_DATA_D1_Pin)) &&
|
12 | ((GLCD_DATA_D0_Pin)<<2 == (GLCD_DATA_D2_Pin)) &&
|
13 | ((GLCD_DATA_D0_Pin)<<3 == (GLCD_DATA_D3_Pin)) &&
|
14 | ((GLCD_DATA_D0_Pin)<<4 == (GLCD_DATA_D4_Pin)) &&
|
15 | ((GLCD_DATA_D0_Pin)<<5 == (GLCD_DATA_D5_Pin)) &&
|
16 | ((GLCD_DATA_D0_Pin)<<6 == (GLCD_DATA_D6_Pin)) &&
|
17 | ((GLCD_DATA_D0_Pin)<<7 == (GLCD_DATA_D7_Pin)) )
|
18 |
|
19 | return true;
|
20 | else
|
21 | return false;
|
22 | }
|
Gibt es einen Weg, aus dieser konstanten Funktion, die auch vom
Optimizer völlig korrekt zu "#1" zusammengekürzt wird, einen konstanten
Ausdruck zu machen, um zur Compilezeit zu warnen?