AVR Optimierung verbessern

OP #1634793
Lesenswert?
• ▲
▼
Hallo zusammen,

schaut euch mal bitte folgenden Code an:
1
if(my16bitpointer>=(constant)){
2
 13e:  80 e0         ldi  r24, 0x00  ; 0
3
 140:  ef 37         cpi  r30, 0x7F  ; 127
4
 142:  f8 07         cpc  r31, r24
5
 144:  10 f0         brcs  .+4        ; 0x14a <__vector_13+0x3a>

Hier soll der AVR den 16 Bit pointer vergleichen; dabei belegt er aber 
R24 mit einer Null obwohl R0 schon diesen Wert enthält. Es wäre viel 
geschickter, stat R24 R0 zum verlgeichen zu nehmen. Man spart ohne viel 
aufwand 1 Register und ein Befehl.

Kann man das dem GCC irgendwie beibringen? (Bin leider absolut 
inkompentent im Compilerbau!)

Grüße

Michael
OP #1634865
Lesenswert?
• ▲
▼
Stop, es sollte doch gehen! Der AVR hat per Definiton (Tiny24) nur 8 
Bitram Adressen. Also müsste es der Compiler doch auch wissen. Aber das 
ist wohl aufwendiger als das Ergebnis.
Diese Manuelle Konstruktion halte ich für ein Spiel mit dem Feuer. Wehe, 
das ist dann nachher nicht mehr so...
Gibt es eine Möglichkeit, die 16 Bit Pointer auf 8 Bit Pointer zu 
reduzieren? (da der AVR nur 128 Byte Ram hat)
#1634875
Lesenswert?
• ▲
▼
Michael H. schrieb:

> Stop, es sollte doch gehen! Der AVR hat per Definiton (Tiny24) nur 8
> Bitram Adressen. Also müsste es der Compiler doch auch wissen. Aber das
> ist wohl aufwendiger als das Ergebnis.

Ok, du hast Recht. Nur müsste sich jetzt noch jemand finden, der für die 
paar Tinys mit Datenadressraum bis 256 Bytes den Compiler auf den Kopf 
stellt.

> Gibt es eine Möglichkeit, die 16 Bit Pointer auf 8 Bit Pointer zu
> reduzieren? (da der AVR nur 128 Byte Ram hat)

Aber sicher. Der GCC Quellcode ist bekanntlich offen. Es hindert dich 
niemand daran, eine avr-gcc Version zu stricken, die für Pointer nur 8 
Bits verwendet. Allerdings wird Datenzugriff auf das ROM dann noch etwas 
umständlicher als er ohnehin schon ist, denn auch diese Pointer sind 
dann 8 Bit "breit".
#1635019
Lesenswert?
• ▲
▼
Ob ROM oder RAM ist ihm egal, ob Codespace oder Dataspace nicht. Bei 
AVRs ist dieser Unterschied allerdings deckungsgleich.

Ein Compiler, der bei einer C-konformen Dereferenzierung jene 
Prozessor-Befehle verwendet, die RAM/Dataspace ansprechen, versteht 
einen solchen Pointer offenkundig als Pointer auf RAM/Dataspace. Auch 
wenn C diese Unterscheidung nicht kennt, der AVR-Compiler als Brücke 
zwischen C und Maschine kennt sie.

Dass man einem solchen Pointer auch Adressen im ROM/Codespace oder im 
EEPROM zuweisen kann, das ist genau genommen ein absichtlich übersehener 
Fehler beim Linken.
Gast #1635287
Lesenswert?
• ▲
▼
A. K. schrieb:
> Auch wenn C diese Unterscheidung nicht kennt, der AVR-Compiler als
> Brücke zwischen C und Maschine kennt sie.

Nein, der Compiler kennt sie eben nicht, zumindest im Falle von gcc. Das 
ist ja das Problem. Als Krücken zur Unterscheidung dienen 
Bibliotheksfunktionen und Tricks im Linkerskript.

> Dass man einem solchen Pointer auch Adressen im ROM/Codespace oder im
> EEPROM zuweisen kann, das ist genau genommen ein absichtlich
> übersehener Fehler beim Linken.

Dem Linker sind Zeigerwerte eigentlich ziemlich egal.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.