mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
funktioniert leider auch nicht.

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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;)

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.