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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.