Code aus dem RAM ausführen und FLASH (ARM) nicht verwenden

Ich habe eine Anwendung für meinen ARM7, die normalerweise in FLASH gebrannt und dann bei der Ausführung in den RAM kopiert wird (um etwas schneller zu laufen). Aber ich erinnere mich, dass mein Professor einmal sagte, ich solle mein Programm aus dem RAM laufen lassen, weil man den FLASH nur so oft brennen kann. Meine Frage ist also - gibt es eine spezielle Möglichkeit, das Programm zu brennen, damit es direkt aus dem RAM ausgeführt werden kann (nicht durch Kopieren aus FLASH)? Ich weiß, dass ich einen benutzerdefinierten Bootloader verwenden könnte, aber das ist keine Option. Ich kann den SAM-BA-Loader verwenden, aber meines Wissens wird er zum Flashen des Geräts verwendet, er kann nicht zum Ausführen von Code aus dem RAM verwendet werden, und wenn dies möglich wäre, ist das direkte Schreiben in den RAM möglich?

SAM-BA kann verwendet werden, um Ihren Anwendungscode direkt in den RAM zu schreiben, aber es muss mit der richtigen Basisadresse kompiliert werden. Sie müssen auch wissen, dass der Bootloader im RAM suchen muss, um die Ausführung zu starten. Der SAM-Bootloader (auf den Chip gebrannt) sucht automatisch an mehreren Stellen nach einem geeigneten Boot-Vektor. Wenn er keinen findet, bringt er Sie zur Debug-Shell und Sie können RAM brennen und einen Soft-Reset durchführen. Sobald Sie das Flashen programmiert haben, kopiert der Bootloader es nur zur Ausführung in den RAM, es schreibt normalerweise nicht zurück, so dass Sie den Flash nur beim Herunterladen Ihrer Binärdatei verwenden
OK, das Datenblatt besagt, dass SAM-BA einen Teil des RAM für interne Operationen verwendet, sodass der Benutzerbereich bei 0x202000 beginnt, während der RAM bei 0x200000 beginnt (und FLASH bei 0x100000). Ich gehe davon aus, dass die Vektortabelle bei 0x202000 am Anfang des Userspace beginnen muss. Ist das die Adresse (vorausgesetzt, der Verknüpfungsprozess wird richtig durchgeführt), an die ich die Binärdatei "brennen" sollte? Wie unterscheidet sich das vom Schreiben in Flash?
Wenn Sie Bare Metal verwenden, würden Sie den gesamten RAM verwenden, SAM-BA lebt im ROM und versucht, Code von Ihrem Flash in die ersten RAM-Blöcke zu verschieben, und hängt sich dann in Ihr Betriebssystem oder Ihren sekundären Bootloader ein, den Sie verwenden möchten Um eine Baremetal-Anwendung zu starten, ist es am einfachsten, sie auf den gesamten RAM zu brennen und einen Sprung auf 0x2000 0000 auszuführen, aber wenn Sie möchten, dass der SAM-Bootloader dies automatisch tut, müssen Sie die Dokumentation durchsuchen, um herauszufinden, was es ist sucht nach, um zu entscheiden, wo mit der Ausführung begonnen werden soll. Dies erfordert Basteln, ist aber im Allgemeinen machbar.
Sie sollten den RAM über die JTAG/SWD-Schnittstelle programmieren können.
Okay, ich habe es herausgefunden. Ich habe SAM-BA verwendet, um die .bin (ordnungsgemäß verknüpft) an den Anfang des Benutzerbereichs zu senden, direkt nach dem internen SAM-BA-Stack, und dann „go 0x202000“ verwendet, um die Ausführung von dieser Adresse aus zu starten. Ich habe den Befehl auf einer alten Seite gefunden, jetzt versuche ich ihn in den offiziellen Dokumenten zu finden. Danke trotzdem für die bereitgestellten Informationen!

Antworten (1)

SAM-BA ist ein Bootloader, wenn Sie also Samba haben, müssen Sie wirklich keinen anderen neu erfinden. Verwenden Sie es einfach. Jtag funktioniert normalerweise auch, um Programme in den RAM laden und ausführen zu können. Irgendwann gehe ich davon aus, dass Ihre Anwendung vom Flash ausgeführt werden muss, sobald Sie dies in ein Projekt / Gadget oder was auch immer verwandeln. nicht erforderlich, aber vorausgesetzt. Sie könnten Ihre RAM-Version mit einer kleinen Kopie des Ram-Programms umhüllen.

Ich empfehle Ihnen, samba oder was auch immer zu verwenden, um den Benutzer-Flash zu löschen, damit Samba nicht versucht, ihn zu laden, und um sicherzustellen, dass sich der Chip in einem bekannten Zustand befindet. Bei Samba bin ich mir nicht sicher, aber es ist möglich, dass der Bootloader, wenn er ein Programm im Flash nicht erkennt, möglicherweise die Uhren erhöht oder Peripheriegeräte (uart) einrichtet, die er möglicherweise nicht hat, wenn er Flash kopiert hätte, sodass Sie möglicherweise immer noch in einer Situation landen dass Ihr im RAM getestetes Programm funktioniert, aber sobald Sie es von einem Flash-basierten Programm kopieren oder von Flash ausführen, funktioniert es möglicherweise nicht. Es können einige Flash-Zyklen erforderlich sein, um den Test abzuschließen. oder Sie können Ihren eigenen Bootloader erstellen, der Samba ausführt, und dann befinden Sie sich in einem bekannten Zustand. Meine Präferenz ist eine dumme Xmodem-Sache, der Bootloader tut gerade genug, um den uart einzurichten und auf einen Xmodem-Download zu warten, dann lädt er an eine bekannte Adresse im RAM herunter. Ersetzen Sie dann den xmodem-Downloader durch die Kopie in den RAM und führen Sie ihn aus. so gibt es keine überraschungen.