pgm_read_byte_far -> Invalid IValue in asm input

Gast #7069749
Lesenswert?

Hallo,

leider finde ich trotz Recherche nicht die Lösung.
Ich lese aus dem Bootloder (ATMEGA128) das Flash mit pgm_read_byte_far 
aus.

IDE AS7 mit toolchain-3.6.2.1778 (gcc 5.4.0)

- uint32_t u32FlashAddr;
- uint8_t  u8data;
- u8data = pgm_read_byte_far(u32FlashAddr);

Es scheint auch zu funktionieren, allerdings bekomme ich die Meldung
-> Invalid IValue in asm input for constraint `I
Beim ATMEGA1281 mit gleichem Code und IDE erscheint keine Fehlermeldung.
Wer hat hier einen Rat?

Gruß Andi
Gast #7069910
Lesenswert?

Andi schrieb:

> - u8data = pgm_read_byte_far(u32FlashAddr);

> Wer hat hier einen Rat?

Das Problem steckt in dem Code, der den Inhalt von u32FlashAddr 
übergibt, er poppt hier nur auf, weil da die Parameterprüfung von 
pgm_read_byte_far zum Zuge kommt.

Irgendwas läuft da auf den 128 anders als auf dem 1281. Und zwar so 
anders, dass der Fehler schon zur Compilezeit über die Parameterprüfung 
erkennbar wird. Seltener Glücksfall übrigens. Hätte auch ein 
"unerkärlicher" Laufzeitfehler werden können...
Gast #7069979
Lesenswert?

c-hater schrieb:

> Das wäre wohl irgendwann in den vielen Jahren schonmal aufgefallen. Der
> AVR128 ist ja nun nicht gerade "bleeding edge"...

Sollte natürlich heißen: ATmega128. Aber dabei fällt mir was auf: geht 
es möglicherweise tatsächlich um einen AVR128D(irgendwas) und garnicht 
um einen ATmega128?

Das wäre natürlich ein game changer. Die sind recht neu, da wären Fehler 
im Support durch den Compiler durchaus noch zu erwarten.
#7070656
Lesenswert?

Kannst du denn mal ein echten Code zeigen und auch die komplette echte 
Fehlermeldung (die heisst mit Sicherheit anders)?
Auch die Aussage "es scheint zu funktionieren" ist komisch. Bringt der 
Compiler die Meldung als Warnung?

Solch aus dem Gedächtnis eingetippter Kram ist meistens am Ende ganz 
anders.

Ich habe hier nur einen avr-gcc 10.1, der und die mir vorliegende 
avrlibc compilieren pgm_read_byte_far für dem Mega128 ohne Probleme.
Ob Microchip da was an deren Versionen verbastelt hat, keine Ahnung.

Oliver
Gast #7072743
Lesenswert?

Rolf M. schrieb:

> Dürfen darf er schon

Klares nein. Volatile zeigt an, dass der Inhalt ausserhalb des lokalen 
scope geändert/benutzt werden könnte.

Da der strohdummen Compiler aber eben nur diesen lokalen scope hat, muss 
er logischerweise davon ausgehen, dass das auch tatsächlich passiert, 
denn der Programmierer sagte es ihm explizit.

Dementsprechend darf er nicht seinen stark beschränktes Wissen von der 
Welt zum Anlass nehmen, schwachsinnige und nicht nachweisbar begründete 
Warnungen zu generieren. Tut er es doch, ist er kaputt.

So einfach ist das eigentlich.
#7072858
Lesenswert?

c-hater schrieb:
> Rolf M. schrieb:
>
>> Dürfen darf er schon
>
> Klares nein.

Dem Compiler wird weder vorgeschrieben, noch verboten, bei Variablen, 
die nach der Definition nie verwendet werden, zu warnen. Und das ist 
ganz unabhängig davon, ob sie volatile sind. Allerdings kann es bei 
volatile-Variablen sinnvoll sein, bei den anderen bringt es eher nichts, 
also entscheidet sich der Compiler (aus freien Stücken), bei denen, die 
volatile sind, nicht zu warnen.

> Volatile zeigt an, dass der Inhalt ausserhalb des lokalen
> scope geändert/benutzt werden könnte.

Ich weiß, wofür volatile steht. Das hat aber nichts mit Warnungen zu 
tun.
#7087587
Lesenswert?

Vielleicht erst mal richtig lesen:

5 der 7 geposteten Fehlermeldungen kommen von einem anderen Projekt 
(sind also hier irrelevant).

Die zwei verbleibenden kommen von IntelliSense 
("Tipphilfe"/Syntaxchecker) und nicht vom gcc, der das eigentliche 
Binary produziert.

IntelliSense ist - meine ich - clang- (und eben nicht gcc-) basiert. 
D.h. es ist nicht dieselbe Engine, die da läuft, und die macht eben 
nicht alles ganz genauso wie gcc - insbesondere, wenn man sich 
ausserhalb des x86-Universums bewegt.

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