AVR-Code (GCC) optimieren

Dec 26, 2004 5 Replies

Hi Leute, ich habe ein größeres Array im Flash abgelegt.



Ich greife unter C folgendermaßen darauf zu:


--------------------------------------------------------- DataArray[0] = pgm_read_byte_near(Adr); Adr++; DataArray[1] = pgm_read_byte_near(Adr); Adr++;



---------------------------------------------------------



idealerweise müsste der Compiler das hier in lpm Rd, Z+ übersetzen. Macht er aber leider nicht, der macht das so:


--------------------------------------------------------- movw r30,r16 lpm r24, Z std Y+1,r24 subi r16,lo8(-(1)) sbci r17,hi8(-(1)) movw r30,r16 lpm r24, Z std Y+2,r24 subi r16,lo8(-(1)) sbci r17,hi8(-(1))



----------------------------------------------------------



Er inkrementiert den Z-Pointer also viel zu umständlich. bekommt man das ohne Inline-Assembler effektiver hin?



Mit dem Y-Pointer geht der Compiler deutlich effizienter um.



Gruß Michael


Es gibt mindestens 20 Optimierungsschalter beim GCC, hast Du -O2 oder -O3 schon probiert?

LG,

Bernhard Roessmann Don't Fear The Penguins!

Bernhard Roessmann schrieb:

bringen beide nichts. Ich hab den C-Code mal wie folgt verändert:

DataArray[0] = pgm_read_byte_near(Adr++);

statt

DataArray[0] = pgm_read_byte_near(Adr); Adr++;

Aber auch das bringt nichts.

Mir ist aufgefallen, dass der Compiler das lpm Rd, Z+ dann benutzt, wenn er zum Beispiel ein /short) oder ein /int/ oder so einlesen muss.

Michael

Michael Rübig wrote in news: snipped-for-privacy@individual.net:

Beim mspgcc bringt es viel, wenn man direkt mit Pointern arbeitet.

PDataArray = DataArray; *PDataArray = pgm_read_byte_near(Adr++); PDataArray++; *PDataArray = pgm_read_byte_near(Adr++); PDataArray++;

Probier doch mal, ob der avrgcc es ähnlich sieht.

M.

Bitte auf mwnews2@pentax.boerde.de antworten.

Hallo,

Du hast den Code jetzt so umgebaut, dass eigentlich nur PDataArray betroffen ist. Das DataArray hat der Compiler schon optimal übersetzt mit diesem Post-Increment. Das DataArray liegt ja auch im RAM. Aber den Zugriff auf das Array im Programmspeicher ist ja bei diesem Beispiel identisch.

Michael

Michael Rübig schrieb:

Wenn Du Dir mal ansiehst, was der pgm_read_byte Makro tut, wirst Du feststellen, dass es sich um eine inline-Assembler-Anweisung handelt. Diese kann der Compiler selbst nicht ändern, da er deren Wirkung nicht einschätzen kann. Daran kann leider auch der beste Optimierer nichts mehr ändern.

Diese Situation wird sich wohl erst dann ändern, wenn jemand (z. B. Svein Seldal) multiple memory spaces im GCC implementiert hat, so dass der Compiler die LPMs selbst generieren kann.

Bis dahin könntest Du Dir, falls es wirklich ein nennenswertes Problem für Dich ist, mit einem abgewandelten Makro (pgm_read_byte_postinc) behelfen, der das ,,zu Fuß'' erledigt.

Jörg Wunsch "Verwende Perl. Shell will man können, dann aber nicht verwenden." Kristian Köhntopp, de.comp.os.unix.misc

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required