Habe ein Array im Speicher hinterlegt, mit dem ich später in einer
Schleife arbeiten möchte. Je nach dem, welchen Wert ich wähle, sollen
alle vorherigen Werte aufaddiert werden.
Wähle ich also Wert 1 soll 7+3=10 raus kommen. s.u.
1
constuint8_tMENUSTR[]PROGMEM={
2
3,
3
7,
4
3,
5
0,
6
};
...
main:
1
uint8_tsub=0;
2
3
//Schleife, die nicht funktioniert:
4
for(uint8_tj=0;j==1;j++){
5
sub=&MENUSTR[j]+sub);
6
}
1
//soll das gleiche machen:
2
3
uint8_tj=0;
4
sub=&MENUSTR[j]+sub;
5
j++;
6
sub=&MENUSTR[j]+sub;
7
//funktioniert
Ich habe nun einfach mit einem festen Wert gearbeitet. Anscheinend kommt
allerdings bei der Schleife immer der Initialwert von sub heraus. Also
im Beispiel 0.
Wenn ich direkt hintereinander Schreibe, was die Schleife machen soll,
funktioniert es allerdings.
Woran denke ich nicht?
Würde mich über Hilfe freuen.
Gruß
Alex
Auf Werte im Flash kannst du nicht direkt zugreifen. Du musst sie mit
den dafür vorgesehenen Funktionen aus dem Flash lesen. Das die eine
Variante auch mit direktem Zugriff zu funktionieren scheint, liegt
daran, dass der Optimierer hier gleich die Zugriffe durch die
entsprechenden Werte ersetzt.
Und nachdem ich nochmal drauf geschaut habe, wage ich auch zu
bezweifeln, dass die funktionierende Variante tatsächlich so mit den '&'
darin funktioniert.
Alex schrieb:
> War es so gemeint wegen der automatischen Optimierung?
Was meinst du mit "automatischen Optimierung"?
Bei der Schleifen-Variante führt kein Weg an den Flash-Funktionen
vorbei.
Alex schrieb:
> Ob das die gewünschten Funktionen sind, mit denen man die Werte korrekt> aus dem Flash liest?
Ich sehe in dem Code gar keine Funktionen.
Sieh dir den Link an, den docean gepostet hat.
wenn du
const char buffer[] PROGMEM = { 1,2,3,4]};
hast
must du mit
char wert=0;
for( char i=0; i<=3 , i++)
{
wert += pgm_read_byte( &buffer[i]);
}
zugreifen
oder so ähnlich ^^ kein plan ob das gehen würde
pgm_read_byte klappt allerdings nicht und mit dem Geschriebenen wird
genau auf die Werte im Array zugegriffen.
Also meine Frage:
Wie wird dieses wegoptimiert, was ich geschrieben habe. Bzw. wie sollte
der Code aussehen? Aus dem Tutorial konnte ich leider nicht mehr
gewinnen.
Alex schrieb:
> pgm_read_byte klappt allerdings nicht
Dann hast du es falsch benutzt.
Wie sieht dein Code dazu aus?
Und ich verstehe nicht, was du jetzt die ganze Zeit mit dem "Optimieren"
meinst. Der Optimierer hat nur unbeabsichtigterweise dafür gesorgt, dass
ein Teil deines Codes zufällig funktioniert hat, obwohl er eigentlich
fehlerhaft war.
Es wird nicht der Wert an der Stelle j benutzt sondern irgendwas
anderes.
In meinem Beispiel:
1
constuint8_tMENUSTR[]PROGMEM={
2
3,
3
7,
4
3,
5
0,
6
};
sollte dann an der Stelle j=0 der Wert 3 benutzt werden. Wird er aber
nicht. Bekomme dann nur komisches Zeug raus. Wenn ich allerdings
pgm_read_byte weg lasse kommt alles richtig heraus.
Hatte es vorher ja auch mit pgm_read_byte versucht aber dann einfach mal
weg gelassen. Und es ging.
Gruß
Alex
Alex schrieb:
> Hatte es vorher ja auch mit pgm_read_byte versucht aber dann einfach mal> weg gelassen. Und es ging.
Zeig mal dein ganzes Programm mit dem du testest.
Sorry, aber das funktioniert so nie und nimmer. Nicht nur, dass der
richtige Flashzugriff fehlt, du addierst auch Pointer auf. Wenn du ein
"ok" bekommst, ist das reiner Zufall.
Tja.
Und aus der Ausgabe 'OK' bzw. 'Nicht OK' kann man so wunderbare
Rückschlüsse darauf ziehen, was denn das Problem ist. :-)
Warum lässt du dir denn nicht einfach mal sub ausgeben!
Aus dem Zahlenwert sieht man doch viel mehr als aus einer OK/Nicht OK
Meldung.
for(uint8_t j=0; j<=1; j++){
sub= &MENUSTR[j] + sub;
}
Das ist Unsinn!
Du MUSST über pgm_read_byte gehen.
Alles andere kann ev. das Richtige ergeben (weil ja immer an jeder
Speicherstelle irgendetwas drinnen steht und jedes Teil eine Adresse
hat), aber das ist dann Zufall!
Und achte ein bischen auf die äußere Form deines Programmes.
Interessanterweise sind es nämlich meistens die
Hässlichen-Kraut-und-Rüben Programme, die solch seltsame sporadische
Fehler aufweisen.