Forum: Mikrocontroller und Digitale Elektronik ATSAMD09C13A allgemeines


von Alex Richard Moll (Gast)


Angehängte Dateien:

Lesenswert?

Servus,

ich habe Paar Fragen zu ARM auf die ich bisher keine Lösung gefunden 
habe.

1, rein zum Testen möchte ich Instruktionen aus dem RAM ausführen. Hier 
hat jemand danach schon mal gefragt: 
Beitrag "ATSAMD09C13A externe Opcodes?" allerdings gibt es die 
AppNote nicht mehr aus dem Letzen Post.

Habe mir zum Testen einfach mal den Opcode in eine Statische Variable 
gelegt und mir anhand eines Pointers die Speicheradresse geben lassen. 
Mit "mov PC, %0:+r(address) springe ich dann Dort hin. Das einzige was 
passiert ist das die Hardfault ISR aufgerufen wird. Der Opcode 
allerdings nicht. Ich denke ich gehe das Falsch an, wie mache ich es 
richtig?
Hänge mal meinen Code mit an, habe die Adresse zum Ausprobieren auch mal 
manuell eingestellt. Habe gelesen das der Hardfault ausgelöst wird wenn 
die Adresse gerade ist?

2, wenn ich mir den PC auslese, wird die Adresse vier Bytes in der 
"Zukunft" angezeigt. Das heißt der Instruction-fetch holt zwei weitere 
Instruktionen während der Abfrage von z.b. "mov %0, PC". Liege ich da 
richtig?

3, bei AVR gibt es ein sehr schönes Handbuch über die Instruktionen mit 
Aufbau und sehr genauen Erklärungen. Bei ARM habe ich zwar Erklärungen 
gefunden aber nicht die genaue Zusammensetzung über die Instruktionen, 
ebenfalls von den Thumb Instruktionen. Gibt es da was und ich habe es 
einfach nur übersehen?

BG
Alex

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alex Richard Moll schrieb:

> 1, rein zum Testen möchte ich Instruktionen aus dem RAM ausführen.

Dafür musst du erstmal den Code auf die entsprechenden Adressen linken. 
Normaler ARM-Code ist nicht verschieblich, d.h. er läuft nur auf den 
Adressen, für die er compiliert und gelinkt worden ist.

Dann muss der Startup-Code sie (wie die Inhalte der initialisierten 
Variablen) aus dem Flash an die passende Stelle im RAM ablegen. 
Inwiefern da Linkerscripte und Startup-Code schon Vorkehrungen haben, 
habe ich noch nicht geguckt – dummerweise kommt ja bei ARM jedes System 
(IDE etc.) oft mit eigenen Varianten dieser beiden Teile daher. Wenn das 
getan ist, kannst du sie ganz normal mit Namen aufrufen.

> Habe mir zum Testen einfach mal den Opcode in eine Statische Variable
> gelegt und mir anhand eines Pointers die Speicheradresse geben lassen.
> Mit "mov PC, %0:+r(address) springe ich dann Dort hin. Das einzige was
> passiert ist das die Hardfault ISR aufgerufen wird.

Da du dann auf eine gerade Adresse springst, versuchst du, den 
Thumb-Modus zu verlassen, was bei einem Cortex-M schlicht nicht geht. 
Der kann nur Thumb-Modus.

> Liege ich da
> richtig?

Könnte schon sein.

> Gibt es da was und ich habe es
> einfach nur übersehen?

Ich denke, dass es sowas auch bei ARM gibt, aber viele Dinge behandeln 
sie dort als proprietär. Man muss sich dann anmelden und darf die 
Dokumente auch nicht weitergeben.

von Alex Richard Moll (Gast)


Lesenswert?

Jörg W. schrieb:
> Dafür musst du erstmal den Code auf die entsprechenden Adressen linken.
> Normaler ARM-Code ist nicht verschieblich, d.h. er läuft nur auf den
> Adressen, für die er compiliert und gelinkt worden ist.

Gut das ist klar. Ein Befehl der aber nur eine LED umschaltet, hat in 
dem Sinn ja keine Adresse die gelinkt werden muss?

Jörg W. schrieb:
> Dann muss der Startup-Code sie (wie die Inhalte der initialisierten
> Variablen) aus dem Flash an die passende Stelle im RAM ablegen.

Gibt es da irgendwo eine Anleitung? Die Datenblätter geben da nichts 
her.

Jörg W. schrieb:
> Da du dann auf eine gerade Adresse springst, versuchst du, den
> Thumb-Modus zu verlassen, was bei einem Cortex-M schlicht nicht geht.
> Der kann nur Thumb-Modus.

Bei einer ungeraden Adresse passiert das gleiche

Jörg W. schrieb:
> Ich denke, dass es sowas auch bei ARM gibt, aber viele Dinge behandeln
> sie dort als proprietär. Man muss sich dann anmelden und darf die
> Dokumente auch nicht weitergeben.

Hab ich mal gemacht, aber nicht unbedingt fündiger geworden.

Danke dir (:

von Alex Richard Moll (Gast)


Lesenswert?

Ich habe eine Frage vergessen, der Flash eines AVR leer ist, läuft der 
PC ja immer wieder durch. Kann es sein das bei ARM der PC bei der 
letzten Adresse stehen bleibt und neu gestartet werden muss? Hab da mal 
beim debuggen was gesehen.

von Frank K. (fchk)


Lesenswert?


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Alex Richard Moll schrieb:

> Jörg W. schrieb:
>> Dann muss der Startup-Code sie (wie die Inhalte der initialisierten
>> Variablen) aus dem Flash an die passende Stelle im RAM ablegen.
>
> Gibt es da irgendwo eine Anleitung? Die Datenblätter geben da nichts
> her.

Das hat ja auch nichts mit dem Datenblatt zu tun.

Du müsstest dich hinsetzen und verstehen, was der Startup-Code tut und 
wie er mit dem Linkerscript zusammen spielt. "Kochrezepte" sind das eine 
(kenne ich gerade keins), Verständnis das andere: damit kann man sich 
sowas auch selbst erweitern, wenn noch nicht vorhanden.

Als erstes müsstest du aber sehen, was in deiner Build-Umgebung 
überhaupt da ist in dieser Richtung. Wie gesagt, anders als bei AVR, wo 
die Toolchain im Großen und Ganzen Linkerscripte und Startup-Code "aus 
einer Hand" geliefert hat, kocht bei ARM jeder (jeder Hersteller, jede 
IDE) sein eigenes Süppchen in dieser Hinsicht.

Alex Richard Moll schrieb:
> Kann es sein das bei ARM der PC bei der letzten Adresse stehen bleibt
> und neu gestartet werden muss?

Ich würde vermuten, dass er beim Erreichen eines 0xFFFFFFFF sofort einen 
Hardfault triggert, da das kein gültiger Befehl ist. Beim AVR war 0xFFFF 
einfach ein (undokumentierter) NOP, weshalb der PC immer wieder durch 
lief.

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.