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
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.
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
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.