Forum: Mikrocontroller und Digitale Elektronik Frage zu #define


von Siegfried S. (dieleena)


Lesenswert?

Hallo,
MPLAP 8.14 und C18
habe eine Frage zu #define
So wie ich das aus Doku verstanden habe, ersetzt der Compiler den Wert 
in einer von "#define" deklarierte Angabe.
z.B.
#define nTimeOn 100
oder
#define nnTimeOn 100

unsigned int TimeOn;
...
TimeOn = nTimeOn; also 100
Habe allerdings bemekt, das dieses viel Speicher benötigt.
hier das Listing

C Code  TimeOn=nTimeOn;
Info 160: #define nTimeOn steht in einer *.h  " 18 BYTE werden benötigt 
"
160:               TimeOn=nTimeOn;
  1AAE    0103     MOVLB 0x3
  1AB0    0E14     MOVLW 0x14
  1AB2    194D     XORWF 0x4d, W, BANKED
  1AB4    E101     BNZ 0x1ab8
  1AB6    514E     MOVF 0x4e, W, BANKED
  1AB8    E002     BZ 0x1abe
  1ABA    0E00     MOVLW 0
  1ABC    D001     BRA 0x1ac0
  1ABE    0E01     MOVLW 0x1

C Code  TimeOn=nnTimeOn;
Info 161: #define nTimeOn steht in der *.c  " 16 BYTE werden benötigt "
161:               TimeOn=nnTimeOn;
  1AC0    0E14     MOVLW 0x14
  1AC2    194D     XORWF 0x4d, W, BANKED
  1AC4    E101     BNZ 0x1ac8
  1AC6    514E     MOVF 0x4e, W, BANKED
  1AC8    E002     BZ 0x1ace
  1ACA    0E00     MOVLW 0
  1ACC    D001     BRA 0x1ad0
  1ACE    0E01     MOVLW 0x1

C Code  TimeOn=100;
Info 162: hier übergebe ich direkt den Wert  " 6 BYTE werden benötigt "
162:               TimeOn=100;
  1AD0    0E64     MOVLW 0x64
  1AD2    6F4D     MOVWF 0x4d, BANKED
  1AD4    6B4E     CLRF 0x4e, BANKED

Habe ich einen Denkfehler oder warum wird hier unterschiedlich viel 
Speicher benötigt?

Gruß Siegfried

von Johannes M. (johnny-m)


Lesenswert?

Siegfried Saueressig wrote:
> Hallo,
> MPLAP 8.14 und C18
Meinst Du vielleicht MPLAB?

> habe eine Frage zu #define
> So wie ich das aus Doku verstanden habe, ersetzt der Compiler den Wert
Nicht der Compiler, sondern der Präprozessor. Der Compiler bekommt 
Zeilen, die mit einem "#" beginnen, überhaupt nicht zu sehen.

> in einer von "#define" deklarierte Angabe.
...auch Makro genannt...
> z.B.
> #define nTimeOn 100
> oder
> #define nnTimeOn 100
>
> unsigned int TimeOn;
> ...
> TimeOn = nTimeOn; also 100
> Habe allerdings bemekt, das dieses viel Speicher benötigt.
Grundsätzlich kann eine Präprozessoranweisung gar keinen Speicher im 
Zielsystem verbrauchen. Der "Fehler" muss also woanders liegen.

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
könnte mich .....
In Ordnung, habe beim schreiben etwas verwechselt "Nicht der Compiler, 
sondern der Präprozessor."
Hatte das geschrieben. "#define nTimeOn = 100"
Teilweise ist erledigt.
folgendes Listing habe ich jetzt.

C Code  TimeOn=nTimeOn;
Info 160: #define nTimeOn steht in einer *.h  " 8 BYTE werden benötigt
160:               TimeOn=nTimeOn;
  14FA    0E14     MOVLW 0x14
  14FC    0103     MOVLB 0x3
  14FE    6F4D     MOVWF 0x4d, BANKED
  1500    6B4E     CLRF 0x4e, BANKED

C Code  TimeOn=nnTimeOn;
Info 161: #define nTimeOn steht in der *.c  " 4 BYTE werden benötigt "
161:               TimeOn=nnTimeOn;
  1502    6F4D     MOVWF 0x4d, BANKED
  1504    6B4E     CLRF 0x4e, BANKED

C Code  TimeOn=100;
Info 162: hier übergebe ich direkt den Wert  " 6 BYTE werden benötigt "
162:               TimeOn=100;
  1506    0E64     MOVLW 0x64
  1508    6F4D     MOVWF 0x4d, BANKED
  150A    6B4E     CLRF 0x4e, BANKED

Gruß Siegfried

von ROFL (Gast)


Lesenswert?

also, das ganze hängt vermutlich mit den optimierungsfähigkeiten deines 
compilers zusammen:

der compiler bemerkt, dass sich bestimmte register seit dem letzten 
zugriff nicht geändert haben, darum werden sie in den nachfolgenden 
zeilen nicht mehr erneut auf den gleichen wert gesetzt.

zeile 160:
  14FA    0E14     MOVLW 0x14
  14FC    0103     MOVLB 0x3


daran ändert sich bis zeile 161 nichts, also rausoptimieren.

offenbar ist dein Makro nTimeOn aber nicht 100 sondern 0x14.

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.