Alias für Variablennamen - geht das?

Für Fragen von Einsteigern und Programmieranfängern...
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

Alias für Variablennamen - geht das?

Beitrag von Timm Thaler »

Kann man einer Variable einen zweiten Namen zuweisen, so wie der Alias bei einer Prozedur?

Ich programmiere gerade AVR Controller mit FPC. Dort sind in einer Unit "ATmega328P" die Register des Controllers definiert. Zum Beispiel für die IO-Ports:

Code: Alles auswählen

  // PORTB
  PORTB : byte absolute $00+$25; // Port B Data Register
  DDRB : byte absolute $00+$24; // Port B Data Direction Register
  PINB : byte absolute $00+$23; // Port B Input Pins
  // PORTC
  PORTC : byte absolute $00+$28; // Port C Data Register
  DDRC : byte absolute $00+$27; // Port C Data Direction Register
  PINC : byte absolute $00+$26; // Port C Input Pins
  // PORTD
  PORTD : byte absolute $00+$2B; // Port D Data Register
  DDRD : byte absolute $00+$2A; // Port D Data Direction Register
  PIND : byte absolute $00+$29; // Port D Input Pins


Wenn ich die Ports jetzt anspreche, kann ich das über diese Namen machen:

Code: Alles auswählen

            PORTD := PORTD or Ppwm1;  // LED ein
            PORTD := PORTD and (not Ppwm1)// LED aus


In Assembler kann ich auch weitere Definitionen für den Port angeben:

Code: Alles auswählen

#define   DDR_LED      DDRD   // LED Test
#define   PORT_LED   PORTD


Damit wäre dann sowas möglich:

Code: Alles auswählen

            PORT_LED := PORT_LED or Ppwm1;  // LED ein
            PORT_LED := PORT_LED and (not Ppwm1)// LED aus


Ich bräuchte aber eine Zuweisung, mit der ich die Variable PORTD auf die Variable PORT_LED "umbiegen" kann. In der Unit "ATmega328P" will ich dabei nicht rumpfuschen. Die Zuweisung nochmal selbst zu machen möchte ich wegen der Portierbarkeit nicht.

Das Mappen wäre halt schön, weil dann Routinen wie Software-I2C oder Software-Uart einfach auf andere Ports portiert werden könnten ohne an jeder Stelle die Portnamen zu ändern. Im Assembler hat sich das bewährt.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Alias für Variablennamen - geht das?

Beitrag von Socke »

Code: Alles auswählen

var myVarName: byte absolute existingVarName;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: Alias für Variablennamen - geht das?

Beitrag von Mathias »

Code: Alles auswählen

var
 PORT_LED: byte absolute PORTD;


Im Prinzip fast das selbe wie in der Unit oben.
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: Alias für Variablennamen - geht das?

Beitrag von Timm Thaler »

Sieht gut aus. Nur um zu verstehen, dass ich es verstanden habe:

Code: Alles auswählen

PORTD : byte absolute $00+$2B; // Port D Data Register


Legt eine Variable PORTD vom Typ byte an Adresse 0x2B an.

Code: Alles auswählen

PORT_LED: byte absolute PORTD;


Legt eine Variable PORT_LED vom Type byte... ja, auch an der Adresse 0x2B an? Also an der Adresse, an der PORTD liegt?

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

Re: Alias für Variablennamen - geht das?

Beitrag von Mathias »

Du hast es richtig verstanden.
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: Alias für Variablennamen - geht das?

Beitrag von Timm Thaler »

Hm funktioniert aber nicht.

Code: Alles auswählen

var
  DDRtwi : byte absolute DDRC;  // TWI Pins
   PRTtwi : byte absolute PORTC;
  PINtwi : byte absolute PINC;


gibt mir

Code: Alles auswählen

Error: absolute can only be associated with a var or const


Code: Alles auswählen

var
  DDRtwiin : byte absolute $00+$28// TWI Pins intern
   PRTtwiin : byte absolute $00+$27;
  PINtwiin : byte absolute $00+$26;
 


funktioniert aber.

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

Re: Alias für Variablennamen - geht das?

Beitrag von Mathias »

Ich muss dies morgen mal genauer auf dem PC angucken.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Alias für Variablennamen - geht das?

Beitrag von kupferstecher »

Scheint tatsächlich nicht zu funktionieren. Vermutlich ein Bug?

Folgendes geht:

Code: Alles auswählen

 
Var1: byte;
Var2: byte absolute Var1;
 


folgendes nicht:

Code: Alles auswählen

 
Var1: byte absolute $28;
Var2: byte absolute Var1;
 

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

Re: Alias für Variablennamen - geht das?

Beitrag von Mathias »

Ich habe es mal mit dem ppcross8086 probiert, das dieser auch direkten Speicherzugriff erlaubt.
Aber es kommt der gleiche Fehler wie beim AVR-Compiler.

Code: Alles auswählen

program test;
var
  m: byte absolute $0B800:$0000;
  m2:byte absolute m;
begin
end.


Code: Alles auswählen

C:\FPC\302E6D~1.2\bin\I386-W~1>ppcross8086.exe test.pas
Free Pascal Compiler version 3.0.2 [2017/02/13] for i8086
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: MS-DOS 16-bit real mode
Compiling test.pas
test.pas(4,21) Error: absolute can only be associated with a var or const
test.pas(6,4) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted


An der Verschachtelung kann es nicht liegen.
Dies wird ohne Fehler kompiliert, egal ob MS-DOS oder AVR.

Code: Alles auswählen

var
  a: byte;
  b: byte absolute a;
  c: byte absolute b;
  d: byte absolute c;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Alias für Variablennamen - geht das?

Beitrag von Mathias »

Ich habe noch folgenden Code mit Turbo-Pascal probiert, dort scheint es problemlos zu funktionieren, die obere Bildschirm-Hälfte füllt es mit grünen Herzen aus.

Code: Alles auswählen

program test;
var
  i : integer;
  m: Word absolute $B800:$0000;
  m2:Word absolute m;
  a:array[0..1999] of Word absolute m2;
begin
  Writeln('Hello World');
 
  for  i:= 0 to 999 do a[i]:=$0303;
  readln;
end.

Somit scheint die ein FPC-Bug zu sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Alias für Variablennamen - geht das?

Beitrag von Mathias »

Noch ein Nachtrag, ich habe noch folgendes probiert, auch mit diesem Schalter frisst der ppcross8086 das Programm nicht.
Ich denke, man müsste dies im Bug-Report melden.

Code: Alles auswählen

program test;
{$mode tp}           


Noch eine Frage, gibt es mit dem normalen FPC/Lazarus im 32 und 64Bit Modus auch direkte Speicherzugriffe ?
Ich denke zwar kaum, das es dies gibt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Alias für Variablennamen - geht das?

Beitrag von Socke »

Mathias hat geschrieben:Noch eine Frage, gibt es mit dem normalen FPC/Lazarus im 32 und 64Bit Modus auch direkte Speicherzugriffe ?
Ich denke zwar kaum, das es dies gibt.

Natürlich gibt es die; in normalen Programmen, die auf einem Betriebssystem laufen, ist der direkte Speicherzugriff aber i.d.R. nicht erlaubt.
Daher gibt es hier nur sehr eingeschränkte Anwendungsfälle für den direkten Speicherzugriff (z.B. Debugging anderer Programme).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: Alias für Variablennamen - geht das?

Beitrag von Mathias »

Natürlich gibt es die; in normalen Programmen, die auf einem Betriebssystem laufen, ist der direkte Speicherzugriff aber i.d.R. nicht erlaubt.

Ich habe es gerade probiert, er kompiliert folgende Zeilen.
Nur wen ich die Klammern bei b2 entferne, kommt der gleiche Kompilierfehler wie oben beschrieben.

Code: Alles auswählen

var
  b1: byte absolute $50;
//  b2: byte absolute b1;
begin
  b1 := 3;   


Ich habe das Problem gerade beim Bug-Tracker gemeldet. https://bugs.freepascal.org/view.php?id=32474
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Alias für Variablennamen - geht das?

Beitrag von Socke »

Timm Thaler hat geschrieben:In Assembler kann ich auch weitere Definitionen für den Port angeben:

Code: Alles auswählen

#define   DDR_LED      DDRD   // LED Test
#define   PORT_LED   PORTD

Das sind Präprozessormakros, die man auch unter Free Pascal verwenden kann:

Code: Alles auswählen

{$macro on}
{$DEFINE DDR_LED:=DDRD}
{$DEFINE PORT_LED:=PORTD}

Damit hat man wie unter C eine einfache Textersetzung und wie gewünscht keine Unterstützung durch dei IDE bei Code-Navigation etc.

Falls möglich sollte man also warten, bis der Compiler das Konstrukt mit absolute untersützt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: Alias für Variablennamen - geht das?

Beitrag von Mathias »

Falls möglich sollte man also warten, bis der Compiler das Konstrukt mit absolute untersützt.

Dieser Code wird nun mit der neusten Trunckanstandslos kompiliert.
Egal ob Linux oder AVR.
Beim Ausführen gibt es logischweise unter Linux ein SIGSEV.

Code: Alles auswählen

program Project1;
var
  m:byte absolute $00+$25;
  m1:byte absolute m;
  m2:byte absolute m1;
  b:byte;
begin
  b:=m2;
end.


Wider mal ein Lob an das FPC-Team. :shock: :)
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten