Forum: Mikrocontroller und Digitale Elektronik Kommunikation AVR <=> PC mittels USART und .map-Datei


von Christian (Gast)


Lesenswert?

Hallo,

ich habe die Suchfunktion benutzt, allerdings weiss ich nicht so recht 
wonach ich suchen soll. Falls das Thema also schon existiert bitte ich 
um Entschuldigung und um einen Link.

Ich habe mir vorgestellt vom PC aus einen direkten Zugriff auf die 
Variablen in meinem Controller (Atmega16) zu haben. Dies bedeutet zu 
lesen und zu schreiben. Die Verbindung sollte über USART erfolgen, was 
auch eine drahtlose Verbindung erlaubt. Diese habe ich auch über 
Bluetooth (http://meinemullemaus.de/btm222/index.html) realisiert.

Ich habe noch sehr wenig Ahnung von C und Mikrocontrollern und ich 
weiss, dass µCs keine gute Platform sind um C zu lernen. Wenn ich also 
Quatsch schreibe hängt dies damit zusammen.

Meine Idee ist nun, aus der .map-Datei die Adressen der Variablen 
auszulesen und mittels dieser Info über USART diese Variablen auf dem µC 
zu lesen und zu schreiben. So wie ich es verstehe benötigt man eine 
kleinen Befehlsparser auf µC Seite (z.B.: set(Adresse, Länge, Daten); 
get(Adresse, Länge))und ein komplexeres Programm auf dem PC. Das 
PC-Progamm müsste die Infos aus der .map-Datei auslesen, die 
Variablenwerte benutzerfreundlich (Zahlen, Zeichen) darstellen und in 
korrekter Form zum µC kommunizieren.

Gibt es eine solche Funktionalität schon? Ich würde ungerne alles selber 
schreiben wollen ;-)

Für jede Antwort bin ich sehr dankbar,
Christian

von Peter (Gast)


Lesenswert?

Christian schrieb:
> Gibt es eine solche Funktionalität schon? Ich würde ungerne alles selber
> schreiben wollen ;-)
nein, weil es wenig sinn macht. Es gibt noch ein großen Problem was du 
noch nicht sieht. Der Compiler optimiert. Wenn überhaupt geht das ganze 
nur für Variabeln die volatil sind. Für alle andere wird es nicht sauber 
gehen, weil sie zwar eine RAM-Adresse haben aber sehr oft in Register 
gehalten werden. Damit hat eine änderung im Ram keine Auswirkung.

von Christian (Gast)


Lesenswert?

Vielen Dank für die schnelle Antwort.

Mir war es schon klar, dass ich nur auf volatile Variablen so zugreifen 
kann. Das ist auch GENAU mein Ziel, da die Steuerung auf meinem µC über 
solche Variablen funktioniert. Also der momentane 'Modus' ist in solchen 
Variablen abgelegt und durch setzen dieser kann ich den µC steuern. 
Ausserdem sind die wichtigsten Messwerte auch als Volatile abgelgt und 
ich könnte sie somit auslesen.

Viele Grüße,
Christian

von Peter (Gast)


Lesenswert?

Christian schrieb:
> Vielen Dank für die schnelle Antwort.
>
> Mir war es schon klar, dass ich nur auf volatile Variablen so zugreifen
> kann. Das ist auch GENAU mein Ziel, da die Steuerung auf meinem µC über
> solche Variablen funktioniert. Also der momentane 'Modus' ist in solchen
> Variablen abgelegt und durch setzen dieser kann ich den µC steuern.
> Ausserdem sind die wichtigsten Messwerte auch als Volatile abgelgt und
> ich könnte sie somit auslesen.

und warum willst du es direkt über die Adresse machen? Warum nicht im 
Klartext übertragen.

var1 = 5;

und dann im µC

if ( strcmp(name,"var1") == 0 ) {
   var1 = value;
}

dafür braucht man kein mapfile und das ganze funktioniert auch mit mehre 
versionen von dem Programm.

von Christian (Gast)


Lesenswert?

Weil ich dann für JEDE Variable die ich setzen oder lesen möchte dies 
einzeln programmieren muss. Das habe ich momentan für drei Werte 
implementiert.

Ich würde einen generischen Ansatz bevorzugen der einmal (viel) mehr 
Aufwand ist aber sich bald auszahlen sollte. Ausserdem hoffe ich es hat 
schon jemand gemacht. Zum einen ist ab einer gewissen Anzahl an 
Variablen der benötigte Speicherbedarf auf dem µC kleiner und zum 
anderen brauche ich die Implementierung nicht mehr anzufassen, egal 
welche Variablen ich lesen oder schreiben mag. Die Funktionen wären auch 
eins zu eins bei anderen Projekten einzusetzen.

Viele Grüße,
Christian

von ttl (Gast)


Lesenswert?

das ist eine der blödesten Ideen die ich je gehört habe

von Mar V. (marvol)


Lesenswert?

Hallo Christian,

die Idee finde ich gut. Ich habe mal einen kleinen Monitor geschrieben, 
der wie bereits beschrieben die Variablen als Kommandointerpreter 
ausließt, aber dies ist wie bereits von Dir beschrieben etwas 
umständlich.

So, nun habe ich in die Map reingeschaut, dort finde ich zwar die 
Variablen, aber ich kann nicht raus finden von welchem Typ diese sind. 
Somit kann ich zwar den Wert übertragen, kann aber nicht die Datenlänge 
bestimmen.

Hast Du eine Idee?

Gruß
Marvol

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

sag sowas nicht. Ich hab das mal für Parameter ähnlich gemacht. 
Allerdings hat da ein Script nach dem Linken des Programms aus dem 
Mapfile die Adressen alle Variablen mit dem Prefix eeprom_ ermittelt und 
diese Tabelle (Name + Adresse) dann ins finale HEX-File gepatcht. Das 
Konfigurationsprogramm am PC ließt dann diese Tabelle und ermittelt 
damit die Positionen der jeweiligen Variablen im EEPROM. An der 
Schnittstelle ist das Protokoll dann sehr kompakt. Kommen neue Parameter 
hinzu braucht am Protokoll nichts geändert werden. Dieses Verfahren hat 
sich als sehr brauchbar herausgestellt. Für den TO hab ich aber auch 
nichts fertiges.

Matthias

von Luftpumpe (Gast)


Lesenswert?

Sowas gibts schon, aber wohl nicht kostenlos. Nennt sich XCP und ist von 
ASAM standardisiert. Wobei der Transportlayer meistens Can und Flexray 
ist, da das ganze aus dem Automotivebereich kommt. Aber Prinzip 
funktioniert es so du es selber machen wolltest. Xcp-Slave fürs Target 
und Xcp-Master für den Pc gibts von verschiedenen Herstellern aber 
wahrscheinlich privat nicht bezahlbar.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

wenn du noch die Datentypen rausfinden willst kannst du z.B. die 
Debuginfos im elf lesen (was wohl nicht so einfach ist oder ich hab noch 
nicht die passende Bibliothek gefunden) oder die Datentypen der 
jeweiligen Variablen z.B. mit ctags ermitteln.

Matthias

von Luftpumpe (Gast)


Lesenswert?

Also bei den proffesionellen Produkten muss man den Datentyp wissen und 
seperat angeben. Genauso den Aufbau eines Structs, da ja nur die 
Start-Adresse im Map-File steht. Die Adressen der einzelnen Members 
werden unter Berücksichtigung des Alginment dann ausgerechnet.

von Matthias L. (Gast)


Lesenswert?

Genaus diese Idee wurde hier im Forum schonmal diskutiert. Ich finds nur 
leider nicht mehr ;-(

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

hab ich eben nochmal ein bisschen umgesehen. Mit Hilfe von dwarfdump 
(http://reality.sgiweb.org/davea/dwarf.html) und der besprochenen map 
Datei sollten sich alle benötigten Informationen ermitteln lassen. Das 
ist aber sicher alles andere als eine fünfminütige Fingerübung bis man 
alles soweit hat.

Matthias

von Christian (Gast)


Lesenswert?

Hallo,

vielen Dank für die vielen Antworten. Wie gesagt bin ich Anfänger und 
hatte gehofft eine fertige Lösung würde schon existieren ;-). Ich werde 
mir das Thema wohl erst später anschauen und zunächst jeden "Befehl" 
einzeln implementieren.

Viele Grüße,
Christian

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.