Alias für Variablennamen - geht das?

Für Fragen von Einsteigern und Programmieranfängern...

Alias für Variablennamen - geht das?

Beitragvon Timm Thaler » 23. Sep 2017, 21:07 Alias für Variablennamen - geht das?

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

Beitragvon Socke » 23. Sep 2017, 22:20 Re: Alias für Variablennamen - geht das?

Code: Alles auswählen
var myVarName: byte absolute existingVarName;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
 
Beiträge: 2387
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Mathias » 23. Sep 2017, 22:23 Re: Alias für Variablennamen - geht das?

Code: Alles auswählen
var
 PORT_LED: byte absolute PORTD;


Im Prinzip fast das selbe wie in der Unit oben.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Timm Thaler » 23. Sep 2017, 23:13 Re: Alias für Variablennamen - geht das?

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?
Timm Thaler
 
Beiträge: 431
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.6 FPC3.0.0, Raspbian Jessie Laz1.6 FPC3.0.0 | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon Mathias » 23. Sep 2017, 23:18 Re: Alias für Variablennamen - geht das?

Du hast es richtig verstanden.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Timm Thaler » 23. Sep 2017, 23:30 Re: Alias für Variablennamen - geht das?

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

Beitragvon Mathias » 23. Sep 2017, 23:37 Re: Alias für Variablennamen - geht das?

Ich muss dies morgen mal genauer auf dem PC angucken.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon kupferstecher » 24. Sep 2017, 10:32 Re: Alias für Variablennamen - geht das?

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

Beitragvon Mathias » 24. Sep 2017, 15:27 Re: Alias für Variablennamen - geht das?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 24. Sep 2017, 15:52 Re: Alias für Variablennamen - geht das?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 25. Sep 2017, 16:54 Re: Alias für Variablennamen - geht das?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Socke » 25. Sep 2017, 18:46 Re: Alias für Variablennamen - geht das?

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
Socke
 
Beiträge: 2387
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Mathias » 26. Sep 2017, 16:26 Re: Alias für Variablennamen - geht das?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Socke » 26. Sep 2017, 18:37 Re: Alias für Variablennamen - geht das?

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
Socke
 
Beiträge: 2387
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Mathias » 3. Okt 2017, 17:41 Re: Alias für Variablennamen - geht das?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3194
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried