Go Down

Topic: Inline Assembler (Read 2740 times) previous topic - next topic

Addi

Hallo,
ich wollte fragen ob es Inline-Assembler für den Arduino gibt
und wo es ein passendes Tutorial dazu gibt.

Addi
/ \    _|  _| o
 /--\ (_| (_| |

uwefed

http://arduino.cc/forum/index.php/topic,128809.msg969155.html#msg969155
Grüße Uwe

Addi

Und gibt es auch ein passendes Tutorial?

Addi
/ \    _|  _| o
 /--\ (_| (_| |

uwefed

#3
Dec 25, 2012, 08:29 pm Last Edit: Dec 25, 2012, 08:31 pm by uwefed Reason: 1
Ein Tutorial zum programieren von AVR in Assembler?

http://www.avr-asm-tutorial.net/avr_de/index.html
http://www.avr-asm-download.de/beginner_de.pdf

oder einfach nach "atmel assembler tutorial" in einer Suchmaschiene suchen.

Auf alle Fälle ist das ein lern- und arbeitsintensives Vorhaben den Controller in Assembler zu programmieren.

Grüße Uwe

Addi

#4
Dec 28, 2012, 12:33 am Last Edit: Jan 16, 2013, 06:50 pm by Addi Reason: 1
Ich versuche nun folgenden Code auszuführen, erhalte dann aber einen Fehler:
Code: [Select]

void setup() {
  asm("out DDRB,R16");
}
void loop() {}

Und folgenden Fehler:
Code: [Select]

C:\Users\Addi\AppData\Local\Temp/ccxlcYaN.s: Assembler messages:
C:\Users\Addi\AppData\Local\Temp/ccxlcYaN.s:29: Error: constant value required


Addi
/ \    _|  _| o
 /--\ (_| (_| |

Addi

Weiß jemand wo das Problem liegt?

Addi
/ \    _|  _| o
 /--\ (_| (_| |

pylon

Der Assembler-Befehl macht so auch keinen Sinn. Du schreibst ein Register auf einen Port, hast aber keine Ahnung, was im Register drin steht. Zudem ist die Register-Verwendung innerhalb von C-Code nicht so einfach, da der C-Code ja auch von diesen Registern Gebrauch macht und sich bei Überschneidungen unvorhersehbare Zustände ergeben können. Worauf willst Du denn raus? Was ist der Zweck der Assembler-Anweisungen?

Addi

Das ist ein Teil von diesem Code.
Ich wollte nur mit einem Befehl testen ob die IDE den Code compilieren kann.

Addi
/ \    _|  _| o
 /--\ (_| (_| |

Udo Klein

#8
Jan 16, 2013, 07:34 pm Last Edit: Jan 16, 2013, 07:37 pm by Udo Klein Reason: 1
Der Assembler "constant value required".

DDRB ist keine Konstante. Ansonsten würde der C Compiler bei Zuweisungen DDRB = ... meckern.
Check out my experiments http://blog.blinkenlight.net

Addi

Wie kann ich dann DDRB zu einem konstanten Wert ändern?

Addi
/ \    _|  _| o
 /--\ (_| (_| |

voithian

Schau mal hier:

http://www.stanford.edu/class/ee281/projects/aut2002/yingzong-mouse/media/GCCAVRInlAsmCB.pdf

unter Punkt 8.1 "Using Constants".

Die Syntax der asm-Anweisung mit Parametern ist schon etwas gewöhnungsbedürftig.

Wenn du es trotzdem versuchen willst, hilft dir Google bei der Suchge nach Tutorials: http://lmgtfy.com/?q=avr gcc inline asm.


Addi

#11
Jan 16, 2013, 07:50 pm Last Edit: Jan 16, 2013, 09:06 pm by Addi Reason: 1
Kann man das vermeiden, wenn man die Datei m328Pdef.inc includiert? Wenn ich das
versuche erhalte ich den Fehler dass die Datei nicht gefunden wurde. Egal ob sie im tmp-Verzeichniss
oder im Projektverzeichniss liegt.
Code: [Select]

void setup() {
  asm(".INCLUDE \"m238Pdef.inc\"");
  asm("out DDRB,R16");
}
void loop() {}

Addi
/ \    _|  _| o
 /--\ (_| (_| |

michael_x

#12
Jan 16, 2013, 09:46 pm Last Edit: Jan 17, 2013, 10:56 pm by michael_x Reason: 1
Du weisst, dass du keinen Assembler brauchst, um z.B. die atmega328 ports ( DDRB in deinem Beispiel ) direkt in c anzusprechen?
Was der avr-gcc daraus macht, ist nicht wirklich schlechter als eigene asm Kunststückchen.

c             -->      asm
DDRB = 0xFF;  --> ldi   R16,0b11111111
                 out   DDRB,R16
PORTB = 0;        ldi   R16,0
                 out   PORTB,R16




Addi

Ich möchte dies zum lernen von Avr-Assembler machen. Hätte ich einen Programmer würde
ich Atmel Studio verwenden, da ich keinen habe, will ich dies mit der Arduino IDE machen.

Addi
/ \    _|  _| o
 /--\ (_| (_| |

jurs


Ich möchte dies zum lernen von Avr-Assembler machen.


Dafür ist das Einbinden von "Inline-Assembler" in eine fremde Entwicklungssoftware nicht geeignet.

Per "Inline-Assembler" bindet man in sein Programm allenfalls anderweitig entwickelte, debuggte und getestete Software ein.

Besorge Dir am besten Atmel Studio und einen Programmer, wenn Du selbst in Assembler was für den Arduino programmieren möchtest, dann hast Du was zum Entwickeln, Debuggen und Testen und nicht nur zum Einbinden.

Code per Inline-Assembler einbinden um etwas über Assembler-Programmierung zu lernen ist so wie eine Fertigpizza in den Backofen zu schieben um was über Pizzamachen zu lernen.

Go Up