AVR Inline-Assembler und Ports

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: AVR Inline-Assembler und Ports

Beitrag von Timm Thaler »

kupferstecher hat geschrieben:Habs nochmal getestet, folgendes funktioniert:

Code: Alles auswählen

 
  OUT  PORTB+(-32),r16
  SBI  PORTB+(-32),4
 
  SBIS UCSRA+(-32),UDRE    //Warten bis UART data register (UDR) empty
    rjmp ...
 
Ist nicht schön, aber "in der Not" ist es besser als ne "Magik-Number" hinzuschreiben.
Als langjähriger Asm-Programmierer finde ich das ja sehr ansprechend.

Aber: Warum?

Gerade Portoperationen werden vom Compiler doch schon optimal umgesetzt.

Mathias
Beiträge: 6925
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR Inline-Assembler und Ports

Beitrag von Mathias »

Gerade Portoperationen werden vom Compiler doch schon optimal umgesetzt.
Stimmt, der Compiler ist sehr intelligent, er verwendet am richtigen Ort sbi und cbi.

Code: Alles auswählen

# [4] PORTB := 1;
	ldi	r18,1
	out	5,r18
# [5] PORTB := PORTB or 1;
	sbi	5,0
# [6] PORTB := PORTB or 2;
	sbi	5,1
# [7] PORTB := PORTB or 7;
	in	r18,5
	ori	r18,7
	out	5,r18
Ob der AVR C++ Compiler auch so intelligent ist ?

Sogar eine einfache Procedure nur mit einem nop sieht sehr gut aus:

Code: Alles auswählen

PsPROJECT1_ss_MYPROC:
# [Project1.pas]
# [4] begin
#  CPU AVR5
# [5] asm nop end;
	nop
#  CPU AVR5
# [6] end;
	ret
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: AVR Inline-Assembler und Ports

Beitrag von Timm Thaler »

Mathias hat geschrieben:Ob der AVR C++ Compiler auch so intelligent ist ?
Ja, ist er, ebenso wie der Ada-Compiler. Bei C geht auch sowas:

Code: Alles auswählen

	PORTBA |= (1 << PA0);		// Pin high
	PORTA &= ~(1 << PA0);		// Pin low
 

Benutzeravatar
kupferstecher
Beiträge: 434
Registriert: Do 17. Nov 2016, 11:52

Re: AVR Inline-Assembler und Ports

Beitrag von kupferstecher »

Timm Thaler hat geschrieben: Aber: Warum?
Gerade Portoperationen werden vom Compiler doch schon optimal umgesetzt.
Ein einzelner Portzugriff per ASM ist sicher nicht sinnvoll. Aber wenn man einen Assemblerabschnitt benötigt, muss man für die I/O-Zugriffe nicht zwischen Assembler und Pascal springen.
Die SBRC/SBRS-Befehle werden vermutlich auch nicht umgesetzt.

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: AVR Inline-Assembler und Ports

Beitrag von Timm Thaler »

kupferstecher hat geschrieben:Die SBRC/SBRS-Befehle werden vermutlich auch nicht umgesetzt.

Code: Alles auswählen

# [58] if (flags and fumin) = fumin then begin
	lds	r18,(U_sGH_DEFINE_ss_FLAGS)
	sbrs	r18,1
	rjmp	.Lj9
 

Benutzeravatar
kupferstecher
Beiträge: 434
Registriert: Do 17. Nov 2016, 11:52

Re: AVR Inline-Assembler und Ports

Beitrag von kupferstecher »

Hab mich verschrieben, habe SBIS/SBIC gemeint. Aber auch das wird umgesetzt. Beeindruckend!

Code: Alles auswählen

 .Lj7:
# [70] while (UCSRA and (1 shl UDRE)) = 0 do;
	sbis	11,5
	rjmp	.Lj7

Antworten