Forum: Mikrocontroller und Digitale Elektronik Formel bläht Code auf


von Nils (Gast)


Lesenswert?

Moin,

ich habe folgende Formel:
1
#define F_CPU 16000000LU              //CPU Takt
2
#define faktor (F_CPU/(256*1024*10))

Wenn ich von hand rechne kommt da 6.1xxxx heraus. Wenn ich allerdings 
nun faktor benutze wird der Code gleich gewaltig größer. Ist ja klar, 
der setzt da eine Kommazahl rein. Wenn ich allerdings ein (char) oder 
(uint8_r) davor setze, ist der erzeugte Code immernoch rund 100Byte 
größer als wenn ich manuell eine 6 eintrage.

Wo ist das Problem?

z.b.
1
PORTA = faktor; // 100byte mehr als
2
PORTA = 6; //dieses

mfg

von Εrnst B. (ernst)


Lesenswert?

Nils schrieb:
> Wo ist das Problem?

Vergessen die Compileroptimierung (-Os z.B.) einzuschalten?

von Nils (Gast)


Lesenswert?

Nein, die habe ich auf 2 oder 3.

von Εrnst B. (ernst)


Lesenswert?

Dann schau mal in den generierten ASM-Code, was er daraus macht.

von Nils (Gast)


Lesenswert?

Der scheint da ne Menge ldi und call reinzuschieben. Mir scheint, dass 
der ne int oder long vorher berechnet und dann die ersten 8 bit in PORTA 
reinschiebt, statt ein einziges ldi zu schreiben.

von Mark B. (markbrandis)


Lesenswert?

Nils schrieb:
> Der scheint da ne Menge ldi und call reinzuschieben. Mir scheint, dass
> der ne int oder long vorher berechnet und dann die ersten 8 bit in PORTA
> reinschiebt, statt ein einziges ldi zu schreiben.

Und dafür einhundert Bytes? Krass...

von Johann (Gast)


Lesenswert?

Nils schrieb:
> st ja klar,
>
> der setzt da eine Kommazahl rein

Nein, wieso sollte er?

von Justus S. (jussa)


Lesenswert?

Nils schrieb:
> (256*1024*10)

und ist das nicht eh schon ein Überlauf?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Nils schrieb:
1
> #define F_CPU 16000000LU              //CPU Takt
2
> #define faktor (F_CPU/(256*1024*10))

Ich bekomme hier folgende Warnings:

../test.c:14: warning: integer overflow in expression
../test.c:14: warning: division by zero

Das ist auch logisch: 256*1024*10 sind größer als ein 16Bit-Integer 
packen kann. Der avr-gcc dividiert hier jedenfalls durch 0.

Korrigiere das zu:
1
#define faktor (uint8_t) (F_CPU/(256UL*1024*10))

Dann sollte es passen. Bei mir ist jedenfalls der Code gleich groß, egal 
ob ich obigen Ausdruck verwende oder direkt den Wert 6 zuweise.

Gruß,

Frank

von Nils (Gast)


Lesenswert?

Ok das funktioniert. Dann musste da Nenner auch ein UL rein.

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.