guten tag,
ich habe mal eine frage, und zwar benutze ich einen Mega128,habe mehre
bilddaten im flash ligen alles bis 64K wird korrekt angezeigt aber alles
über 64K eben nicht,dann habe ich mit pgm_read_byte_far das ganze
versucht, aber das haut auch nich hin.
meine bilddaten;
#include <avr/pgmspace.h> //WinAVR
prog_uchar 63bmp[]= { //AVR-GCC, WinAVR
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
mein aufruf;
by=pgm_read_byte_far(bitmap);
vielleicht kann mir jemand bischen weiterhelfen
mfg
hallo,
in Assembler ist das ganze eigendlich ganz einfach
ldi ZL, byte3(2*63bmp)
out rampz,ZLldi ZL, low(2*63bmp)
ldi ZH, high(2*63bmp)
elpm WL, Z+
das Funktioniert herforragend von 0-128K beim Mega128
warum ist das in AVR-GCC so schwierig
vielleicht könnt mir da jemand ein stück weiterhelfen
mfg
Ich verstehe nicht, wieso die AvrLib-C kein eintsprechendes Macro im
pgmspaceModul enthält. Es existieren zwar "far"-Funktionen die einen 32
Bit Pointer erwarten, aber eben kein FAR-Macro, welches diesen Pointer
liefert.
Vermutlich könnte man das Macro z.B. direct in die pgm_read_far Funktion
integrieren, so dass man der Funktion bloss den 16-Bit Pointer mitgeben
müsste...
Peter schrieb:> Ich verstehe nicht, wieso die AvrLib-C kein eintsprechendes Macro im> pgmspaceModul enthält.
Weil du es noch nicht als Patch eingereicht hast?
(Bitte nicht vergessen, dafür doxygen-Dokumentation mit zu liefern.
Sonst benutzt den Makro keiner, weil ihn keiner kennt.)
https://savannah.nongnu.org/patch/?group=avr-libc
so ich habs in der pgmspace.h eingefügt nun kommt allerdings 3x der
Fehler
undeundefined reference t 'r30'
undeundefined reference t 'r30'
undeundefined reference t 'r30'
vielleicht könnte mir wer sagen was ich falsch mache
mfg
Hm. So wie ich das sehe, wird ein Pointer beim Zugriff aufs Flash
ohnehin zu einem uin16_t bzw. uint32_t gecasted. Da stellt sich für mich
schon die Frage, ob man 32-Bit-Pointer in gcc-avr einführen sollte, nur
um sie anschließend wieder auf uint32_t zu casten. Sonst wird doch
nirgendwo ein 32-Bit-Poiter benötigt, noch ist das SRAM ja nicht so
groß, ;)
Gruß, DetlevT
mit dem Macro bekomme ich mein Quelltext nicht Compilliert da er mir
immer den Fehler 3x ausgibt,
undefined reference t 'r30'
das einzigste was funktioniert ist halt dies,
by=pgm_read_byte_far( 0x10000UL + (uint32_t) (uint16_t) bitmap);
schade das es keine funktion gibt wo ich den gesamten Flash lesen kann
mfg
Hallo Peter,
wiegesagt habe das Macro in pgmspace.h eingefügt so wie es weiter oben
gepostet ist
und dazu dann der aufruf by=pgm_read_byte_far(FAR(bitmap));
es kommt dann immer der Fehler mit undefined reference to 'r30'
Schade das das nicht funktioniert,
oder mach ich da was verkehrt
mfg
neuling schrieb:> mach ich da was verkehrt
Gib mal den Code, den du wirklich compilieren willst. Ich wollte
gerade dein Beispiel von ganz oben testen, aber das ist offensichtlich
nicht per copy&paste aus deinem Editor, denn "63bmp" ist zwar
vielleicht ein gültiger Domainname im Internet, aber es ist kein
gültiger Bezeichner in der Sprache C.
p.s.: Bitte markiere den C-Code als solchen.
Im Macro kann mann sogar die Zeile mit dem [clr %D0" "\n\t" \]
weglassen, das 4. Adressbeyte wird ja nicht benötigt. => Spart 2 Bytes
und einen CPU-Zyklus pro Aufruf.
Hallo Peter,
die Lösung sieht gut aus, aber wie läßt sich ein Element im FAR-Bereich
referenzieren? In dem Beispiel gibt's ja immer nur 0xAA zurück. Wie
komme ich z.B. an 0xDD? mit FAR(&MyBmp64[3]) komme ich nicht weiter wg.
Lvalue.
Danke!
Martin
>mit FAR(&MyBmp64[3]) komme ich nicht weiter wg. Lvalue.
Da müsste ich mal bisschen pröbeln, aber eigentlich müsste es zum
Beispiel folgendermassen klappen:
pgm_read_byte_far(FAR(MyBmp64)+3);
Hallo Peter,
ja, so mit direkter Pointerarithmetik scheint es zu gehen, hatte ich
auch schon probiert. Wenn es aber komplexere Tabellen sind, wäre ein
Indexzugriff sicher besser. Falls also beim "pröpeln" was rauskommen
sollte, wäre das sicher nicht nur für mich sehr hilfreich.
Nochmal Danke!
Martin