AVR-Code (GCC) optimieren

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

Reply to
Michael Rübig
Loading thread data ...

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

LG,

--
Bernhard Roessmann
Don't Fear The Penguins!
Reply to
Bernhard Roessmann

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

Reply to
Michael Rübig

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.
Reply to
Matthias Weingart

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

Reply to
Michael Rübig

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
Reply to
Joerg Wunsch

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.