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


von Stefan G. (stefan8051)


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

von Lokko (Gast)


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.

von Stefan G. (stefan8051)


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

von Stefan S. (dangermouse)


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

von gerhard (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Stefan S. (dangermouse)


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

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.