Problem Raspberry 3 und Multithread

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
ppahl
Beiträge: 56
Registriert: Fr 25. Nov 2016, 00:02

Problem Raspberry 3 und Multithread

Beitrag von ppahl »

Kurze Einleitung für den gleich folgenden Code: Ich möchte an einer Achse meiner CNC-Fräse einen RPi als Taktgenerator für die Endstufe der Achse verwenden um nicht jedes Mal den Steuerrechner hochfahren zu müssen wenn ich nur eine Achse verfahren will. Wäre eigentlich 'ne Sache für einen AVR, aber das Ganze soll damnn noch etwas ausgebaut werden.
Dummerweise bringe ich Multithreading auf dem RPi nicht zum Laufen, bzw. ich bekomme es gar nicht erst kompiliert.

Die LPR:

Code: Alles auswählen

program stepper_v1;
 
{$mode delphi}
{$define UseCThreads}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces,  Forms, stepper;
 
{$R *.res}
 
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.   


Die PAS:

Code: Alles auswählen

unit stepper;
 
{$mode delphi}
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, PXL.Boards.Types, PXL.Boards.RPi;
 
Type
  TMyThread = class(TThread)
  private
    procedure UpdateForm;
  public
    Constructor Create(CreateSuspended : boolean);
  protected
    procedure Execute; override;
  end;
 
{ TForm1 }
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
   procedure Edit1Change(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
const
  step = 38;
  dir = 40;
 
var
  Form1: TForm1;
  SystemCore: TFastSystemCore = nil;
  GPIO: TFastGPIO = nil;
  speed : integer;
  dummy : string;
  MyThread : TMyThread;
 
implementation
 
{$R *.lfm}
 
constructor TMyThread.Create(CreateSuspended : boolean);
begin
  FreeOnTerminate := True;
  inherited Create(CreateSuspended);
end;
 
procedure TMyThread.UpdateForm;
begin
 dummy := Form1.edit1.caption;
 speed := round(strtofloat(dummy));
 Form1.label1.Caption := dummy;
end;
 
procedure TMyThread.Execute;
begin
 repeat
   GPIO.PinValue[step] := TPinValue.high;
   systemCore.delay(175);
   GPIO.PinValue[step] := TPinValue.low;
   systemCore.delay(175);
   Synchronize(@UpdateForm);
 until speed = 0;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
begin
  SystemCore := TFastSystemCore.Create;
  try
    GPIO := TFastGPIO.Create(SystemCore);
    try
      GPIO.PinMode[step] := TPinMode.Output;
      GPIO.PinMode[dir] := TPinMode.Output;
    finally
    end;
  finally
  end;
  GPIO.PinValue[dir] := TPinValue.High;
 
 MyThread:= TMyThread.create(true);
 MyThread.start;
end;
 
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
 dummy := edit1.caption;
 speed := round(strtofloat(dummy));
 label1.Caption := dummy;
end;
 
end.


Den Inhalt des Programms lassen wir mal aussen vor, war nur ein Test ob sich mit dem RPi die entsprechenden Takte mit hinreichender Geschwindigkeit generieren lassen.
Mein Problem: Das Kompilieren bricht immer mit Exit Code 256 ab und dem Hinweis "Fatal: Syntax error, 'identifier expected but 'BEGIN' found"
Dabei wird die Zeile "Synchronize(@UpdateForm);" hevorgehoben und der Cursor blinkt unter dem Klammeraffen.
Ersetze ich das {$mode delphi} durch {$mode objfpc}{$H+} (in der PAS, eine Änderung in der LPR hat keine Auswirkung) so verschiebt sich die Fehlerstelle jeweils auf das 'begin' der FormCreate-Prozedur, die Fehlermeldung bleibt aber die gleiche.

Kann mir mal jemand in den Sattel helfen was ich da falsch mache?

Ach ja: Lazarus 1.7 und FPC 3.0.0

Danke!

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

Re: Problem Raspberry 3 und Multithread

Beitrag von Mathias »

Hier hast du ein Var, aber keine Variable:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var  // ?????
begin
  SystemCore := TFastSystemCore.Create;


PS:
Wäre eigentlich 'ne Sache für einen AVR, aber das Ganze soll damnn noch etwas ausgebaut werden.

Dafür würde ich ein Arduino nehmen, ein AVR ist da schon komplizierter zum programmieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

ppahl
Beiträge: 56
Registriert: Fr 25. Nov 2016, 00:02

Re: Problem Raspberry 3 und Multithread

Beitrag von ppahl »

Wie heisst der Fachbegriff? "Betriebsblind"... :shock:
Unglaublich, ewig auf den Code gestarrt und allen Blödsinn ausprobiert - aber DAS habe ich tatsächlich übersehen.
Danke! :D

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: Problem Raspberry 3 und Multithread

Beitrag von Timm Thaler »

Mathias hat geschrieben:Dafür würde ich ein Arduino nehmen, ein AVR ist da schon komplizierter zum programmieren.


Ein Arduino ist ein AVR. Allerdings ist nicht jeder AVR ein Arduino.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Problem Raspberry 3 und Multithread

Beitrag von mschnell »

ppahl hat geschrieben:war nur ein Test ob sich mit dem RPi die entsprechenden Takte mit hinreichender Geschwindigkeit generieren lassen

Mit einem (normalen) Linux-System lassen sich keine Zeiten mit irgendeiner vorgegebenen Genauigkeit messen, das Der Kernel jedes Userprogramm jeder Zeit beliebig lange stilllegen darf.

-Michael

ppahl
Beiträge: 56
Registriert: Fr 25. Nov 2016, 00:02

Re: Problem Raspberry 3 und Multithread

Beitrag von ppahl »

Gut dass mein RPi nix davon weiss :mrgreen:

Ein kurzer Test zeigt: Für meine Zwecke OK.
Nur nochmal zum Zweck: Manchmal will man z.B. nur kurz eine Nut in ein Bauteil fräsen oder eine Fläche planen. Dafür den Rechner erst hochfahren lohnt nicht, manuelle Kurbelei nervt aber (meine Opti BF20-L hat in X reichlich Verfahrweg).
Dafür der RPi. Er bekommt einen Joystick verpasst mit dem ich dann die X-Achse hin- und herfahren kann, Vorschubsteuerung dabei über den Analogwert des Joysticks. Ob der Vorschub dann exakt eingehalten wird und/oder einzelne Schritte verloren gehen ist mir Banane, das ist nur ein Ersatz für die manuelle Kurbelei.
Wenn das hinreichend genau funzt ist noch eine Erweiterung geplant. Mit dem Joystick können X_min und X_min Koordinaten angefahren und via Touchscreen gespeichert werden. Dann kann man per Touch zwischen diesen Koordinaten pendeln, mit verschiedenen (oder natürlich auch gleichen) Vorschüben in die jeweilige Richtung. Z.B. Gegenlauffräsen mit F200, Rückfahrt mit Eilgeschwindigkeit, dann wieder Gegenlauffräsen mit F200 usw. usw.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Problem Raspberry 3 und Multithread

Beitrag von mschnell »

ppahl hat geschrieben:Ein kurzer Test zeigt:

Klar: in den allermeisten Fällen wird ein Programm ja auch nicht längere Zeit aufgehalten. Manchmal aber eben beliebig lange.

Es geht auch nicht um Exaktheit. Weniger "exakt" wäre eine nicht sehr kleine, aber begrenzte Toleranz. Hier ist die maximale Toleranz aber völlig unbestimmt.

Für ein ernsthaftes Messgerät schlechte Voraussetzungen, wenn aber bei einer Anwendung klar ist, dass es nicht darauf ankommt, dass das Ergebnis immer stimmt, ist das natürlich akzeptabel.

-Michael

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

Re: Problem Raspberry 3 und Multithread

Beitrag von Mathias »

Timm Thaler hat geschrieben:
Mathias hat geschrieben:Dafür würde ich ein Arduino nehmen, ein AVR ist da schon komplizierter zum programmieren.


Ein Arduino ist ein AVR. Allerdings ist nicht jeder AVR ein Arduino.

Ein Arduino ist bis auf Ausnahmen ein AVR mit Beigemüse, welches die Handhabung der AVRs vereinfacht. Dies sind Print, USB-UART-Wandler, etc.
Auch aus Softwaresicht hat man dem Arduino Software spendiert, welche die Programmierung recht einfach macht.
Die Ausnahme ist der Aduino due, welcher eine ARM-CPU besitzt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
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: Problem Raspberry 3 und Multithread

Beitrag von af0815 »

Keine Ahnung ob man das für Realtime mit Pascal auch verwenden kann.

http://www.frank-durr.de/?p=203

http://www.logicals.com/de/forum/raspbe ... berry-pi-s

WÜrde aber darauf hindeuten, das man am RasPi auch langsam sich mit deterministischeren Programmieren beschäftigen könnte. Wie gesagt keine Ahnung wie man das mit Lazarus/Pascal dann verbunden wird.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten