TProcces output nicht lesbar [gelöst]

Rund um die LCL und andere Komponenten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1671
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

TProcces output nicht lesbar [gelöst]

Beitrag von corpsman »

Guten Morgen allerseits, ich versuche mich gerade am Nachbau von Kontrollerlab.

Leider ist Kontrollerlab von KDE3 Abhängig und dass gibts ja ab Kubuntu 11.10 nicht mehr, ich habs zwar dennoch zum laufen gebracht aber , .. naja.

Zum Thema, ich dachte ich mach das einfach selbst. Dabei mache ich mir natürlich eine extrem reduzierte Variante.

Die Uart Kommunikation habe ich mittels synapse hin bekommen und läuft akzeptabel.

2. Schritt das Kompilieren mittels Konsole, dazu habe ich mir dieses Beispiel angesehen und ausprobiert. Nur leider klappt es nicht wie es soll.

Steht in Edit1.text := 'ppc386 -h' dann sehe ich in Tmemo1.lines das entsprechende , steht in Edit1.text := 'avr-gcc -mmcu=atmega32 -mcall-prologues -Wall -O0 -DF_CPU=16000000UL -c main.c -o main.o'

Dann sollte da in etwa das hier stehen :

Code: Alles auswählen

corpsman@corpsman2:/sda5/sda5/Tools/Projects/KLab/Konsole_Kompiler$ avr-gcc -mmcu=atmega32 -mcall-prologues -Wall -O0 -DF_CPU=16000000UL -c main.c -o main.o
main.c:2:30: fatal error: atmel_eval_board.h: No such file or directory
compilation terminated.
Mein Memo bleibt aber leider komplett leer :(.

Hier noch der Code :

Code: Alles auswählen

Procedure TForm1.Button1Click(Sender: TObject);
Var
  AProcess: TProcess;
Begin
  // Entnommen aus  : http://wiki.lazarus.freepascal.org/Executing_External_Programs/de#Ein_verbessertes_Beispiel" onclick="window.open(this.href);return false;
  AProcess := TProcess.Create(Nil);
  AProcess.CommandLine := edit1.text;
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
  Memo1.Lines.LoadFromStream(AProcess.Output);
  AProcess.Free;
End;
den ich nutze, gibts da noch irgend einen Trick ?

[Edit]

Einen Teilerfolg habe ich.

Ist Edit1.text := '/usr/bin/avr-gcc -mmcu=atmega32 -mcall-prologues -Wall -O0 -DF_CPU=16000000UL -c /sda5/sda5/Tools/Projects/KLab/Konsole_Kompiler/main.c -o /sda5/sda5/Tools/Projects/KLab/Konsole_Kompiler/main.o';

dann erzeugt er wenigstens die main.o. Der Befehl wird also Prinzipiell durch TProcess verarbeitet, nur leider sehe ich den Output nicht :(
Zuletzt geändert von corpsman am Mo 31. Okt 2011, 19:05, insgesamt 1-mal geändert.
--
Just try it

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TProcces output nicht lesbar

Beitrag von mse »

Ein Hinweis: MSEide kann benutzt werden, um AVR32 gnu-toolchain Projekte zu entwickeln.
Die Integration weiterer AVR Typen ist sicher möglich, hauptsächlich müsste ein entsprechendes gdb interface und zusätzliche CPU Fenster entworfen werden.

Martin

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1671
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TProcces output nicht lesbar

Beitrag von corpsman »

zugegeben ganz verstanden hab ichs nicht.

MSEide ist also eine Alternative Entwicklungsumgebung zu Lazarus, mit deren Hilfe ich auch eine Entwicklungsumgebung schreiben kann ähnlich Kontrollerlab ?

Dabei wollte ich doch eigentlich nur wissen, warum ich die TProcess Ausgaben von avr-gcc nicht sehen kann...

Wenn ich nun MSEide nutze, habe ich nicht nur das selbe Problem wie vorher, sondern muss auch noch ne neue IDE lernen ?
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3178
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: TProcces output nicht lesbar

Beitrag von Socke »

corpsman hat geschrieben:dann erzeugt er wenigstens die main.o. Der Befehl wird also Prinzipiell durch TProcess verarbeitet, nur leider sehe ich den Output nicht :(
Mit Sicherheit schreibt der GCC die Fehlermeldungen nicht nach StdOut sondern nach StdErr; Entweder leitest du StdErr auf StdOut um (geht mit TProcess.Options) oder du lädst die direkt von da (wie die Eigenschaft heißt, weiß ich nicht).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TProcces output nicht lesbar

Beitrag von mse »

corpsman hat geschrieben:zugegeben ganz verstanden hab ichs nicht.

MSEide ist also eine Alternative Entwicklungsumgebung zu Lazarus, mit deren Hilfe ich auch eine Entwicklungsumgebung schreiben kann ähnlich Kontrollerlab ?
MSEide ist nicht nur eine alternative Entwicklungsumgebung zu Lazarus, sondern auch eine Entwicklungsumgebung zur Programmierung beliebiger Mikroprozessoren, für welche eine gnu-toolchain besteht. CPU-Module gibt es bereits für AVR32, ARM, BDM-CPU32/Coldfire, i386 und x86-64. MSEide ist also auch eine mögliche Alternative zu Kontrollerlab. Mit etwas Arbeit wäre es auch denkbar, weitere toolchains statt der gcc einzubinden. MSEide ist nicht auf FreePascal beschränkt.

Edit:
Dabei wollte ich doch eigentlich nur wissen, warum ich die TProcess Ausgaben von avr-gcc nicht sehen kann...
In MSEgui gibt es für den Zweck die Komponente tterminal. ;-)
Zuletzt geändert von mse am So 30. Okt 2011, 14:16, insgesamt 2-mal geändert.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1671
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TProcces output nicht lesbar

Beitrag von corpsman »

Wenn ich dich Richtig verstanden habe :

Code: Alles auswählen

AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes, poStderrToOutPut];
Funktioniert aber leider auch nicht :(
Die Process Options sind :

Code: Alles auswählen

TProcessOption = (poRunSuspended,poWaitOnExit,
                    poUsePipes,poStderrToOutPut,
                    poNoConsole,poNewConsole,
                    poDefaultErrorMode,poNewProcessGroup,
                    poDebugProcess,poDebugOnlyThisProcess);
Gibt es eigentlich noch andere Möglichkeiten konsolen Programme mit Feadback aus zu führen ?

Das Problem scheint irgendwie essentieller zu sein .

Wenn ich alles in einer Konsole eintippe :

Code: Alles auswählen

corpsman@corpsman2:~/Desktop$ ppc386 -h >> test.txt
corpsman@corpsman2:~/Desktop$ avr-gcc >> test2.txt
Beide Dateien werden erstellt, Test2 ist leer.
--
Just try it

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TProcces output nicht lesbar

Beitrag von mse »

Probiere mal
ppc386 -h > test.txt 2>&1

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1671
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TProcces output nicht lesbar

Beitrag von corpsman »

hab den Befehl in der Konsole eingegeben die txt Datei ist da, für was das &1 steht ist mir aber nicht klar , auf der Konsole wurde nichts ausgegeben.
--
Just try it

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TProcces output nicht lesbar

Beitrag von mse »

Die Umleitungen werden von links nach rechts abgearbeitet. stdin hat die Nummer 0, stdout die Nummer 1, stderr die Nummer 2. Wenn keine file descriptor Nummer angegeben wird, wird stdout (=1) angenommen.
'> test.txt' bedeutet also "leite stdout in die Datei test.txt um". '>> test.txt' wäre "hänge die Daten von stdout an die Datei test.txt an". '2>&1' "kopiere die Ausgabe von stderr in stdin". '&' wird benötigt um die file descriptor Nummer von einer Datei namens "1" zu unterscheiden. '> test.txt 2>&1' bedeutet "leite stdout und stderr in die Datei test.txt um".

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1671
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TProcces output nicht lesbar

Beitrag von corpsman »

Ich glaub ich habe dich verstanden :

corpsman@corpsman2:~/Desktop$ avr-gcc >test.txt 2>&1


und in test.txt steht nun :

avr-gcc: no input files


Nu muss ich nur noch einen Weg finden, das ganze mittels TProcess zu machen und bin meinem Ziel deutlich näher ...

Sind wir hier eigentlich auf einen Bug von TProcess gestoßen, oder ist das ein Fehler in der Ausgabe von avr-gcc ?
--
Just try it

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TProcces output nicht lesbar

Beitrag von mse »

corpsman hat geschrieben: Sind wir hier eigentlich auf einen Bug von TProcess gestoßen, oder ist das ein Fehler in der Ausgabe von avr-gcc ?
Probiere mal mit standard gcc. Wenn es mit gcc auch nicht funktioniert, ist es eher ein Fehler in TProzess oder in der Anwendung. Das Arbeiten mit child-Prozessen und pipes ist nicht einfach. Ich habe mit den MSEgui Komponenten für Prozesse und pipes auch ziemlich lange geübt und immer wieder kommt ein neuer Spezialfall, an den man nicht gedacht hat...

Martin

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1671
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TProcces output nicht lesbar

Beitrag von corpsman »

Mit gcc ist der selbe Fehler.

Leider hab ich es noch nicht geschafft die Umleitung mittels TProcess zu machen, werde nun versuchen das ganze über den Umweg einer TMP File zu machen. Das ist dann nicht "sauber" aber immerhin sehe ich was mir avr-gcc antwortet *g*. Und eine Compile Log ist ja so schlecht auch nicht ..

Im Detail erstelle ich nun eine "blub.sh" schreibe in diese mein Befehl

#!/bin/bash
avr-gcc -mmcu=atmega32 -mcall-prologues -Wall -O0 -DF_CPU=16000000UL -c main.c -o main.o >test.txt 2>&1

und lese nachher die txt aus. Das hab ich gerade getestet und funktioniert.
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3178
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: TProcces output nicht lesbar

Beitrag von Socke »

corpsman hat geschrieben:Im Detail erstelle ich nun eine "blub.sh" schreibe in diese mein Befehl

#!/bin/bash
avr-gcc -mmcu=atmega32 -mcall-prologues -Wall -O0 -DF_CPU=16000000UL -c main.c -o main.o >test.txt 2>&1
In dem Fall könntest du doch deine Shell dazu bringen, den Befehl auszuführen. Dann brauchst du keine extra Datei.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1671
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TProcces output nicht lesbar

Beitrag von corpsman »

So hier mal die 1. Variante die Funktioniert

Code: Alles auswählen

Function ExecuteCommand(App, Param, skriptname, logname: String): String;
Var
  f: Textfile;
  AProcess: TProcess;
  sl: TStringList;
Begin
  // Erstellen des Shellscriptes
  assignfile(f, skriptname);
  rewrite(f);
  writeln(f, '#!/bin/bash');
  writeln(f, app + ' ' + param + ' >' + logname + ' 2>&1');
  closefile(f);
  // Datei Ausführbar machen
  fpChmod(skriptname, &777);
  // Ausführen des Skripts
  // Entnommen aus  : http://wiki.lazarus.freepascal.org/Executing_External_Programs/de#Ein_verbessertes_Beispiel" onclick="window.open(this.href);return false;
  AProcess := TProcess.Create(Nil);
  AProcess.CommandLine := skriptname;
  AProcess.Options := AProcess.Options + [poNoConsole, poWaitOnExit];
  AProcess.Execute;
  AProcess.Free;
  // Auslesen der Logfile
  sl := TStringList.create;
  sl.LoadFromFile(logname);
  result := sl.text;
  sl.free;
End;
@Socke, du hast prinzipiell Recht, aber wenn ich den Befehl der im Shell Skript steht mit TProcess ausführe, funktioniert die Weiterleitung in die Logfile nicht.
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3178
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: TProcces output nicht lesbar

Beitrag von Socke »

corpsman hat geschrieben:@Socke, du hast prinzipiell Recht, aber wenn ich den Befehl der im Shell Skript steht mit TProcess ausführe, funktioniert die Weiterleitung in die Logfile nicht.
TProcess übergibt den Programmnamen und die Parameter direkt an das Betriebssystem, und da musst du die Umleitung in eine andere Datei/Pipe selbst vornehmen (was TProcess eigentlich machen sollte). Die Shell (Bourne-Shell (sh), Bourne-Again-Shell (bash)) bekommt davon gar nichts mit.

Code: Alles auswählen

AProcess.CommandLine := 'bash -c "' + app + ' ' +  param + ' >' + logname + ' 2>&1"';
Zuletzt geändert von Socke am Mo 31. Okt 2011, 12:37, insgesamt 1-mal geändert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten