mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik At91SAM7S Routine ins RAM und von dort ausführen?


Autor: Stefan G. (stefan8051)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich befasse mich jetzt schon seit einigen Wochen mit dem AT91SAM7S32
von Atmel. Zur Zeit spiele ich mit einem daran angeschlossenem SED1335
und nem 320x240 Pixel Display rum. Da man bei diesem LCD Controller
immer nur kleine Zeitfenster hat in denen man neue Daten in das Display
RAM übertragen kann stellt sich bei mir die Frage ob ich meine Routine
um Daten in dieses RAM zu kopieren nicht besser ins RAM des ARM7
kopiere und von dort aus ausführe. Ich habe gelesen das das Programm
aus dem Flash nicht mit der vollen geschwindigkeit, also den maximalen
55Mhz, ausgeführt werden kann, da der Flashspeicher die Ausführung auf
ca 30Mhz begrenzt. Die Frage ist jetzt, wie bekomme ich WinARM dazu das
meine Schreibroutine aus dem RAM ausgeführt wird? Der Rest des
Programmes muss weiterhin im Flash laufen, da das RAM schon ziemlich
voll ist.
Und eine zweite Frage noch, wie stelle ich eigendlich fest ob die PLL
richtig arbeitet und der Controller mit ca 40Mhz läuft, anstatt nur mit
den 18,432Mhz die vom Quarz kommen?

mfg
Stefan

Autor: Lokko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau dir mal die beispiele von der winarm seite an. da wird auch mit
ramfunc gearbeitet.

Das Prinzip.. im linker script muss du eine section im data segment
hinzufügen

.data : AT (_etext)
  {
    _data = . ;
  KEEP(*(.vectram))   /* added by mthomas */
    *(.data)
    SORT(CONSTRUCTORS)
  . = ALIGN(4);
  *(.fastrun)         /* "RAM-Functions" */ /* added by mthomas */
  } >DATA
  . = ALIGN(4);

siehst du die stelle wo .fastrun steht!???! da werden dann hinterher
alle sachen reingepackt, die mit

_attribute_ ((long_call, section (".fastrun")))

deklariert worden sind.

Also

_attribute_ ((long_call, section (".fastrun"))) void
functionimram(void)

abgekürzt per define

#define RAMFUNC _attribute_ ((long_call, section (".fastrun")))

RAMFUNC void functionimram(void)

wie schnell die die pll läuft, siehst du ja z.B. am clock der spi
schnittstelle wenn du da mal was drauf sendest oder wenn die baudrate
auf der uart stimmt ;) dann kannste die werte ja zurückrechnen.

Autor: Stefan G. (stefan8051)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
super, Danke!!! Das funktioniert. Ich hatte mir die von dir genannten
Beispiele vorher angesehen, jedoch bin ich da nicht so wirklich
durchgestiegen, ich dachte die änderungen an den Linker Scripts seien
größer als das hinzufüger der 3 zeilen. Auch wusste ich nicht was es
mit diesem Attribute zu tun hat, aber dank deiner erleuterungen habe
ich es geschafft. Die funktion läuft tatsächlich merkbar schneller,
zwar nicht um den Faktor 2, aber man merkt es schon. Das mit der PLL
habe ich auch herausgefunden, durch verändern von ein paar Werten in
der C_Startup.c kann man wunderbar die Taktfrequenz einstellen auf der
der ARM laufen soll.

mfg
Stefan

Autor: Stefan S. (dangermouse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Das läuft ja wirklich ganz prima.
Einen Haken hat die Sache aber noch: Der Code steht jetzt ja immer im 
RAM und verbraucht dort Platz. Gibt es da eine Möglichkeit, den Code 
sozusagen dynamisch zu plazieren und ablaufen zu lassen?

Grüße

Stefan

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
prinzipiell kannst du das kopieren des codes aus dem flash ins ram auch 
mittels memcpy zur laufzeit durchführen.
dies macht aber nur sinn wenn du mehrere routinen hats die du aus de m 
ram exekutieren möchtest aber sicher bist das sie nie gleichzeitig 
benötigt werden.
ist dies der fall?


gruss
gerhard

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Flash kann es sinnvoll sein Thumb-Code zu verwenden, da die Befehle 
kürzer sind und somit schneller geladen werden können. Vielleicht reicht 
das ja schon für deine Zwecke.

Autor: Stefan S. (dangermouse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gerhard!

Also die Problematik sieht folgendermaßen aus. Ich benötige gewisse 
Routinen nur ganz selten um die Flashbänke beschreiben zu können (In 
Application Programming). Für diese suche ich einen sicheren Platz im 
RAM, der nur dann verbraucht wird, wenn ich ihn benötige.

Ich kann mir die Routinen ja nachträglich in den RAM kopieren, nur wie 
bin ich sicher, dass ich da nichts zerstöre (Stack, globale Variablen, 
...).

Grüße

Stefan

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.