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!