Forum: Mikrocontroller und Digitale Elektronik länge zur Laufzeit


von Hans Ouschen (Gast)


Lesenswert?

Hallo.

Ist es möglich, die länge eines im flash ROM abgelegten Datensatzes zur
laufzeit zu bestimmen ?
Bis jetzt verwende ich immer sizeof(), das wird aber (wenn ich es
richtig weiss) vom coprozessor schon rausgeschnissen und durch die zahl
ersetzt. Ich brauche aber die Länge zur Laufzeit, da das HEX File nach
dem compilieren und linken  noch bearbeitet wird (Der Flash ROM
bereich).

(ich verwende WINAVR-GCC auf einem ATMega16)
MfG Simon

von Stefan May (Gast)


Lesenswert?

wenn es sich um einen Null-terminierten String handelt, kann man strlen
benutzen.

ciao, Stefan.

von Tobi (Gast)


Lesenswert?

entweder wie schon beschrieben durch einen terminierenden char oder wenn
jeder char in den daten enthalten sein kann plane ein entsprechend
grosses size feld am anfang der daten ein, dass dann entsprechend
aktualisiert wird

von Matthias (Gast)


Lesenswert?

Hi

ich habs nicht verstanden. sizeof() bestimmt ja nur die Größe eines
Datentypes bzw. Arrays. Und was willst du jetzt genau zur Laufzeit
herausfinden?

BTW:
sizeof() wird AFAIK nicht vom Präprozessor ausgewertet. Zumindest wirft
es der GCC beim Aufruf mit -E noch mit aus. Wär auch schwierig denn der
Präprozessor weis eigentlich nichts über den Syntax der Sprache.

Matthias

von Hans Ouschen (Gast)


Lesenswert?

@Matthias

ich habe einen String im flash ROM und dessen (aktuelle) länge brauche
ich zur Laufzeit. (d.h. die Array Länge).

Ich weiss nicht genau von was der wert (mit der funktion sizeof() )
errechnet wird aber die hauptsacht ist ja, das sie nicht zur laufzeit
berechnet wird, was in den meisten fällen so auch gut ist.

Wird eigentlich im intelhex-format die gesamtlänge der datei irgendwie
festgehalten ? oder kann ich einfach im nachhinein die datei bearbeiten
und an der stelle wo mene flash daten stehen was anderes hin schreiben?
(denk mal so einfach gehts nicht, da sin ja sicher noch crc's oder so
drinn)


PS::hab grad bemerkt in meinem letzten thread hatte ich coprozessor
geschrieben, damit meinte ich natürlich den präprozessor. hatte mal
wieder was falsches im kopf ;)

MfG

von Rufus T. Firefly (Gast)


Lesenswert?

> ich habe einen String im flash ROM und dessen (aktuelle) länge
> brauche ich zur Laufzeit. (d.h. die Array Länge).

Dir ist die Funktion strlen bekannt?

(Beim Gebrauch die Harvard-Architektur der AVR-Prozessoren
berücksichtigen!)

von Matthias (Gast)


Lesenswert?

Hi

mit strlen_P kannst du die Länge eines nullterminierten Strings im
Flash zur Laufzeit bestimmen.

So einfach was ins Intel-Hex einzupflücken geht nicht. Wenn du damit
Teile deines Programmcodes verschiebst schon garnicht. Ich gehe
üblicherweise den Weg über eine Binärdatei. Mittels avr-objcopy aus dem
Intel-Hex eine Binärdatei machen, die wie gewünscht bearbeiten und dann
wieder mit avr-objcopy ein Intel-Hex erstellen.

Matthias

von Hans Ouschen (Gast)


Lesenswert?

@Matthias:
So würd ichs ja auch machen, wenn ich das nur 1x machen müsste. Aber
ich will ein Programm schreiben, dass das erledigt. Das will ich
wahrscheinlich später mal verkaufen und ich kann ja schlecht den
avr-objcopy verkaufen.

Mein Programm muss als aufgabe ein HEX file haben.

MfG

von Hans Ouschen (Gast)


Lesenswert?

Sorry, hab mich verschriben.
soll heissen:
Mein Programm muss als ausgabe ein HEX file haben.

von Matthias (Gast)


Lesenswert?

Hi

du sollst ja nicht avr-objcopy verkaufen. Du steuerst mit deinem
Programm avr-objcopy und legst es einfach bei. Oder investierst zwei
Stunden und schreibst einen Parser für Intel-Hex und ein paar
Funktionen die Intel-Hex wieder schreiben,

Matthias

von Hans Ouschen (Gast)


Lesenswert?

Das mit avr-objcopy verkaufen war auch so gemeint. ich verkaufs ja
schließlich dann mit.
Ja, ich denk so werd ichs auch machen. kenntst du eine doku zum ihex
format ?

MfG

von Matthias (Gast)


Lesenswert?


von Hans Ouschen (Gast)


Lesenswert?

darauf hätt ich auch selber kommen müssen.
Trotzdem Danke !

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.