AVR Inline-Assembler und Ports

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Timm Thaler
Beiträge: 1044
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: 4861
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
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 gün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1044
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
 

kupferstecher
Beiträge: 269
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: 1044
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
 

kupferstecher
Beiträge: 269
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