Forum: Mikrocontroller und Digitale Elektronik Länge im Flash ROM (c++)


von Thomas (Gast)


Lesenswert?

Hallo. bisher habe ich immer folgende funktio benutzt:

unsigned int Code_Length = sizeof (text);

text ist eine konstante im flash ROM. Allerdings kann ich diese
funktion nicht mehr nehmen, da ich die Länge zur laufzeit ermitteln
muss.
ich habe es mit

unsigned int Code_Length = strlen(&text); und
unsigned int Code_Length = strlen(text);

schon versucht. Aber irgendwie geht es nicht.
Das letzte zeichen Der Konstante ist \0 als ist die konstante
nullterminiert und demit müsste doch die funktion strlen gehen. oder?
Was gibt es für alternetivfunktionen ? Oder wende ich sie nur falsch an
?

MfG

von Rufus T. Firefly (Gast)


Lesenswert?

Auf einem AVR funktioniert strlen nicht mit im Flash abgelegten
Stringkonstanten. Das liegt an der Harvard-Architektur.

Verwende stattdessen strlen_P, das ist eine AVR-spezifische Funktion,
die statt auf's RAM eben auf's ROM zugreift.

von Thomas (Gast)


Lesenswert?

funktioniert leider auch nicht.

egal ob
strlen_P(text)  oder
strlen_P(*text)  oder
strlen_P(&text)

von Rufus T. Firefly (Gast)


Lesenswert?

Die erste Schreibweise wäre wenigstens korrekt.

Was genau heisst "funktioniert nicht"?
Stürzt das Programm ab, wird 0 zurückgegeben oder inwiefern weicht der
Rückgabewert vom erwarteten Wert ab?

von Thomas (Gast)


Lesenswert?

ich weiss nicht genau, jedenfalls kommt ein wert heraus der viiiiel zu
nieder ist. Ich hab mal den wert ins eeprom geschrieben und dann
ausgelesen. es kam 28 raus aber ich hab ein integer wert in ein byte
geschrieben. wie kann ich denn die gesamte zahl herausbekommen ?

MfG

von Chris (Gast)


Lesenswert?

Poste doch bitte mal ein Minimal-Beispiel, das die fehlerhafte Ausgabe
erzeugt. Hellsehen funktioniert (bei mir) nicht so gut.


btw, (nicht böse gemeint): Lies dir bitte ein C-Buch oder Tutorial über
Pointer durch. Dann wüsstest du, dass strlen(*text) und strlen(&text)
Quatsch sind.

von Thomas (Gast)


Lesenswert?

mein code:

unsigned int Code_Length = strlen_P(text)-1;
eeprom_wb(1, Code_Length);
if (Code_Length % 2 != 0) UI_Error();

klar is des quatsch aber man kanns ja mal versuchen. ;)

von Chris (Gast)


Lesenswert?

Dein Code lässt sich nicht kompilieren. Wie ist text definiert?

Ohne in der Doku nachgesehen zu haben: eeprom_wb klingt stark nach
"write byte". Du übergibst aber zwei Bytes, nämlich einen unsigned
int. Da wird beim Speichern wohl was abgeschnitten werden.


> klar is des quatsch aber man kanns ja mal versuchen. ;)
Natürlich, wenn etwas überhaupt nicht funktioniert, versucht man auch
gerne mal "seltsame" Konstrukte. Dummerweise führen die extrem selten
zum Erfolg. ;-)
Ein Debugger (in dem Fall Simulator) hilft viel mehr.

In dem Beispiel war es übrigens wirklich Quatsch und nichtmal einen
ernsten Versuch wert. Das hat schon fast was von:
http://thedailywtf.com/ShowPost.aspx?PostID=29051


(Wer Ironie findet darf sie verkaufen).

von Thomas (Gast)


Lesenswert?

ja,das mit dem byte schreiben und 2 bytes schreiben wollen hab ich ja
schon gesagt. ich wollt nur sehen, ob da sich überhaupt was tut.

text ist so definiert:
prog_char text[] = { 0x5A, 0xC1, 0x73, 0xC1, 0x72, 0xC1, 0x71, 0xC1,
0x70, 0xC1, 0x6F, 0xC1, 0x6E, 0xC1, 0x6D, 0xC1,
 0x6C, 0xC1, 0xB1, 0xC4, 0x6A, 0xC1, 0x7A, 0xC5, 0x31, 0xC5, 0x67,
0xC1, 0xC4, 0xCE, 0xEB, 0xC9,
 0x64, 0xC1, 0x63, 0xC1, 0x62....,\0 };

ich kann den code zwar compilieren aber es kommt ein völlig falscher
wert heraus.

von Chris (Gast)


Lesenswert?

> ja,das mit dem byte schreiben und 2 bytes schreiben wollen hab ich ja
> schon gesagt. ich wollt nur sehen, ob da sich überhaupt was tut.
> [...]
> ich kann den code zwar compilieren aber es kommt ein völlig falscher
> wert heraus.

Hmm... es tut sich nichts, aber es kommt ein falscher Wert raus?

Wenn du einen integer in ein byte quetschst, ist es nicht sehr
verwunderlich, wenn ein falscher Wert rauskommt.
Sobald text länger als 256 Zeichen ist, passt das Ergebnis nicht mehr
in ein Byte. Hat text mehr als 256 Zeichen?

von Thomas (Gast)


Lesenswert?

Ja, das der wert nicht richtig sein kann bemerke ich am weiteren
Programmverlauf. Denn normalerweise dauert die schleife ca. 8-9 sec. so
dauert sie nur ne halbe sekunde. also ist der wert viel zu klein.

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.