Go Down

Topic: Geladenes Programm auslesen möglich? (Read 11992 times) previous topic - next topic

-Micky

Kann man eigentlich ein auf den UNO geladenes Programm wieder auslesen und weiterbearbeiten?


Micky

jurs


Kann man eigentlich ein auf den UNO geladenes Programm wieder auslesen und weiterbearbeiten?


Du kannst die fertig kompilierten Maschinenbefehle als "HEX-Datei" aus dem Controller auslesen. Und dazu dient im Prinzip dasselbe Programm AVRDUDE, das auch die Arduino-Software zum Uploaden des Programms verwendet:
http://www.nongnu.org/avrdude/
Das ist der  "AVR Downloader/UploaDEr"

Du bekommst dabei aber weder den Quellcode zurück noch kannst Du an der HEX-Datei etwas ändern.

Die HEX-Datei könntest Du danach in einen anderen Controller laden, auf dem dann dasselbe Programm läuft.

Ganz ausgefuchste Assembler-Profis mit zusätzlichen Softwarewerkzeugen können aber ggf. die HEX-Datei disassemblieren und auf Assembler-Ebene noch kleinere Änderungen vornehmen. Sagen wir mal, eine Pin-Nummer ändern, oder eine Abbruchbedingung auf einen anderen Wert setzen. Größere Änderungen sind aber selbst damit nicht möglich, dafür benötigst Du den Quellcode. Oder eine Neuprogrammierung von Anfang an.

uwefed

Jurs antwortet zwar richtig aber mir scheint auch etwas wenig direkt.  ;)

Nein Du bekommst den in C geschriebenen Sketch nicht aus dem ARduino heraus weil er dort nie geladen wurde.

Auf den Arduino wird das compilierte (in Maschienensprache übersetzte) Programm übertragen. Dieses kannst Du auslesen und falls es Zeit und Deine Kenntnisse erlauben auch verändern.

Grüße Uwe

Eisebaer

hi,

außerdem werden im normalfall die fuse-bits so gesetzt, daß ein auslesen nicht möglich ist.

gruß stefan

uwefed


hi,

außerdem werden im normalfall die fuse-bits so gesetzt, daß ein auslesen nicht möglich ist.

gruß stefan

Das ist wohl ein Sonderfall, der für Arduino standartmäßig nicht zutrifft?

jurs

#5
Nov 12, 2013, 01:44 pm Last Edit: Nov 12, 2013, 01:59 pm by jurs Reason: 1

Das ist wohl ein Sonderfall, der für Arduino standartmäßig nicht zutrifft?


Ja natürlich, Fusebits sind Fusebits und Lockbits sind Lockbits.

Und Lockbits werden von der Arduino-Software überhaupt nicht angefaßt, also NICHT gesetzt.

Denn mit gesetzten Lockbits läßt sich nach dem Upload gar kein "Verify" machen, ob der Sketch überhaupt fehlerfrei auf dem Controller gespeichert werden konnte. Das standardmäßige "Verify" der Arduino-Software funktioniert nämlich so: Direkt nach dem Beschreiben des Controllers wird der Inhalt des Controllers gleich wieder ausgelesen und verglichen, ob das was ausgelesen werden kann identisch ist mit dem, was geschrieben werden sollte.

Im Fehlerfall zeigt die Arduino-Software einen "Verify Error" an.  Das wäre überhaupt nicht möglich, wenn der Controller gegen das Auslesen durch Setzen der Lockbits gesperrt ist, dann kann man den Controller nur blind beschreiben und darauf hoffen "es wird hoffentlich kein Fehler beim Schreiben aufgetreten sein und auf das Verify ob es so ist verzichte ich".

Die Arduino-Software verzichtet aber nicht auf ein Verify und führt nach jedem Upload eines Sketches ein Verify durch. Und das Verify funktioniert mit Auslsen und Vergleichen.

Edit/Nachtrag: Gerade nochmal nachgelesen und das ist es, wie ich es verstanden habe: Im Gegensatz zu den Fusebits, die nur vorher gesetzt werden können, kann man die Lockbits wohl auch nach dem Programmierung+Verifizieren noch nachträglich setzen. So dass ein gesamter Schreibvorgang mit Setzen der Lockbits dann so aussieht:
- Erase Device  (macht die Arduino-Software bei "Bootloader installieren")
- Program Fuses (macht die Arduino-Software bei "Bootloader installieren")
- Verify Fuses (macht die Arduino-Software bei "Bootloader installieren")
- Erase FLASH (macht die Arduino-Software bei "Datei upload")
- Program FLASH (macht die Arduino-Software bei "Datei upload")
- Verify FLASH (macht die Arduino-Software bei "Datei upload")
- Program lock bits (macht die Arduino-Software nicht)
- Verify lock bits (macht die Arduino-Software nicht)

Nach dem Setzen der Lockbits kann man danach auch nur noch den ganzen Chip löschen (Erase device), aber nicht mehr Flash und EEPROM einzeln. So dass wenn man nachträglich die Lockbits setzt, danach nicht mehr einfach die Funktion "Datei upload" in der Arduino-Software verwenden kann, sondern man muß immer zuerst "Bootloader installieren" verwenden, damit der gesamte Controller mit allen Inhalten und den Lockbits gelöscht wird.

volvodani

@jurs
Da muss ich ein weing wiedersprechen. Das Verify führt nur ein Kompimieren aus ohne Upload damit kannst sehen ob dein Programm sauber kompiliert wird. Das kann man auch ohne angeschlossene Hardware machen.
Du kannst da ganz einfach Testen nimm Blink ohne angeschlossene Hardware und drück auf verify und du kannst kompilieren. (Wenn du auch auf dein Board schaust siehst  du das da nix übertragen wird RX und TX LED bleiben dunkel)

Gruß
Der Dani
"Komm wir essen Opa!" - Satzzeichen retten Leben!

jurs


@jurs
Da muss ich ein weing wiedersprechen. Das Verify führt nur ein Kompimieren aus ohne Upload damit kannst sehen ob dein Programm sauber kompiliert wird. Das kann man auch ohne angeschlossene Hardware machen.


Meine vorstehenden Ausführungen über das "Verify" beziehen sich NICHT auf das Überprüfen des Quellcodes auf syntaktische Fehler im Editor, sondern auf das fertig kompilierte Programm beim Hochladen auf den Controller.

volvodani

@jurs
dann habe ich das Verfiy aus der IDE gemeint und nicht das dirket aus dem Uploadvorgang.

Hiermit nehme ich meine Ausgae zurück und behaupte das gegenteil  :D
Gruß
DerDani
"Komm wir essen Opa!" - Satzzeichen retten Leben!

Eisebaer

hi,

ich bin so frei und nehme mal an, daß der geehrte threaderöffner kein mit der arduino-IDE auf einen atmel geldenes programm auslesen will. eher wohl eijnem atmel, den er in einem gerät gefunden hat.
und firmen, die ein produkt verkaufen, setzen natürlich die lockbits (die ich vorhin irrtümlich zu den fusebits gezählt habe).

sehe jetzt allerdings gerade, daß er anfangs von einem UNO spricht, also wer weiß...

gruß stefan

-Micky

Es geht einfach darum das ich manchmal nicht weiß welche Programm Version ich auf dem UNO gespeichert habe. Speziell wenn mal was nicht richtig funktioniert. Und hat man dann die geladen welche funktioniert, weiß ich aber nicht mehr welche es war.

Aber gut, einfach auslesen geht also nicht so einfach. Hilft also nur bessere Namen der Programme vergeben, damit klar ist welches was kann.


Micky


uwefed


Aber gut, einfach auslesen geht also nicht so einfach. Hilft also nur bessere Namen der Programme vergeben, damit klar ist welches was kann.
Micky


Besseren, selbsterklärende Namen sind nie schlecht. Ein Stück Papierklebestreifen mit dem Sketchnamen bzw Version auf den Arduino kleben hilft auch damit Du später weißt was draufgespeichert ist. Oder einfach per Serial print einen Sketchnamen und  Versionsnummer verschicken.

Grüße Uwe

Mardetuino

Leider muss man Sketchname und Version immer händisch ändern.

Interessanter wäre hier sicherlich __TIME__ und __DATE__ .

Go Up