Atmega Indexregister mit Inline Assembler (Arduino) setzen

OP #4815553
Lesenswert?

Guten Abend Programmiergemeinde,

ich möchte auf einem Arduino nano ein zeitkritisches Programmteil
mittels inline Assembler realisieren. Bei dem Versuch das X Register zu
laden, bekomme ich eine mir nicht verständliche Fehlermeldung.

Was mache ich falsch?

Quellcode:

void setup() {
  // put your setup code here, to run once:

}

int wert;
int *p_wert = &wert;

void loop() {
  // put your main code here, to run repeatedly:

  asm volatile(
    "ldi r26, LOW(p_wert)\n\t"
    "ldi r27, HIGH(p_wert)\n\t");

    // ... hier dann weiterer code
}

Und hier die Fehlermeldungen:

Arduino: 1.6.9 (Windows 7), Board: "Arduino Nano, ATmega328"

C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs
-logger=machine -hardware "C:\Program Files (x86)\Arduino\hardware"
-hardware "C:\Users\Andi\AppData\Local\Arduino15\packages" -hardware
"C:\Users\Andi\Documents\Arduino\hardware" -tools "C:\Program Files
(x86)\Arduino\tools-builder" -tools "C:\Program Files
(x86)\Arduino\hardware\tools\avr" -tools
"C:\Users\Andi\AppData\Local\Arduino15\packages" -built-in-libraries
"C:\Program Files (x86)\Arduino\libraries" -libraries
"C:\Users\Andi\Documents\Arduino\libraries"
-fqbn=arduino:avr:nano:cpu=atmega328 -ide-version=10609 -build-path
"C:\Users\Andi\AppData\Local\Temp\build7277334a56787ac19e2e500382681313.
tmp"  -warnings=none -prefs=build.warn_data_percentage=75 -verbose
"C:\Users\Andi\Documents\Arduino\InlineAssembler\InlineAssembler.ino"
C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine
-hardware "C:\Program Files (x86)\Arduino\hardware" -hardware
"C:\Users\Andi\AppData\Local\Arduino15\packages" -hardware
"C:\Users\Andi\Documents\Arduino\hardware" -tools "C:\Program Files
(x86)\Arduino\tools-builder" -tools "C:\Program Files
(x86)\Arduino\hardware\tools\avr" -tools
"C:\Users\Andi\AppData\Local\Arduino15\packages" -built-in-libraries
"C:\Program Files (x86)\Arduino\libraries" -libraries
"C:\Users\Andi\Documents\Arduino\libraries"
-fqbn=arduino:avr:nano:cpu=atmega328 -ide-version=10609 -build-path
"C:\Users\Andi\AppData\Local\Temp\build7277334a56787ac19e2e500382681313.
tmp"  -warnings=none -prefs=build.warn_data_percentage=75 -verbose
"C:\Users\Andi\Documents\Arduino\InlineAssembler\InlineAssembler.ino"
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g
-Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections
-fno-threadsafe-statics  -w -x c++ -E -CC -mmcu=atmega328p
-DF_CPU=16000000L -DARDUINO=10609 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR
"-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino"
"-IC:\Program Files
(x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs"
"C:\Users\Andi\AppData\Local\Temp\build7277334a56787ac19e2e500382681313.
tmp\sketch\InlineAssembler.ino.cpp"  -o "nul"
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g
-Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections
-fno-threadsafe-statics  -w -x c++ -E -CC -mmcu=atmega328p
-DF_CPU=16000000L -DARDUINO=10609 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR
"-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino"
"-IC:\Program Files
(x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs"
"C:\Users\Andi\AppData\Local\Temp\build7277334a56787ac19e2e500382681313.
tmp\sketch\InlineAssembler.ino.cpp"  -o "nul"
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g
-Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections
-fno-threadsafe-statics  -w -x c++ -E -CC -mmcu=atmega328p
-DF_CPU=16000000L -DARDUINO=10609 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR
"-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino"
"-IC:\Program Files
(x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs"
"C:\Users\Andi\AppData\Local\Temp\build7277334a56787ac19e2e500382681313.
tmp\sketch\InlineAssembler.ino.cpp"  -o
"C:\Users\Andi\AppData\Local\Temp\build7277334a56787ac19e2e500382681313.
tmp\preproc\ctags_target_for_gcc_minus_e.cpp"
"C:\Program Files (x86)\Arduino\tools-builder\ctags\5.8-arduino10/ctags"
-u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns
--line-directives
"C:\Users\Andi\AppData\Local\Temp\build7277334a56787ac19e2e500382681313.
tmp\preproc\ctags_target_for_gcc_minus_e.cpp"
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g
-Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections
-fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L
-DARDUINO=10609 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR   "-IC:\Program
Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program
Files (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs"
"C:\Users\Andi\AppData\Local\Temp\build7277334a56787ac19e2e500382681313.
tmp\sketch\InlineAssembler.ino.cpp"  -o
"C:\Users\Andi\AppData\Local\Temp\build7277334a56787ac19e2e500382681313.
tmp\sketch\InlineAssembler.ino.cpp.o"
C:\Users\Andi\AppData\Local\Temp\ccurZb2d.s: Assembler messages:

C:\Users\Andi\AppData\Local\Temp\ccurZb2d.s:40: Error: garbage at end of
line

C:\Users\Andi\AppData\Local\Temp\ccurZb2d.s:41: Error: garbage at end of
line

exit status 1
Fehler beim Kompilieren für das Board Arduino Nano.
Persönliche Seite #4815573
Lesenswert?

Du musst GNU-Assembler verwenden; LOW und HIGH gehören nicht dazu.

Ich würd's so hinschreiben:
1
void loop()
2
{
3
    unsigned reg_x;
4
    asm ("ldi %A0, lo8(%1)"   "\n\t"
5
         "ldi %B0, hi8(%1)"
6
         : "=x" (reg_x) : "i" (&p_wert));
7
}

aber keine Ahnung, was du damit erreichen willst.  Damit bekommst du die 
Adresse von p_wert ins X-Register, oder willst du den Inhalt von 
p_wert im X-Register haben?
Persönliche Seite #4815626
Lesenswert?

Andreas R. schrieb:
> int* reg_x verstehe ich nicht. Mit X-Register meinte ich r27:r26 vom
> Atmega328.

Es ist das, was mein Beispiel macht.  Die Registerbelegung ist mir 
bekannt.

Wenn du sehen willst, was der Compiler daraus macht, gib ein -save-temps 
zu dessen Optionen und schau in die erzeugte s-Datei.  Weil "X mit &wert 
laden" keine Nebeneffekte auf Hochsprachenebene hat, wird der Compiler 
das wegoptimieren.  Zu Debug-Zwecken kann ein volatile zum asm gegeben 
werden, aber die Aktion "X = &wert" selbst ist eben nicht volatile, und 
daher hat mein Beispiel eben kein volatile drinne.

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