Forum: PC-Programmierung Linux-Programm unter Windows 7 und 10 benutzen


von Bauform B. (bauformb)


Lesenswert?

Früher konnte ich ein Hello-World für die Kommandozeile unter Debian 
schreiben und mit mingw für Windows übersetzen. Das lief in einem 
DOS-Fenster unter XP. Wie einfach geht das heute bzw. wie macht man das 
heute?
Das Programm muss über einen FTDI USB-zu-RS422 Konverter und den 
STM-UART-Bootloader einen STM32L451 flashen. Soweit ist es nicht 
verhandelbar. Eine Virtuelle Maschine würde ich deshalb eher nicht 
versuchen, vom Aufwand für den Windows-Benutzer mal abgesehen. Das 
Programm verwendet ziemlich spezielle Header und portieren per mingw ist 
wahrscheinlich schon deshalb aussichtslos?
1
error.h
2
errno.h
3
fcntl.h
4
stdarg.h
5
stdint.h
6
stdio.h
7
stdlib.h
8
string.h
9
termios.h
10
unistd.h
11
sys/ioctl.h
12
sys/select.h

von Walter T. (nicolas)


Lesenswert?

Bauform B. schrieb:
> und mit mingw für Windows übersetzen.

Geht immer noch. Aber Treiber werden unter Windows natürlich anders als 
unter Linux angesprochen.

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Bauform B. schrieb:
> Wie einfach geht das heute bzw. wie macht man das
> heute?

Heute hat Windows 10 ein Linux Subsystem. Man kann sich Ubuntu direkt 
aus dem Microsoft Store intallieren. Da hat Dein Linux Programmer 
ziemlich gute Chancen direkt zu funktionieren...

von DPA (Gast)


Lesenswert?

Jim M. schrieb:
> Da hat Dein Linux Programmer ziemlich gute Chancen direkt zu funktionieren

Zumindest WSL 1 ist kein Linux, Linux Treiber kann man darin erstmal 
nicht nutzen. WSL 2 hab ich noch nicht versucht, das soll wohl eine art 
VM sein?

von TR.OLL (Gast)


Lesenswert?

Virtuelle Maschine?

von Oliver S. (oliverso)


Lesenswert?

Jim M. schrieb:
> Heute hat Windows 10 ein Linux Subsystem. Man kann sich Ubuntu direkt
> aus dem Microsoft Store intallieren. Da hat Dein Linux Programmer
> ziemlich gute Chancen direkt zu funktionieren...

Bauform B. schrieb:
> Das Programm muss über einen FTDI USB-zu-RS422 Konverter und den
> STM-UART-Bootloader einen STM32L451 flashen. Soweit ist es nicht
> verhandelbar.

Zitat aus der WLS2-FAQ:
1
In initial releases of WSL 2 hardware access support will be limited, e.g: you will be unable to access the GPU, serial or USB devices.

Gibt anscheinend eine work-around für USB:
https://github.com/rpasek/usbip-wsl2-instructions

aber nach "out of the box" klingt das jetzt nicht.

Oliver

von Johannes S. (Gast)


Lesenswert?

Einen Tipp zur Nutzung von USB-Serial Adapter findet man hier:
https://www.scivision.dev/usb-tty-windows-subsystem-for-linux/
(noch nicht selber probiert).

Die Möglichkeit WSL2 (jetzt schon) zu nutzen hängt an der Teilname am 
Windows-Insider Programm. Hat das hier schon jemand probiert? Schon in 
WSL1 läuft der gcc (für ARM) gefühlt deutlich schneller, in WSL2 sollen 
die Dateizugriffe nochmal schneller werden. Hat hier jemand das schon 
installiert?

VSCode hat übrigens eine Extension um sich mit WSL zu verbinden, damit 
kann im VSCode auf das Linux Dateisystem zugegriffen werden. Andersrum 
kann auch VSCode im WSL gestartet werden und man hat den Editor mit 
Linux Shell.

von Bauform B. (bauformb)


Lesenswert?

Walter T. schrieb:
> Aber Treiber werden unter Windows natürlich anders als
> unter Linux angesprochen.

Und ganz besonders, wenn man jede Menge ioctl() verwendet hat. Es ist 
sicher machbar, aber etwas aufwendiger als ich dachte.

Oliver S. schrieb:
> Zitat aus der WLS2-FAQ: In initial releases of WSL 2 hardware access
> support will be limited, e.g: you will be unable to access the GPU,
> serial or USB devices.
> nach "out of the box" klingt das jetzt nicht.

Nur gut, dass mir WSL sowieso eine Nummer zu groß wäre ;) Eigentlich 
darf ich garnichts installieren, mein Programm sollte vom USB-Stick 
laufen (was ja genau genommen auch nicht sein darf).

Den Benutzern wäre es am liebsten, wenn ein Kollege das Programm nach 
Pascal/Delphi portiert, zwecks GUI und so. Meinetwegen, bis dahin tut es 
auch so ein kleiner Linux-Rechner als Programmiergerät.

Also, vielen Dank für alle Tipps!

von Stefan F. (Gast)


Lesenswert?

Bauform B. schrieb:
> Wie einfach geht das heute bzw. wie macht man das heute?

Versuche es mal mit CygWin. Das ist so eine Art Kompatibilitätslayer 
damit du Linux Quelltexte als echte Windows .exe compilieren kannst.

Um das Programm danach auf anderen Computern ausführen zu können, 
brauchst du meistens nur die eigene .exe Datei und die cygwin1.dll.

-> https://www.cygwin.com/

Eine GUI kannst du mit einer Scriptsprache deiner Wahl drumherum bauen. 
Python ist für so etwas gerade angesagt. Wenn eine Art GUI im Textmodus 
Ok ist, schau Dir mal die manual Page von "dialog" an. Damit kannst du 
in Shell-Scripten Dialoge basteln.

-> https://linux.die.net/man/1/dialog

Wenn es schlank sein soll, dann ist es wohl am besten, die GUI mit einer 
Entwicklungsumgebung von Microsoft zu erstellen, auf Basis von 
Bibliotheken die in Windows bereits enthalten sind.

von Arc N. (arc)


Lesenswert?

Was spricht denn gegen die einfachste(n) Lösung(en)?
Entweder was zum Abstrahieren der Seriellen zu schreiben, was dann vom 
Rest des Programms genutzt werden kann (so schwierig ist das unter 
Windows auch nicht) oder was fertiges von ST 
https://www.st.com/en/development-tools/flasher-stm32.html zu nehmen 
(oder sich den Quelltext der ST-Lösung für ersteres ansehen).

von Bauform B. (bauformb)


Lesenswert?

Stefan ⛄ F. schrieb:
> Versuche es mal mit CygWin. Das ist so eine Art Kompatibilitätslayer
> damit du Linux Quelltexte als echte Windows .exe compilieren kannst.
>
> Um das Programm danach auf anderen Computern ausführen zu können,
> brauchst du meistens nur die eigene .exe Datei und die cygwin1.dll.

Das wollte ich so machen, aber mit mingw-w64, angeblich braucht man dann 
keine dll.

Arc N. schrieb:
> Was spricht denn gegen die einfachste(n) Lösung(en)?
> Entweder was zum Abstrahieren der Seriellen zu schreiben, was dann vom
> Rest des Programms genutzt werden kann (so schwierig ist das unter
> Windows auch nicht)

im Prinzip ist das garnicht schwierig, für XP hat es auch funktioniert, 
aber mir fehlt die Geduld.

> oder was fertiges von ST

das wäre natürlich mit Abstand das Beste, geht aber leider nicht. 
Meine Hardware hat keine Taster oder Jumper, also muss das PC-Programm 
ein Break mit definierter Länge senden um den Bootloader zu starten. Wer 
kann denn ahnen, dass sowas mal mit Windows funktionieren muss ;)

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

https://sourceforge.net/projects/lpc21isp/ reicht nicht? Evtl anpassen 
und gut. Compilieren mit mingw unter Linux für Windows. Du bekommst eine 
EXE die einfach so läuft ohne was zu installieren.

Matthias

von Stefan F. (Gast)


Lesenswert?

Bauform B. schrieb:
> Das wollte ich so machen, aber mit mingw-w64, angeblich braucht man dann
> keine dll.

Kann ich mir nicht vorstellen, denn Windows stellt doch gar nicht die 
(BSD) API für ioctl Bereit, die das Programm (vermutlich) benötigt.

von Oliver S. (oliverso)


Lesenswert?

Bauform B. schrieb:
> Nur gut, dass mir WSL sowieso eine Nummer zu groß wäre ;) Eigentlich
> darf ich garnichts installieren, mein Programm sollte vom USB-Stick
> laufen (was ja genau genommen auch nicht sein darf).

Linux-Programme laufen nicht unter Windows.
Der Quelltext könnte zwar mit minGW unter Windows kompiliert werden, die 
serielle Kommunikation muß dafür aber an Windows angepasst werden.

Also entweder auf Windows portieren, komplett neu schreiben, oder einen 
Linux-Rechner verwenden.

Oliver

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Μαtthias W. schrieb:
> https://sourceforge.net/projects/lpc21isp/

knapp daneben. Laut Werbetext ist das ein ISP-Tool, nur für LPCxxx und 
nicht einmal für Cortex-M4 zu gebrauchen. Ich will aber STM32L4 über die 
sowieso vorhandene RS-422 Schnittstelle flashen.

Stefan ⛄ F. schrieb:
> Bauform B. schrieb:
>> Das wollte ich so machen, aber mit mingw-w64, angeblich braucht man dann
>> keine dll.
>
> Kann ich mir nicht vorstellen, denn Windows stellt doch gar nicht die
> (BSD) API für ioctl Bereit, die das Programm (vermutlich) benötigt.
Nicht nur vermutlich, da ist Fleißarbeit angesagt...

"DLL oder nicht" hab' ich bei Wikipedia gelesen, allerdings im 
mingw-Artikel. Ich hoffe, das stimmt auch fÜr mingw-w64
1
Windows programs written with Cygwin run on top of a copylefted
2
compatibility DLL that must be distributed with the program,
3
along with the program's source code. MinGW does not require
4
a compatibility layer, since MinGW-based programs are compiled
5
with direct calls to Windows APIs.
6
7
It is also possible to cross-compile Windows applications with
8
MinGW-GCC under POSIX systems. This means that developers do not
9
need a Windows installation with MSYS to compile software that will
10
run on Windows
Das sind für mich zwei wichtige Vorteile.

: Bearbeitet durch User
von Arc N. (arc)


Lesenswert?

Bauform B. schrieb:
> Arc N. schrieb:
>> Was spricht denn gegen die einfachste(n) Lösung(en)?
>> Entweder was zum Abstrahieren der Seriellen zu schreiben, was dann vom
>> Rest des Programms genutzt werden kann (so schwierig ist das unter
>> Windows auch nicht)
>
> im Prinzip ist das garnicht schwierig, für XP hat es auch funktioniert,
> aber mir fehlt die Geduld.
>
>> oder was fertiges von ST
>
> das wäre natürlich mit Abstand das Beste, geht aber leider nicht.
> Meine Hardware hat keine Taster oder Jumper, also muss das PC-Programm
> ein Break mit definierter Länge senden um den Bootloader zu starten. Wer
> kann denn ahnen, dass sowas mal mit Windows funktionieren muss ;)
1
SetCommBreak(handle);
2
Sleep(milliSeconds); 
3
ClearCommBreak(handle);
Wann Sleep nicht genutzt werden sollte, siehe 
https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleep
Ansonsten eine Schleife mit QueryPerformanceCounter basteln oder wenn 
gröberes Timing reicht mit GetTickCount.

Die D2XX-Lib von FTDI gibt's anscheinend auch für Linux. Damit wäre nur 
noch der Code zum Warten plattformabhängig.
https://www.ftdichip.com/Drivers/D2XX.htm

: Bearbeitet durch User
von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Bauform B. schrieb:
> Μαtthias W. schrieb:
>> https://sourceforge.net/projects/lpc21isp/
>
> knapp daneben. Laut Werbetext ist das ein ISP-Tool, nur für LPCxxx und
> nicht einmal für Cortex-M4 zu gebrauchen. Ich will aber STM32L4 über die
> sowieso vorhandene RS-422 Schnittstelle flashen.

Sorry. Falschen Link erwischt. Nimm 
https://sourceforge.net/projects/stm32flash/. Ob RS232 oder RS422 sollte 
da kein Thema sein wenn sich dein Adapter als COMxy meldet.

Dein genaues Device musst du evtl. noch in dev_table.c ergänzen.

Matthias

von Sheeva P. (sheevaplug)


Lesenswert?

Oliver S. schrieb:
> Linux-Programme laufen nicht unter Windows.

Aber natürlich tun sie das.

von FS (Gast)


Lesenswert?

Sheeva P. schrieb:
> Oliver S. schrieb:
>> Linux-Programme laufen nicht unter Windows.
>
> Aber natürlich tun sie das.

Nicht wenn sie Linux-Systemaufrufe verwenden.

von Stefan F. (Gast)


Lesenswert?

FS schrieb:
> Nicht wenn sie Linux-Systemaufrufe verwenden.

Und genau diese Lücke füllt CygWin soweit es geht. Deswegen hatte ich 
das empfohlen.

von Bauform B. (bauformb)


Lesenswert?

Stefan ⛄ F. schrieb:
> FS schrieb:
>> Nicht wenn sie Linux-Systemaufrufe verwenden.
>
> Und genau diese Lücke füllt CygWin soweit es geht. Deswegen hatte ich
> das empfohlen.

Mein Programm nutzt ziemlich viel ioctl() und vor allem das 
Linux-spezifische tcsendbreak(). Es ist möglich, dass CygWin die 1:1 
emuliert. Wenn allerdings "nur" die POSIX-Eigenschaften eingebaut 
wurden, nützt es nichts. Außerdem müssten die Benutzer CygWin 
installieren, das möchte man vermeiden.

Arc N. schrieb:
> SetCommBreak(handle);
> Sleep(milliSeconds);
> ClearCommBreak(handle);
> Wann Sleep nicht genutzt werden sollte, siehe
> https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleep
> Ansonsten eine Schleife mit QueryPerformanceCounter basteln oder wenn
> gröberes Timing reicht mit GetTickCount.

Das scheint mir die vernünftigste Lösung zu sein, aber es sieht nach 
viel Fleißarbeit aus. Ich müsste zum Testen einen Windows-Rechner kaufen 
und der letzte Versuch, auch nur ein Angebot zu bekommen, ist an zu 
vielen Unbekannten gescheitert.

Einen Linux-Rechner zusammen zu schrauben und Debian zu installieren hat 
auch einen Nachmittag gedauert, aber ich wusste vorher, dass es dann 
funktioniert. Der einzige Nachteil von der Lösung: das Alix3 Board ist 
nicht mehr lieferbar und für Raspberries und Freunde kenne ich keine 
vernünftigen Gehäuse. Jetzt könntet ihr mir statt CygWin oder 
SetCommBreak() eine Alix3-Alternative empfehlen ;)

von Stefan F. (Gast)


Lesenswert?

Bauform B. schrieb:
> Außerdem müssten die Benutzer CygWin
> installieren, das möchte man vermeiden.

Meistens genügt es, die DLL mit zu liefern.

von Bauform B. (bauformb)


Lesenswert?

Stefan ⛄ F. schrieb:
> Bauform B. schrieb:
>> Außerdem müssten die Benutzer CygWin
>> installieren, das möchte man vermeiden.
>
> Meistens genügt es, die DLL mit zu liefern.

Da kennt man den echten CygWin Fan ;) Dankeschön, vielleicht beim 
nächsten Versuch; jetzt läuft das erstmal auf einem "Programmiergerät" 
mit Linux.

von Mike (Gast)


Lesenswert?

Um welches Program handelt es sich?

Stm32flash? https://sourceforge.net/projects/stm32flash/

Ich hatte das vor Jahren für Windows auf Linux zu einem exe compiliert 
(GCC Cross Compiler) das klappte problemlos, ich musste an den Sourcen 
nichts ändern. (Ich müsste aber auch wieder Googeln wie das das machen 
muss. Die erzeugte Win-32 Version verwende ich heute noch auf Win7 und 
Win10 (für 32Bit und 64Bit)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.