Was macht ARM mit leerem Flash?

Gast #5141265
Hi,

was macht eigentlich ein ARM-Prozessor, wenn er den Opcode 0xFFFFFFFF im 
Flash findet? Und was bei 0x00000000?

Macht es einen Unterschied, ob der ARM im Thumb Modus ist oder nicht?

Was sollte man sinnvollerweise ins Flash schreiben, wenn man einen 
(Soft-) Reset auslösen möchte, falls der Programm Counter (warum auch 
immer) in einen "leeren" Flash-Bereich springt?
Thumb:
 0000        left shift by R0 into R0 -> NOP -> Bus-/Hardfault am 
FlashEnde

 FFFF        der 2. Teil einer Befehlssequenz "Branch mit 23Bit offset"
             vermutlich per Hardfault beende.

ARM:
 00000000    illegale Bitkombination -> Hardfault

 FFFFFFFF    SWI Never -> NOP -> Bus-/Hardfault am FlashEnde

-> endet immer in einer Exception und scheint vorher höchsten Zyklen zu 
verbrauchen, aber nichts Böses anzustellen.
Gast
Ok, danke. Naja, das durch den Flash durch-"NOPpen" will ich genau 
vermeiden. Könnte ja gut sein, dass da noch Code oder Daten kommen. 
Damit wäre das Verhalten dann komplett undefiniert.

Ich würde den Linker gerne anleiten, die leeren Flash-Bereiche mit etwas 
sinnvollem vollzuschreiben, das am besten direkt einen Reset auslöst 
oder zumindest auf Adresse 0 springt. Eine Sequenz scheidet aus, falls 
der Controller da mittenrein springt.

Was wäre da geeignet?
Du gehst also davon aus, daß der an beliebige Stellen des Flashes 
springt,  und da soll dann hinterher etwas definiertes wie z.B. ein 
Reset ausgeführt werden, korrekt?

Ich würde sagen das ist ein Fall für einen Watchdog.

Denn wenn Du schon davon ausgehst, daß der an beliebige Stellen im 
unbenutzten Teil des Flash springen kann, was soll ihn dann davon 
abhalten stattdessen an die von Deinem Code verwendeten Stelle zu 
springen? Ich sehe da keinen Unterschied. In Deinem normalen Code wirst 
Du nicht ständig Resets ausführen wollen.

Nimm einen Watchdog und bau um den Rücksetzmechanismus dafür enge 
Plausibilitätstests ein.

Wenn Du wirklich von beliebigen Sprüngen im Code ausgehst, könnte der 
theoretisch direkt an die Stelle mit dem Zurücksetzen des Watchdogs 
springen. Vermutlich könntest Du das mit der Memory Protection Unit 
nochmal extra sichern. Ich hab mich damit aber noch nicht im Detail 
beschäftigt. Evtl. hilft auch ein externer Watchdog oder 2 die sich 
gegenseitig überwachen.
Gast
Gerhard schrieb:
> Was sollte man sinnvollerweise ins Flash schreiben, wenn man einen
> (Soft-) Reset auslösen möchte, falls der Programm Counter (warum auch
> immer) in einen "leeren" Flash-Bereich springt?

Ich muß mich zurückhalten!
Er macht nur das, was du ihm befiehlst.
Also mach es.
(Firma: Funkenflug Industries)
Wenn der Programmzeiger in den luftleeren Raum springt, crasht das 
Programm sowieso. Es ist völlig egal was der Prozessor damit macht. Sei 
froh, wenn Du eine Exception bekommst, damit kannst Du immerhin einen 
Reset auslösen oder die gesteuerte Schaltung in einen sicheren Zustand 
versetzen. Unter Windoofs ist das diese berühmte allgemeine 
Schutzverletzung.
Gast
Gerhard schrieb:
> Ich würde den Linker gerne anleiten, die leeren Flash-Bereiche mit etwas
> sinnvollem vollzuschreiben, das am besten direkt einen Reset auslöst
> oder zumindest auf Adresse 0 springt.
> ...
> Was wäre da geeignet?

Warum fragst du dann, was der Prozessor bei 0xFFFFFFFF oder 0x00000000 
anstellt, wenn du ganz was anderes wissen möchtest?
Gast
Gerhard schrieb:

> Was sollte man sinnvollerweise ins Flash schreiben, wenn man einen
> (Soft-) Reset auslösen möchte, falls der Programm Counter (warum auch
> immer) in einen "leeren" Flash-Bereich springt?

Nett wäre ein Breakpoint-Befehl. Normalerweise ergibt das eine Exception 
oder man landet im Debigger (jedenfalls beim Cortex M3). Angeblich gibt 
es auch offiziell undefinierte Opcodes:
https://stackoverflow.com/questions/16081618/programmatically-cause-undefined-instruction-exception
Gast
Markus F. schrieb:
> Ich würde mein Hirnschmalz lieber in ein stabiles, verlässliches
> Programm stecken als in die smarte Rettung aus einem schampig
> hingerotzten.

Genau, und wenn man niemals Fehler macht, braucht man auch keine 
zeitraubenden Tests.
(Firma: Funkenflug Industries)
Wie man das hinkriegt?

push müll
ret

oder

function crash
push a
push b
[..]
pop c
pop b
pop a
ret

Das war's dann.

Oder es führt zum Festhängen des Controllers falls der Watchdog 
deaktiviert ist. Aber hast trotzdem Recht, insofern nichts an der 
Schaltung Schaden nimmt, gibts dann einen User-getriggerten Reset.

Das Problem ist ja auch, daß der Controller irgendwann den Stack am Ende 
des RAM ausführen möchte wenn keine exception ausgelöst wird. Das führt 
dann wieder zu undefiniertem Verhalten.

Man könnte sich behelfen, wenn man den kompletten freien Flash mit
jmp reset oder jmp what_to_do_if_program_crashed
oder so vollschreibt. Dann bewirkt ein Einspringen in freie 
Flash-Bereiche z.B. einen sofortigen Reset.
Gast
Wie wahrscheinlich ist es denn, daß die CPU bei einem Sprung an eine 
zufällige Adresse überhaupt im Programmflash landet? Das Flash mit 
seinen paar (hundert) kB ist doch verschwindend klein gegenüber dem 
4GB-Adressraum.
(Firma: Funkenflug Industries)
Hm die Frage wäre ob Du dann eine Exception bekommst weil die CPU weiß, 
daß an dieser Stelle "nicht angeschlossen" ist... Ansonsten sind das 
einfach unbelegte Adressleitungen, sprich Du landest wieder irgendwo im 
vorhandenen Speicher, der durch die belegten Adressleitungen 
angesprochen wird.
Gast
Natürlich wird die Software ordentlich entwickelt und getestet. Und es 
gibt auch einen Watchdog. Aber es verstößt gegen die Grundregeln der 
Kunst, eine (fast) kostenlose Maßnahme NICHT zu treffen.

Ich habe beim Reverse-Engineering auch schon 0xDEADCODE oder 0xDEADBEEF 
in unbenutzten Blöcken gefunden statt 0xFFFFFF. Ohne zu wissen, zu 
welchen Instruktionen das jetzt disassemblieren würde und ob es eine 
gute Wahl war. Es zeigt aber, dass jemand das Linker-File angefasst und 
sich Gedanken gemacht hat.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.