$IfDEF für Rpi

Antworten
Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

$IfDEF für Rpi

Beitrag von Maik81SE »

Moin, wie alle nutzen ja zum Plattform-übergreifenden Programmieren Direktiven wie

Code: Alles auswählen

{$IFDEF UNIX}

Code: Alles auswählen

{$IFDEF WIN32}
oder

Code: Alles auswählen

{$IFDEF WIN64}
Nun meine Frage?
Unter welchem würdet ihr RPI definieren?
Pauschal würde ich sagen Unix, da es ja ein Debain system ist, aber auf meine Laptop, welcher mit RPi Desktop läuft ist ebenso dieser Zweig deaktiviert.

ungern würde ich zusätzlich die Option {$IFDEF CPUARM} verwenden, um einen Bestimmten Programmpart auf meinen PI4 und Laptop laufen zu lassen, gerade weil ich weiß, das ich diese Passage für Windows 10 anders schreiben muß.

EDIT
Eine Unterscheidung der CPU's wird wohl kein sin machen, da Windows ja auch auf AMD läuft und ich ungern eine Doppelte Auswahl verwenden wollte.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

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: $IfDEF für Rpi

Beitrag von Socke »

Du brauchst im Wesentlichen zwei Parameter:
  • Betriebssystem
  • CPU-Archtitektur
Welche für deine Unterscheidungsfälle am besten passen, kannst du in der FPC-Dokumentation unter Compiler defines during compilation nachschlagen.

In diesem Sinne ist der RasPi auch nur ein Linux auf einem ARM-Prozessor. Windows kannst du hier auch nach 32 Bit und 64 Bit unterscheiden.

Tipp: Sind deine RasPi-Programmteile so spezfisch, dass sie ausschließlich auf einem RasPi laufen? Oder würden sie prinzipiell auch auf einem anderen Linux-System mit entsprechender Hardware laufen?
Dann reicht dir vielleicht die Unterscheidung zwischen Linux und Windows.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

[Gelöst]Re: $IfDEF für Rpi

Beitrag von Maik81SE »

Socke hat geschrieben:
Do 3. Dez 2020, 17:24
In diesem Sinne ist der RasPi auch nur ein Linux auf einem ARM-Prozessor. Windows kannst du hier auch nach 32 Bit und 64 Bit unterscheiden.

Tipp: Sind deine RasPi-Programmteile so spezfisch, dass sie ausschließlich auf einem RasPi laufen? Oder würden sie prinzipiell auch auf einem anderen Linux-System mit entsprechender Hardware laufen?
Dann reicht dir vielleicht die Unterscheidung zwischen Linux und Windows.
Den letzten Part muß ich mit aktuell mit JA beantworten, da ich in einem anderem Programm direkt auf die GPIO zugreifen muß und soweit ich das gerade auf dem Zettel habe, hat ein Laptop keine GPIO in klassischen Sinne.
Entsprechende Hardware? Diese müsste dann auch extra erst Entwickelt werden. und das wäre dann der Punkt, wo ich über alternativen zum PI nachdenken sollten.
Reicht schon, das ich die GPIO neben RS232 auch auf einem µC schicken muß.
Bei einem Tower-PC könnte das allerdings mal eine ganz andere Geschichte werden. :D :D

Aber im Kern was genau das mein Harken
Socke hat geschrieben:
Do 3. Dez 2020, 17:24
Du brauchst im Wesentlichen zwei Parameter:
  • Betriebssystem
  • CPU-Archtitektur
ich hatte in dem Programm, was ich gerade überarbeite, die Voreinstellungen auch einen x86_64...
Spiele aber gerade ausschließlich auf i386 & ARM

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: [Gelöst]Re: $IfDEF für Rpi

Beitrag von Warf »

Maik81SE hat geschrieben:
Do 3. Dez 2020, 18:01
Den letzten Part muß ich mit aktuell mit JA beantworten, da ich in einem anderem Programm direkt auf die GPIO zugreifen muß und soweit ich das gerade auf dem Zettel habe, hat ein Laptop keine GPIO in klassischen Sinne.
Entsprechende Hardware? Diese müsste dann auch extra erst Entwickelt werden. und das wäre dann der Punkt, wo ich über alternativen zum PI nachdenken sollten.
GPIO in Raspbian sind nix anderes als pseudo files, du kannst also schauen ob dein system die unterstützt bei überprüfung ob die dateien existieren. Außerdem braucht es ja nicht unbedingt physische GPIOs um diese pseudofiles zu erstellen, du kannst ja auch einfach einen simulator installiert haben der diese pseudofiles bereitstellt und sie sich so verhalten lässt wie eine entsprechende schaltung auf dem raspi würde

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: $IfDEF für Rpi

Beitrag von af0815 »

Ich programmiere normalerweise unter Windows (win32) Programme für RasPi, Debian und Ubuntu. Das mit dem Crosscompile geht recht gut, wenn man sich ein paar Sachen angewöhnt (oder abgewöhnt). Grundlegend alles was spezifisch für ein System in eine eine Unit auslagern und für Windows eine entsprechende Emulation schreiben. Das hilft auch dort, wo sich die normalen Rechner mit Linux vom RasPi unterscheiden. RasPi Programme bekommen ein zusätzliches Define RasPi in die Projektoptionen. Hinter dem Define sind die Unterschiede Linux/RasPi versteckt. Für alles andere reichen die vorhandenen Defines.
So einfach ist das mit dem RasPi nicht, das man das so einfach mit Simulation einfacher Files auskommt. Es hängt stark davon was man alles vom GPIO verwenden will. Da gehen entweder die normalen Linux Sachen oder man muss zB. rpi_hal und Konsorten nehmen. Dann ist mit einfacher Simulation nichts mehr. Deswegen das eigene Flag für den RasPi. Für mich unterscheide ich dann nochmals zwischen rpi_hal und normalen Linux.

Code: Alles auswählen

{$IFDEF RasPi}
{$IfDef UseGPIOHAL} // GPIO HAL (bedingt root)
{$Else}
// RasPi
// Pin 35 GPIO = BCM16
const
  PIN_16: PChar = '16';
  PIN_ON: PChar = '1';
  PIN_OFF: PChar = '0';
  OUT_DIRECTION: PChar = 'out';
  IN_DIRECTION: PChar = 'in';
{$EndIf}
{$endif}
..
    // GPIO behandeln
    {$IFDEF RasPi}
    {$IfDef UseGPIOHAL}
    // GPIO HAL (bedingt root)
    NewState := GPIO_get_PIN(16);
    {$Else}
    //
    try
      { Open SoC 16 (pin 36 on GPIO port) in read-only mode: }
      fileDesc := fpopen('/sys/class/gpio/gpio16/value', O_RdOnly);
      if fileDesc > 0 then
      begin
        { Read status of this pin (0: button pressed, 1: button released): }
        gReturnCode := fpread(fileDesc, buttonStatus[1], 1);
        NewState := (buttonStatus = PIN_ON);
      end;
    finally
      gReturnCode := fpclose(fileDesc);
    end;
    {$EndIf}
Und unter Windows/Normalen Linux wird die ganze Unit sowieso emuliert. Damit lässt sich das ganze auf Windows recht gut entwickeln.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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: $IfDEF für Rpi

Beitrag von Timm Thaler »

Habs bei mir für den Raspi so gemacht:

{$ifdef CPUARM}

{$endif}

Aber zugegeben, natürlich könnte auf dem ARM auch ein Windows laufen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: $IfDEF für Rpi

Beitrag von af0815 »

wenn so müsste man linux/unix und cpuarm verknüpfen, später wird ja auch noch die 64 Bit Variante dazukommen am RasPi4
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: [Gelöst]Re: $IfDEF für Rpi

Beitrag von Maik81SE »

Warf hat geschrieben:
Do 3. Dez 2020, 18:11
Maik81SE hat geschrieben:
Do 3. Dez 2020, 18:01
Den letzten Part muß ich mit aktuell mit JA beantworten, da ich in einem anderem Programm direkt auf die GPIO zugreifen muß und soweit ich das gerade auf dem Zettel habe, hat ein Laptop keine GPIO in klassischen Sinne.
Entsprechende Hardware? Diese müsste dann auch extra erst Entwickelt werden. und das wäre dann der Punkt, wo ich über alternativen zum PI nachdenken sollten.
GPIO in Raspbian sind nix anderes als pseudo files, du kannst also schauen ob dein system die unterstützt bei überprüfung ob die dateien existieren. Außerdem braucht es ja nicht unbedingt physische GPIOs um diese pseudofiles zu erstellen, du kannst ja auch einfach einen simulator installiert haben der diese pseudofiles bereitstellt und sie sich so verhalten lässt wie eine entsprechende schaltung auf dem raspi würde
Leider fällt der letzte Satz komblett aus dem Kontext, da ich Mind. 3 GPI aktiv auf Werte Abfrage und und von meinem Kollegen nicht verlange, das auf sein PC Linux installiert...
Er will sich mein VeeJee Pult auch mal ausleihen und damit arbeiten.
af0815 hat geschrieben:
Fr 4. Dez 2020, 18:46
wenn so müsste man linux/unix und cpuarm verknüpfen, später wird ja auch noch die 64 Bit Variante dazukommen am RasPi4
Da warte ich mal auf die pi5 Generation.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Antworten