mikrocontroller.net

Forum: Compiler & IDEs Präprozessor Optionen WinARM GCC


Autor: Lokko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab immer gedacht der Präprozessor würde so Geschichten wie diese
"brechnen"

Wenn ich diese defines

#define FLASH_AT91C_MC_CORRECT_KEY  ((unsigned int) 0x5A << 24)
#define AT91C_MC_FCMD_UNLOCK        ((unsigned int) 0x4)

in dieser Funktion benutzte

char RAMFUNC flash_UnlockPage(unsigned int pagenum){
  if(pagenum >= FLASH_PAGE_NB) return FLASH_PROGE;
  flash_ReadyWait();
--->>>>flash_AT91F_MC_EFC_PerformCmd(AT91C_BASE_MC,((pagenum)<<8)|(FLASH 
_AT91C_MC_CORRECT_KEY|AT91C_MC_FCMD_UNLOCK));
  flash_ReadyWait();
  return flash_GetError();
}

gehe ich davon aus, dass er mir FLASH_AT91C_MC_CORRECT_KEY und
AT91C_MC_FCMD_UNLOCK zusammenfasst... oder liege ich da falsch!??!

Der erzeugt Assembler code an der stelle sieht aber so aus

 293        mov  r3, r0, asl #8
 294        orr  r3, r3, #1509949440
 295        orr  r3, r3, #4

#1509949440 ist übrigends 0x5A << 24

In der gcc hilfe hab ich nix dazugefunden.

Achja diesen COde macht er mir bei Optimierungsstufe 2,3 und s

Bei Stufe 1 macht er jenes

 160 mov  r3, #1509949440
 161 add  r3, r3, #4
 162 orr  r3, r3, r0, asl #8

Mach ich da was falsch oder besteht da Optimierungsbedarf am gcc ?? Ist
ja eigentlich Standard solche Konstrukte zu verwenden.

hier noch die version

arm-elf-gcc (GCC) 4.0.2 (WinARM)

und die Parameter

Compiling C: flash.c
arm-elf-gcc -c  -mcpu=arm7tdmi  -I. -gstabs -DROM_RUN  -Os -Wall
-Wcast-align -Wimplicit  -Wpointer-arith -Wswitch -Wredundant-decls
-Wreturn-type -Wshadow -Wunused -Wa,-adhlns=flash.lst   -MD -MP -MF
.dep/flash.o.d -Wnested-externs  -std=gnu99 flash.c -o flash.o

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, der Präprozessor ersetzt nur, stur.

Es wäre der Compiler, der solcher Art Ausdrücke zusammenfassen
sollte. Keine Ahnung, wie gut der ARM-Port des GCC in Schuss
ist.  Vielleicht kann ja Martin hier was dazu sagen.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

darf ich auch was dazu sagen? ;-)
Das dürfte eher daran liegen das der ARM keine beliebigen 32 Bit
Konstanten mit einem Befehl laden kann. Es sind nur 8 Bit-Konstanten
möglich die allerdings noch zusätzlich durch den Barrel-Shifter gehen
also um eine beliebige Anzahl Stellen rotiert werden können.

Alternativ kann man 32 Bit Konstanten über den Literal Pool laden was
aber in dieser Sitution unklug wäre da es keinen Code einspart aber
einen Zugriff außerhalb des aktuellen Code-Pfads benötigen würde was
bei einem Prozessor mit Pipeline und/oder Cache nicht wirklich optimal
ist.

Matthias

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowas in der Art hatte ich mir schon fast gedacht. ;-)

Autor: Lokko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MOMENT... :) ich möchte das verstehen

wenn ich dich richtig verstanden habe, dann läd der ARM im Prinzip bei
0x5A000000 nur 0x5A und shiftet die beim Laden.

bei 0x5A020000 würde er 0x5A laden und shiften und dann 0x02 und
shiften?

Ok das mit dem Pipelining hört sich auch logisch an.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

So in etwa. Im Opcode wird die Konstante 0x5A codiert. Zusätzlich steht
im Opcode "um 24 Bits nach links shiften". Er lädt also die Konstante,
shiftet sie um 24 Bits nach links und schreibt das Ergebnis in das
angegebene Register. Und das alles in einem Takt.

Ob die Konstanten aber wirklich 8 Bit haben, da bin ich mir nicht
absolut sicher. Könnten auch 10 Bit sein.

Matthias

Autor: Lokko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

DANK DIR!

Habs verstanden :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.