AVR Inline-Assembler und Ports

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.

Re: AVR Inline-Assembler und Ports

Beitragvon Timm Thaler » 2. Mär 2018, 16:04 Re: AVR Inline-Assembler und Ports

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.
Timm Thaler
 
Beiträge: 572
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.64 FPC3.0.4, Raspbian Stretch Laz1.62 FPC3.0.2 | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon Mathias » 2. Mär 2018, 18:04 Re: AVR Inline-Assembler und Ports

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
Mathias
 
Beiträge: 3701
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Timm Thaler » 2. Mär 2018, 22:00 Re: AVR Inline-Assembler und Ports

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
 
Timm Thaler
 
Beiträge: 572
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.64 FPC3.0.4, Raspbian Stretch Laz1.62 FPC3.0.2 | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon kupferstecher » 2. Mär 2018, 22:29 Re: AVR Inline-Assembler und Ports

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.
kupferstecher
 
Beiträge: 116
Registriert: 17. Nov 2016, 11:52

Beitragvon Timm Thaler » 3. Mär 2018, 01:08 Re: AVR Inline-Assembler und Ports

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
 
Timm Thaler
 
Beiträge: 572
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.64 FPC3.0.4, Raspbian Stretch Laz1.62 FPC3.0.2 | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon kupferstecher » 4. Mär 2018, 11:36 Re: AVR Inline-Assembler und Ports

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
kupferstecher
 
Beiträge: 116
Registriert: 17. Nov 2016, 11:52

• Themenende •
Vorherige

Zurück zu Sonstiges



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried