At91SAM7S Routine ins RAM und von dort ausführen?

OP #324411
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
Gast #324412
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.
OP #324413
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
Gast #425375
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
#425386
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren