Hallo.
Ich habe ein Programm verändert und nun möchte ich einfach die
Möglihkeit
haben, variablen wärend der Laufzeit ueber rs232 zu verändern.
wenn im Map file für eine Byte Variable 0x00800101 drin steht,
dies ergibt diese Addresse 122011221 . Sie erscheint mir komisch oder
viel
zu hoch.
ich möchte im Programm sowas haben , cli gibt es schon:
*((unsigned char*)addr)=value;
Ich will einfach mit einfachen Mittels Variablen patchen koennen, ohne
die cli aufwendig zu erweitern. Mir get es darum, teile des Codes zu
testen,
ohne vorher das Drumherum schreiben zu muessen.
danke fuer die Hilfe.
chris schrieb:> Mir get es darum, teile des Codes zu> testen,> ohne vorher das Drumherum schreiben zu muessen.
das wird kaum sauber funktionieren. dafür müssen auch alle Variabel als
Volatile gekennzeichnet sonst kann es sein das sie nur im Register
stehen.
chris schrieb:> wenn im Map file für eine Byte Variable 0x00800101 drin steht,
Es sind wieder Informationsspartage. ;)
Ich hab verschiedene Tools und eines erzeugt zB Daten dieser Art:
1
DSEG oldKey 00000102
2
DSEG keytimer 00000103
Also ganz brauchbar.
Entweder ist deine Toolchain mist, oder Du interpretierst die Daten
falsch.
Peter II schrieb:> chris schrieb:>> Mir get es darum, teile des Codes zu>> testen,>> ohne vorher das Drumherum schreiben zu muessen.>> das wird kaum sauber funktionieren. dafür müssen auch alle Variabel als> Volatile gekennzeichnet sonst kann es sein das sie nur im Register> stehen.
Wenn sie in der Map mit Adresse aufgeführt sind, sind sie sicher nicht
im Register.
Detlef Kunz schrieb:> Wenn sie in der Map mit Adresse aufgeführt sind, sind sie sicher nicht> im Register.
doch, kurzeitig. Sonst bräuchte man ja kein volatile, denn diese
variablen stehen auch im map-file.
Die variablen sind in einem C File declariert und andere C-Files greifen
darauf zu, aber ich habe es gerade getested, volatile zuzufuegen stellt
kein
Problem dar. Die Adresse ist fast ähnlich.
Wieso ist die Adresse von ram im AVR derart hoch ?
kann man die einfach so verwenden ?
Ja, das Problem ist, ich kenne mich zu wenig mit AVR's aus.
ich hatte folgende Zeile im Make
avr-gcc -Wall -Os -DF_CPU=16000000 -mmcu=atmega328p -I.
-ffunction-sections -o main.elf main.o ... -lm -Wl,--gc-sections
Diese hatte ich auf folgende geaendert, um ein map file zu bekommen
avr-gcc -Wall -Os -DF_CPU=16000000 -mmcu=atmega328p -I.
-ffunction-sections -o main.elf main.o ... -lm
-Wl,--gc-sections,-Map,main.map
Auszug aus dem resultierenden Map file:
.data 0x00800100 0x9 motion.o
0x00800100 w_idx
0x00800101 v_idx
0x00800102 u_idx
0x00800103 c_idx
0x00800104 b_idx
0x00800105 a_idx
Peter II schrieb:> Detlef Kunz schrieb:>> Wenn sie in der Map mit Adresse aufgeführt sind, sind sie sicher nicht>> im Register.>> doch, kurzeitig. Sonst bräuchte man ja kein volatile, denn diese> variablen stehen auch im map-file.
Oh, ich hab übersehen, das es hier darum geht, eine Variable blind zu
überschreiben, ohne das man eine Ahnung hat, wie die CPU damit umgeht.
;)
@chris
Nunja, Du solltes vielleicht mal nach googlen (oh, das böse Wort) was es
mit GCC+Mapfile+Format auf sich hat.
Dann wirst Du darauf kommen das
0x00800100 w_idx
w_ids an Adresse 0x0100 steht und das 0x080 ... such selbst!
Es gibt eine State machine, und der Code läuft nicht, wenn da
rumgepatcht wird. Ziel ist es einen Bug zu reproduzieren, und da wäre
solch ein Patch
Interface recht hilfreich. Die Schaltung hängt an der Netzspannung, und
ich habe nur eine isolierten rs232 half duplex Verbindung.