merkwürdiges Verhalten

Gast #2635311
Lesenswert?

Hallo,

ich bin beim Programmieren eines AtTiny45 mit avr-gcc auf ein 
merkwürdiges Verhalten gestoßen, das ich in folgendes Minimalbeispiel 
verwandelt habe:
1
void strange(int32_t c) {
2
  if (c==1) ok();
3
  else bad();
4
  if (letters[c]==0b1000) ok();
5
  else bad();
6
  if (letters[1]==0b1000) ok();
7
  else bad();
8
  c=1;
9
  if (letters[c]==0b1000) ok();
10
  else bad();
11
}

wenn ich diese Funktion mit strange(1) aufrufe werden in dieser 
Reihenfolge aufgerufen ok, bad, ok, ok. Kann mir das jemand erklären? 
Falls das relevant ist, ist das gesamte Programm angehängt. Schon mal 
Danke für Hilfe!

Gruß,
Stefan
Angehängte Dateien:
Gast #2635320
Lesenswert?

Oh, ich glaube ich habe schon erste Hinweise gefunden: der Abschnitt 
"Programmspeicher (Flash)" suggeriert, dass das prinzipiell nicht 
funktionieren dürfte. Dafür, dass die letzten beiden Zugriffe letters[1] 
doch so funktionieren, wie ich mir das vorgestellt habe, liegt 
wahrscheinlich an einem klug optimierenden Compiler, der das genauso 
sieht.
#2635342
Lesenswert?

Stefan schrieb:
> der Abschnitt
> "Programmspeicher (Flash)" suggeriert, dass das prinzipiell nicht
> funktionieren dürfte.

Hä? Falls du damit vielleicht andeuten willst, dass das "const" dafür 
sorgt, dass das Array im Flash landet ... nein, dem ist nicht so.

Stefan schrieb:
> Dafür, dass die letzten beiden Zugriffe letters[1]
> doch so funktionieren, wie ich mir das vorgestellt habe, liegt
> wahrscheinlich an einem klug optimierenden Compiler,

Richtig.
Und dass es in dem anderen Fall nicht geht, deutet darauf hin, dass das 
Array im Speicher nicht den richtigen Inhalt hat. Dafür gibt es mehrere 
mögliche Gründe. Ich tippe mal auf eigenes Makefile mit nicht korrekter 
objcopy-Zeile.
Gast #2635562
Lesenswert?

Stefan Ernst schrieb:
> Stefan schrieb:
>> der Abschnitt
>> "Programmspeicher (Flash)" suggeriert, dass das prinzipiell nicht
>> funktionieren dürfte.
>
> Hä? Falls du damit vielleicht andeuten willst, dass das "const" dafür
> sorgt, dass das Array im Flash landet ... nein, dem ist nicht so.

Nein, das wollte ich nicht andeuten. Dass "const" nicht dafür sorgt, 
dass etwas im Flash landet, ist komischerweise so ungefähr das erste was 
man in der avr-libc-Doku erzählt bekommt. Da ich keine Beispiele gesehen 
habe, wo Konstanten nicht im Flash gespeichert werden, dachte ich, 
dass das vielleicht einen tieferen Grund hat (tiefer als RAM zu sparen).

> Stefan schrieb:
>> Dafür, dass die letzten beiden Zugriffe letters[1]
>> doch so funktionieren, wie ich mir das vorgestellt habe, liegt
>> wahrscheinlich an einem klug optimierenden Compiler,
>
> Richtig.
> Und dass es in dem anderen Fall nicht geht, deutet darauf hin, dass das
> Array im Speicher nicht den richtigen Inhalt hat. Dafür gibt es mehrere
> mögliche Gründe. Ich tippe mal auf eigenes Makefile mit nicht korrekter
> objcopy-Zeile.

Genau, es war ein Problem mit objcopy. Leider habe ich das, statt 
regelmäßig nach Antworten zu schauen, langwierig selbst herausgefunden. 
Trotzdem vielen Dank!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren