Hallo,
ich habe ein kleines Problem (welches vermutlich irgendwo schon bis in's
letzte Detail erklärt ist... nur finde ich diese Stelle nicht).
Programmiersprache ist C++ (gcc-avr), µC ist ein ATmega32u4
Ich habe ein paar Arrays im C++-Teil meines Projektes. Diese folgen
durchweg diesem Schema:
1 | extern "C"
|
2 | {
|
3 | PROGMEM volatile const uint8_t data[64] = // volatile?! why?
|
4 | {
|
5 | 0,1,2,3,...
|
6 | };
|
7 |
|
8 | volatile uint8_t offset = 0;
|
9 | }
|
Ich muss in einem kleinen inline-assembly Teil auf vier verschiedene
davon zugreifen, d.h. ich kann nicht einfach den g++ die Addresse in's
Z-register (bzw. X/Y) schieben lassen sondern muss irgendwie "direkt" an
die Adresse herankommen.
1 | "ldi r30, pm_lo8(data) \n\t"
|
2 | "ldi r31, pm_hi8(data) \n\t"
|
3 | "lds r16, (offset) ; range [0..255] ! \n\t"
|
4 | "asr r16 ; shift down by two bits \n\t"
|
5 | "asr r16 ; so range is [0...63] \n\t"
|
6 | "add r30, r16 ; add offset \n\t"
|
7 | "adc r31, r0 ; add carry (and r0=0) \n\t"
|
8 | "lpm r17, Z ; load value into r17 \n\t"
|
Dabei habe ich verschiedene Probleme:
1. Wenn ich das Array ohne einen (zusätzlichen) 'volatile' anlege,
bekomme ich einen 'undefined reference "data"'... und ich verstehe nicht
warum?!
2. Es ist bestimmt ein dummer (Verständnis-)Fehler, aber die Werte die
ich in 'r17' erhalte, sind nicht die aus dem Array sonder
"irgendeinwasauchimmer"...
Es ist nicht das erste Mal, dass ich Assembler schreibe, wohl aber für
AVR... Wenn also jemand so freundlich wäre, mir das Brett vorm Kopf
abzumontieren? Ich würde gern verstehen, was ich da Dümmliches tue...
Vielen lieben Dank,
Stefan