Forum: Compiler & IDEs merkwürdiges Verhalten


von Stefan (Gast)


Angehängte Dateien:

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

von Stefan (Gast)


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.

von Stefan E. (sternst)


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.

von Stefan (Gast)


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!

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.