Forum: Mikrocontroller und Digitale Elektronik WINARM Beispiel AT91SAM7S256


von Peter Pippinger (Gast)


Lesenswert?

Hallo NG,

nachdem ich mir jetzt mit der besch*** SD-Karte so langsam meine Zähne 
ausgebissen habe, möchte ich nun doch über einen Umstieg auf C 
nachdenken.

Hat mir vielleicht jemand ein Minimalbeispiel mit Startupskript und 
Makefile für WINARM? Am besten alles in ein "pnproj" verpackt, so dass 
man einfach "make all" aus dem Menü aus aufrufen kann. Im Makefile 
sollte auch der RUN-Mode auswählbar sein (RAM/ROM).

im Beispiel würde mir reichen, dass einfach eine LED angesprochen wird.
So ála:

int main(void)
{
    m_pPio->PIO_CODR = BIT18;
    m_pPio->PIO_SODR = BIT18;
}

Für Hilfe wäre ich wirklich sehr dankbar!

Grüße aus dem Süden,
Peter

von Peter Pippinger (Gast)


Lesenswert?

...noch eine Frage zum Thema C:

wie kann ich es erreichen, dass mein C-Code relokierbar ist?

Mir würde es gefallen, wenn ich Kode bekommen würde, der an irgendeiner 
Stelle im RAM läuft. Geht das überhaupt?

MfG
Peter

von Marius S. (lupin) Benutzerseite


Lesenswert?

Lad dir Yagarto von http://www.yagarto.de/

Und dann arbeite mal dieses Tutorial durch:
http://www.atmel.com/dyn/resources/prod_documents/atmel_tutorial_source.zip

Eclipse mit Debugger integration ist einfach super. Im Tutorial wird 
auch beschrieben wie man seinen Code ins RAM bringt.

von Peter (Gast)


Lesenswert?

> nachdem ich mir jetzt mit der besch*** SD-Karte so langsam meine Zähne
> ausgebissen habe, möchte ich nun doch über einen Umstieg auf C
> nachdenken.
Eine weise Entscheidung.

Zum Thema SD-Cards: http://elm-chan.org/docs/mmc/mmc_e.html

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Fertigen Code für die SD-Karte bekommst du hier:
ARM MP3/AAC Player

von Peter Pippinger (Gast)


Lesenswert?

> Eclipse mit Debugger integration ist einfach super. Im Tutorial wird
> auch beschrieben wie man seinen Code ins RAM bringt.

Naja, wie ich den Code ins RAM bekomme und starte ist mir eigentlich 
schon klar. Mich würde halt brennend interessieren, was ich tun muss, 
damit ich entweder festlegen kann, wo ich den Code hinladen möchte, oder 
wie ich es mache, dass der Code überall im Speicher lauffähig ist.

bitte_um_Hilfe->Danke;

von mthomas (Gast)


Lesenswert?

> ...möchte ich nun doch über einen Umstieg auf C nachdenken...
Gut gemeinte Ratschläge brauchen etwas Zeit verinnerlicht zu werden.

Die Adressen vergibt der Linker nach Vorgaben im Linker-Script. Typisch 
erzeugt man eine Konfiguration für "Flash" (.text, .rodata und 
Initialwerte für .data im Flash, .data VMA und .bss im RAM) und evtl. 
noch eine für "RAM debugging" (alles im RAM-Adressraum, .data braucht 
nicht kopiert zu werden, Remapping bei Verwendung von Interrupts 
erforderlich). Daneben gibt es noch diverse andere Möglichkeiten 
(Funktionen aus RAM ausführen, Variablen an bestimmte Speicheraddressen 
binden usw.). Flash-Adresse bzw. Startadresse beim Upload ins RAM müssen 
mit den Vorgaben für den Linker übereinstimmen.

Informationen:
- GNU Binutils Dokumenation durchlesen (ld)
- GNU gcc Dokumentation lesen (v.a. function- und variable attributes)
- Beispiele und deren Linker-Scripts nachvollziehen (z.B. 
Lynch-Tutorial, embedded.com Artikelsammlung, WinARM Beispielsammlung 
(und deren Updates von "meinen" Web-Seiten))

Für Weiteres müsste genauer beschrieben werden, was mit "überall" 
gemeint ist.

Martin Thomas

von Peter Pippinger (Gast)


Lesenswert?

> ... für Weiteres müsste genauer beschrieben werden, was mit "überall"
> gemeint ist.

naja, wenn ich z.B. einen PIOA-Pin als Output definiere, dann ist das ja 
eigentlich eine absolute Sache, so wie ich das sehe.

Es gibt eine Feste Basisiadresse und einen festen Offset von dieser 
Adresse aus. So etwas  in Assembler geschrieben, läuft sowohl bei 
0x202000, als auch bei 0x203000 usw...

Wenn ich aber jetzt in C mit Variablen arbeite, um z.B. in einer 
Schleife zu zählen, dann verändert sich ja deren Inhalt zur Laufzeit. 
Somit muss sich doch der Compiler entweder Register zu Nutze machen, was 
aber von der Anzahl der verwendbaren Variablen nahezu unmöglich sein 
dürfte. Oder er legt die Variablen im RAM an, was auch sowas wie "alloc" 
erklären dürfte.

Hat denn niemand für WinARM so ein Beispiel, welches auch läuft?

Wenn ich das Beispiel mit den LEDs versuche, dann gehen immer beide LEDs 
an, und nichts passiert mehr. Übrigens egal, was ich in Main schreibe, 
somit denke ich, dass die Initialisierung nicht klappt.

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.