[Gelöst] Sigsegv Error bei delay Aufruf

Für Fragen von Einsteigern und Programmieranfängern...
Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Heizung.tar.gz
(134.92 KiB) 74-mal heruntergeladen
Habe das Projekt einmal hochgeladen. Wurde auf einem 32 Bit Raspberry 4 erstellt. Habe das mal testweise auf 64 Bit Linux laufen lassen. Wird zumindest geladen. Farben sind anders, Funktionen natürlich nur eingeschränkt, da keine Relais angeschlossen. Auf dem Raspberry funktionieren die Toggle Schalter jedoch korrekt. Ist noch im frühen Rohbau, daher einige Meldungen wegen nicht genutzter Units oder Variablen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
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: Sigsegv Error bei delay Aufruf

Beitrag von af0815 »

Ich würde den Code im OnActivate zu einem Singleton umformen

Code: Alles auswählen

procedure TFrmMain.FormActivate(Sender: TObject);
begin
  // Finish init mainform
  // At first call the form is shown and ready
  if not FInit  then begin
    StartUp;
    FInit:=True;
  end;
end;
FInit ist eine Variable in der Form, die im Construktor Create auf false gesetzt wird. Damit läuft Startup nur einmal, egal welches BS.

Für das Delay würde ich eine Unitglobale Variable nehmen, Damit ist die Unit auch gleich besser entkoppelt und braucht keinen Verweis auf die GUI. Das sollte man sowieso immer vermeiden. Eine unit sollte für sich alleine stehen können und nur parametrisiert werden. Ausserdem würde ich überlegen aus dem GPIO Teil, ein Objekt zu machen und das auch als Singleton anzusprechen. Damit ist das komplett entkoppelt und kann nur einmal aufgerufen werden, was ja Sinn macht. Das ist dann schon Geschmackssache. Auch das Logwrite würde ich über einen Callback machen oder den LazLogger (Siehe wiki dazu) verwenden.

Code: Alles auswählen

interface
procedure GPIODelay(AktDelay:integer);

implementation
var
  FDelay: integer;

procedure GPIODelay(AktDelay:integer);
begin
  FDelay := AktDelay;
end;

....

procedure GPIOSetForOutput (PIN : pChar);
  var
    fileDesc: integer;
    sPIN : string2;

begin
  sPIN := PIN;

  { Set SoC pin 17 as output: }
  try
    fileDesc := fpopen('/sys/class/gpio/gpio'+sPIN+'/direction', O_WrOnly);
    gReturnCode := fpwrite(fileDesc, OUT_DIRECTION[0], 3);
 
    {$ifdef GPIODebug}DebugLn({$I %FILE%} + '->' +{$I %CURRENTROUTINE%} + ' GPIO SetFOROutput'+SPIN,gReturnCode);{$endif}
  finally
    gReturnCode := fpclose(fileDesc);
    {$ifdef GPIODebug}DebugLn({$I %FILE%} + '->' +{$I %CURRENTROUTINE%} + ' Close '+SPIN,gReturnCode);{$endif}
  end;

   delay (FDelay);
end;

....


initializone
  FDelay := 80; // Standardwert
  
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Sigsegv Error bei delay Aufruf

Beitrag von fliegermichl »

Wird denn dein Config Formular automatisch erzeugt?
Projekt -> Projekteinstellungen -> Formulare
Wenn es da bei verfügbare Formulare steht, dann wird es nicht automatisch erzeugt. In dem Fall musst du das selbst machen.

Code: Alles auswählen

if (not (Assigned(Config))) then Config := TConfig.Create(Application);
// Jetzt kann man auf die Eigenschaften von Config zugreifen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
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: Sigsegv Error bei delay Aufruf

Beitrag von af0815 »

Man darf sich nie darauf verlassen, wenn die Formulare mit den Resoucen erstellt werden. Das kann ziemlich ins Auge gehen. Ich lasse generell nur das Mainform erzeugen, alle anderen werden gezielt im Mainform erzeugt. Damit bekomme ich auf den verschiedenen Plattformen ein determiniatisches Verhalten. Auch kann ich damit sehr genau Festellen ob was schiefläuft, wenn zB. eine Resource (Com, Server, SPS,...) nicht verfügbar ist. Frei nach dem Motto, wenn was schiefläuft, dann sollte der User das sehen-damit kann er mir auch ein Foto per WA senden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

test.tar.gz
(127.1 KiB) 81-mal heruntergeladen
Winni hat geschrieben: Fr 17. Jul 2020, 00:19 Vorsicht mit onActivate:
Je nach Betriebssystem wird das verschieden ausgeführt.
Das Programm wird nur auf dem Rasperry laufen. Routine wird nur einmal durchlaufen, aber aus welchen Gründen auch immer viel zu spät.
fliegermichl hat geschrieben: Fr 17. Jul 2020, 09:57 Wird denn dein Config Formular automatisch erzeugt?
Ja, steht unter Projektinspektor bei automatisch erzeugt.
af0815 hat geschrieben: Fr 17. Jul 2020, 06:43 Für das Delay würde ich eine Unitglobale Variable nehmen,
Habe ich geändert, ist in der Tat sauberer. Löst aber auch das grundsätzliche Problem nicht, dass die Resource nicht z.V. steht.
Jetzt erhalte ich bei dem Aufruf vom Main aus schon den SIGSEGV Fehler bei GPIODelay (Config.SpinEdit1.Value).

Habe jetzt mal ein kleines Testprogramm erstellt. Das macht genau das, was mein Programm machen sollte. Gleiche Struktur. Funktioniert in der richtigen Reihenfolge der Event Abarbeitung. Delay löst auch keinen SIGSEGV Fehler aus.

1. Beim Start geht es zuerst in OnActivate
2. Bei Buttom Klick 2 auf Event2 geht es auf 2
3. Bei Buttom 3 auf Event 3. Delaywert vom SpinEdit wird übergeben, delay ausfgeführt ohne Fehler.

Bei meinem Heizungsprogramm funktioniert das alles nicht.
1. Bei Start geht es "ohne das ich klicke" sofort in OnKlickPumpe2, 4, 6 und 8.
2. Ganz am Schluß geht es dann irgendwann doch noch in das OnActivate Event
3. Bei Übergabe des SpinEdit Delays vom Main aus kommt der SIGSEGV Fehler.

Am Comiler kann es auch nicht liegen, da die Fehler auf meinem64 Computer identisch nachproduzierbar auftreten.

Selbst wenn ich das Config Unit und die Config Form neu erstelle, bleibt der Fehler.

Habe mir gerade nochmal mein Strategie Testerprogramm angeschaut, hat viele 1000 Zeilen, unzählige Units und Formen, gleiches Konzept, nie Probleme.

Es muß also irgend etwas bei der Erstellung in diesem Miniprogramm vollkommen durcheinander geraten sein. Bleibt also nichts anders übrig als das Programm noch einmal vollständig neu aufzusetzen, da ich nicht den geringsten Plan habe, was die Ursache ist.

Mit Klimmzügen wie dem NIL, globale Variablen etc. könnnte ich das Problem zwar umschiffen aber nicht lösen.

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

Re: Sigsegv Error bei delay Aufruf

Beitrag von Mathias »

Ich habe dein Programm genauer angeguckt, wie du schreibst, da knallt es das erste mal.

Code: Alles auswählen

procedure THeizung.TPumpe2Click(Sender: TObject);
begin
  ShowMessage('click2');
  GPIOSwitchRelais (PINPumpe2, TPumpe2.Checked);

  IF TPumpe2.Checked
     then TPumpe2.Color := clLime
     else TPumpe2.Color := clRed;
end; 
Es ist schon interessant, das ToglelBox.Click aufgerufen wird.
Ich habe in einem neuen Projekt das OnClick einer ToggleBox, ausgewertet, da wird es erst aufgerufen, wen man auch rein clickt.

Noch etwas interessantes in deinem Projekt.
Du hast ParentFont auf False gestellt.
Wen ich dort reinklicke und auf True stelle, wird die Schrift auf dem Button Fett. Stelle ich aber wieder auf False, bleibt es immer noch Fett.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Sigsegv Error bei delay Aufruf

Beitrag von Mathias »

Es ist schon interessant, das ToglelBox.Click aufgerufen wird.
Ich habe die Ursache gefunden, der Übeltäter ist XMLProbStorage1, wen ich diesen deaktiviere, wird kein Click mehr aufgerufen.
Evtl. die Timer auch ausschalten, und erst in OnActivate einschalten. Das selbe mit XMLProbStorage1.
Da musst du selbst weiter probieren,
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Mathias hat geschrieben: Fr 17. Jul 2020, 17:53
Es ist schon interessant, das ToglelBox.Click aufgerufen wird.
Ich habe die Ursache gefunden, der Übeltäter ist XMLProbStorage1, wen ich diesen deaktiviere, wird kein Click mehr aufgerufen.
Evtl. die Timer auch ausschalten, und erst in OnActivate einschalten. Das selbe mit XMLProbStorage1.
Da musst du selbst weiter probieren,
Ich habe jetzt mal alle Timer in den Eigenschaften deaktiviert, zusätzlich den Timercode auskommentiert und XMLPropStorage1 deaktiviert. Geht immer noch zuerst in die OnClick von Pumpen 2, 4 , 6, 8. Werde das aber mal weiter checken.

Sorry Korrektur! Du hast natürlich Recht. Hatte versehentlich den XMLPropStorage1 con der Config Form deaktiviert. Beim Main PopStorage geht er nicht mehr in die OnClicks. An den Timern liegt es dann wohl nicht, da alle auskommentiert und abgeschaltet. Das hilft schon weiter.

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Super, ein Problem schon mal gelöst. Habe den filename von session.xml geändert auf Session.xml. Jetzt geht er direkt in OnActive. Session.xml wurde ja neu geschrieben.

Die XML Datei sah eigentlich ok aus, hatte mir die gestern schon angesehen. Schien i.O. Dateiname war sowohl in den Eigenschaften als auch im Dateimanager erkennbar auf session.xml. War aber wohl doch nicht i.O.

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Was sagt man dazu. Das zweite Problem mit dem SIGSEGV Fehler hat sich damit auch wie von selbst gelöst. Die delay Werte werden sauber von dem SpinEdit übergeben. Das mit der Unit globalen Variable habe ich auch eingebaut und funktioniert.

Vielen, vielen Dank für Eure Hilfe. Geht doch nichts über das Lazarus Profi Team.

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

Re: Sigsegv Error bei delay Aufruf

Beitrag von Mathias »

Daher mache ich XML Verwaltung lieber manuell über die Unit xmlconf.pas.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Mathias hat geschrieben: Fr 17. Jul 2020, 19:23 Daher mache ich XML Verwaltung lieber manuell über die Unit xmlconf.pas.
Mit dem XMLPropStorage hatte ich schon häufiger Probleme. Daher schaue ich mir die xml Datei auch meistens zuerst an und prüfe ob die SessionProperities korrekt eingetragen wurden. Irgend ein Zusammenhang bei Fehlern war immer erkennbar. Nur hier wäre ich nie auf einen Zusammenhang gekommen. Werde mir die xmlconf.pas mal anschauen.

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Mist, doch nicht ganz gelöst. Sobald ich die Pumpen schalte, geht er beim nächsten Start wieder zuerst in die OnClicks der zuletzt aktivierten Pumpen. Aber so komme ich weiter, da XMLPropStorage wohl der Übeltäter ist. Evtl. nutze ich XMLPropStorage nicht und schreibe eine eigenRoutine.

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

Re: [Gelöst] Sigsegv Error bei delay Aufruf

Beitrag von Mathias »

Was ich dir vorschlage, mache eine Classe, in diesem Constructor lädst du aus der xml die gespeicherten Zustände der Pumpen und schaltest die Pumpen entsprechend und setzt deine Togleboxen.
Beim schalten einer Toglebox setzt du die Pumpe entsprechend und setzt auch den Wert in der Classe, welche dan gleichzeitig auch in die xml speichert.
Die xml und die Pumpen sind dann immer synchron.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Okil
Beiträge: 32
Registriert: Mi 14. Aug 2019, 16:33
OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
CPU-Target: 64Bit / 32 Bit
Wohnort: Umland München

Re: [Gelöst] Sigsegv Error bei delay Aufruf

Beitrag von Okil »

Es liegt nicht an dem XMLPropage. Ich "hatte" das jetzt anders gelöst. Ich habe ja auf der Config Form schon eine Pumpenliste, die die aktuellen Pumpennamen enthält. Diese Liste wird bei OnActive geladen und bei FormClose gespeichert. Das funktioniert auch.

Was liegt näher als dort auch den letzten Schaltzustand der Pumpen in einer unvisible Spalte zu speichern. Sobald jedoch in OnActive die Zeile

TPumpe2.Checked := Config.StringGridPumpeNme.Cells [2,2] = 'Checked'

ausgeführt wird, wird das OnClick der aktiven Pumpen ausgeführt, da die Standard Checked Eigenschaft im Objektinspektor bei allen Pumpen auf false steht.

Damit ist klar, das OnClick eben nicht nur auf einen Click reagiert, sondern auch auf eine Checked Veränderung. Das heißt, egal wie ich es speichern würde, wird bei den eingeschalteten Pumpen immer auch OnClick Event ausgelöst.

Antworten