Forum: Mikrocontroller und Digitale Elektronik Frage zu: #define, #undef und #include


von brechbunkt (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei den SMC (Static Memory Controller) für den AVR32 
einzubinden, der bereits fertig im ASF von Atmel angeboten wird.

Anhand des nachfolgenden Code Ausschnitts aus der header-Datei, wird der 
SMC für jeden externen Chip, bzw. dessen Chip_Select configuriert:
1
#ifndef SMC_COMPONENT_CS0
2
#ifndef SMC_COMPONENT_CS1
3
#ifndef SMC_COMPONENT_CS2
4
#ifndef SMC_COMPONENT_CS3
5
#ifndef SMC_COMPONENT_CS4
6
#ifndef SMC_COMPONENT_CS5
7
8
#warning SMC default configuration is missing.
9
//! SMC Peripheral Memory Size in log2(Bytes)
10
#define EXT_SM_SIZE            17
11
12
//! SMC Data Bus Width
13
#define SMC_DBW                16
14
15
//! Whether 8-bit SM chips are connected on the SMC
16
#define SMC_8_BIT_CHIPS        false
17
18
// NWE setup length = (128* NWE_SETUP[5] + NWE_SETUP[4:0])
19
//! Unit: ns.
20
#define NWE_SETUP                0
21
22
// NCS setup length = (128* NCS_WR_SETUP[5] + NCS_WR_SETUP[4:0])
23
//! Unit: ns.
24
#define NCS_WR_SETUP             0
25
26
// .....
27
// .....  viele, viele Einstellungen
28
// .....
29
30
#endif
31
#endif
32
#endif
33
#endif
34
#endif
35
#endif

Wie im nachfolgenden Ausschnitt werden diese Einstellungen dann genutzt, 
um den entsprechenden Code auszuführen.
1
//! Whether to use the NCS0 pin
2
#ifdef SMC_USE_NCS0
3
  #include SMC_COMPONENT_CS0       //  <----------  zu dem hier habe ich meine Frage
4
5
//...
6
//... Einstellung der Register
7
//...
8
9
  #undef EXT_SM_SIZE
10
  #undef SMC_DBW
11
  #undef SMC_8_BIT_CHIPS
12
  #undef NWE_SETUP
13
  #undef NCS_WR_SETUP
14
  #undef NRD_SETUP
15
  #undef NCS_RD_SETUP
16
  #undef NCS_WR_PULSE
17
  #undef NWE_PULSE
18
  #undef NCS_RD_PULSE
19
  #undef NRD_PULSE
20
  #undef NCS_WR_HOLD
21
  #undef NWE_HOLD
22
  #undef NWE_CYCLE
23
  #undef NCS_RD_HOLD
24
  #undef NRD_CYCLE
25
  #undef TDF_CYCLES
26
  #undef TDF_OPTIM
27
  #undef PAGE_MODE
28
  #undef PAGE_SIZE
29
  #undef NCS_CONTROLLED_READ
30
  #undef NCS_CONTROLLED_WRITE
31
  #undef NWAIT_MODE
32
#endif
33
34
35
//! Whether to use the NCS1 pin
36
#ifdef SMC_USE_NCS1
37
  #include SMC_COMPONENT_CS1       //  <----------  zu dem hier habe ich meine Frage
38
39
//...
40
//... das ganze noch mal für SMC_COMPONENT_CS1, SMC_COMPONENT_CS2, SMC_COMPONENT_CS3, SMC_COMPONENT_CS4 und SMC_COMPONENT_CS5
41
//...

Compiliere ich das ganze dann, erhalte ich die Fehlermeldung:
1
Error: #include expects "FILENAME" or <FILENAME>

Die Fehlermeldung kommt natürlich zu Recht, da die Zeile
1
  #include SMC_COMPONENT_CS1
das Einbinden einer Header-Datei verlangt. Lösche ich diese Zeile, läuft 
der Speicher wie gewollt.

Was ich hier nur nicht verstehe ist, wie das ganze eigentlich gedacht 
gewesen sein soll. Die vielen "#undef"-Befehle deuten ja schon darauf 
hin, dass die definierten Werte immer wieder neu eingebunden werden 
sollen.
Aber ich kann doch so nicht die ganzen #define-Zeilen (von der 
Header-Datei) per #include einbinden. Oder?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

brechbunkt schrieb:
> Die Fehlermeldung kommt natürlich zu Recht, da die Zeile
>  #include SMC_COMPONENT_CS1
> das Einbinden einer Header-Datei verlangt.
Richtig. Und wenn da nirgends was steht wie
#define SMC_COMPONENT_CS1 <die_headerdatei.h>
oder
#define SMC_COMPONENT_CS1 "c:\meine_header\die_headerdatei.h"
dann könnte es sein, dass du dieses #define auf der 
Compiler-Kommandozeile erledigen kasnnt/sollst/musst. Sieh dir mal die 
originalen Makefiles an.

> Lösche ich diese Zeile, läuft der Speicher wie gewollt.
Ist doch toll. Dann lass es so...  ;-)

von Klaus W. (mfgkw)


Lesenswert?

Lothar Miller schrieb:
> #define SMC_COMPONENT_CS1 "c:\meine_header\die_headerdatei.h"

Nebenbei: einen Backslash (\) in include-Namen zu verwenden ist 
suboptimal.

(Nur für den Fall, daß mal einer sagt "das stand aber so bei 
mikrocontroller.net")

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.