Problem Raspberry 3 und Multithread

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

Problem Raspberry 3 und Multithread

Beitragvon ppahl » 17. Aug 2017, 19:36 Problem Raspberry 3 und Multithread

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!
ppahl
 
Beiträge: 28
Registriert: 25. Nov 2016, 00:02

Beitragvon Mathias » 17. Aug 2017, 19:52 Re: Problem Raspberry 3 und Multithread

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

Beitragvon ppahl » 17. Aug 2017, 20:35 Re: Problem Raspberry 3 und Multithread

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
ppahl
 
Beiträge: 28
Registriert: 25. Nov 2016, 00:02

Beitragvon Timm Thaler » 18. Aug 2017, 01:36 Re: Problem Raspberry 3 und Multithread

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.
Timm Thaler
 
Beiträge: 430
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 mschnell » 18. Aug 2017, 12:10 Re: Problem Raspberry 3 und Multithread

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
mschnell
 
Beiträge: 3155
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon ppahl » 18. Aug 2017, 12:49 Re: Problem Raspberry 3 und Multithread

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.
ppahl
 
Beiträge: 28
Registriert: 25. Nov 2016, 00:02

Beitragvon mschnell » 18. Aug 2017, 14:17 Re: Problem Raspberry 3 und Multithread

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
mschnell
 
Beiträge: 3155
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon Mathias » 18. Aug 2017, 16:15 Re: Problem Raspberry 3 und Multithread

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

Beitragvon af0815 » 18. Aug 2017, 16:58 Re: Problem Raspberry 3 und Multithread

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).
af0815
 
Beiträge: 3257
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron
porpoises-institution
accuracy-worried