www.mikrocontroller.net

Forum: PC-Programmierung Compiler in eigenes Programm einbinden


Autor: Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!
Ich habe meine eigenes Programm geschrieben, dass mir C Code für mein 
AVR Mikrokontroller erstellt!! Nichts weltbewegendes!!

Wie kann ich in dieses Programm einen Mikrokontroller Kompiler einbauen.
Bisher habe ich immer WINAVR und AVRStudio benutzt, jetzt möchte ich, 
das von meinem Programm aus machen!

Hat jemand mal vielleicht ein Beispiel oder sowas in der Art??

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Student wrote:
> Hallo Leute!
> Ich habe meine eigenes Programm geschrieben, dass mir C Code für mein
> AVR Mikrokontroller erstellt!! Nichts weltbewegendes!!
>
> Wie kann ich in dieses Programm einen Mikrokontroller Kompiler einbauen.
> Bisher habe ich immer WINAVR und AVRStudio benutzt, jetzt möchte ich,
> das von meinem Programm aus machen!
>
> Hat jemand mal vielleicht ein Beispiel oder sowas in der Art??

Oh. Das ist gefährlich.
Bei deinem Benutzer muss dazu genau der Compiler deiner
Wahl in meist exakt der richtigen version installiert sein.

Aber du hast es nicht anders gewollt :-)
Die C-Funktion die du suchst, heist 'system'.
Diese Funktion stellt dir praktisch ein Command Line
zur Verfügung und führt den an die Funktion übergebenen String
als Kommando in dieser Command Line aus.

Jetzt musst du nur noch rausfinden, wie dein Compiler von
der Command line aus aufgerufen werden will. Normalerweise
macht man das mit einem makefile.

Dein erstes Ziel wird es daher sein, auf AVRStudio zu
verzichten und zu lernen, wie man mit WinAvr ohne AVRStudio
umgeht. Sobald du das kannst, weist du auch wie deine
Kommandos für die Command Line aussehen müssen. Und dann kannst
du mit system() diese Kommandos an eine Command Line übergeben.

Viel Spass dabei.
Und denk immer daran: Wenn dein Benutzer sein System nicht
so konfiguriert hat, wie du das erwartest, dann bist du ersschossen.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
system() sollte man uebrigens eher nicht nehmen, um fremde Programme 
aufzurufen. Das kann boese Sicherheitsluecken oeffnen, ist oft sehr 
langsam und bietet keine Features wie direktes Einlesen der 
Standard-Ausgabe des aufgerufenen Programms.
Besser ist es, betriebssystemspezifische Funktionen zu nehmen.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter VisualBasic u.ä. Hochsprachen gibt es meist einen "shell"-Befehl.
Zur benutzten Programmiersprache gab es ja keine Angaben...

Autor: Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also danke für die Tipps!
Das kling kompliziert! Das habe ich es mir auch gedacht!!

Ich habe meine Programm mit Builder C++ geschrieben!
Hat vielleicht jemand irgendwelche Beispiele oder Links, wo ich die 
Inforamtionen sammeln kann??

P.S.: Bitte schreibt nicht versuche es bei google, denn das habe ich 
schon gemacht!!!

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mal ein bischen gegoogelt :-)

Also: Laut diversen Sites, gibt es auf deinem Builder C++ Help
Verzeichnis ein File namens bcb5tool.hlp, in dem beschrieben
ist, wie der Compiler bzw. die Tools von einer Command Line
aufgerufen werden.

Das ist genau das was du erst mal brauchst.

Zwischenfrage: Kannst du mit einer DOS-Box noch umgehen?
Wenn nein, dann solltest du dich darüber erst mal im Web
etwas schlau machen.
Zb. gibt es in einer DOS Box das Kommando DIR, welches ein
INhaltsverzeichnis des momentan aktuellen Verzeichnisses
ausgibt. Probier das mal aus! Die DOS Box findet sich in den
meisten Windows Verisionen unter 'Start - Programme - Zubehör'.
Alternativ kannst du auch so vorgehen:
'Start - Ausführen' und als auszuführendes Programm gibst du 'cmd'
an. Auch dann müsste sich die DOS-Box öffnen.

In der DOS-Box gibst du jetzt einfach mal 'dir' ein.
Daraufhin kriegst du das Inhaltsverzeichnis ausgegeben.

Wie kann man nun dasselbe von einem C Programm aus machen:

int main()
{
  system( "dir" );
}

Das Kommando welches ausgeführt werden soll, wird als String an
system übergeben.

Um die Ausgabe nicht an die Konsole, sondern in eine Datei zu
bekommen, benutzt man die Redirection. Wieder ein Vortest
in der DOS-Box

   dir > test.txt

der > veranlasst die Konsole, die Programmausgabe in eine Datei
zu routen. Die Datei kannst du dir zb ansehen mit

  type test.txt


Im Programm geht das dann zb so:

int main()
{
  system( "dir > test.txt" );
}

Also: einfach die Kommand Line, so wie du sie in der DOS Box
eingeben würdest an system übergeben.

Jetzt kommt obiges Help File ins Spiel. In dem steht (angeblich)
wie man den Compiler von einer Command Line aufruft. Und dank
DOS-Box kannst du das dann auch probieren. Wenn du dann weißt wies
geht, dann weißt du auch welchen String du an system übergeben musst.


chris hat übrigens recht: system ist für sowas nicht unbedingt ideal.
Systemspezifische Dinge sind da besser geeignet. Aber auch etwas
komplizierter in der Anwendung. Daher würde ich vorschlagen, du
probierst erst mal mit system rum, bis du vor allen Dingen das
Handling der Command Line intus hast, denn das wirst du praktisch
immer brauchen.

Autor: Thomas W. (thomas_v2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hab mich selber letztens mit sowas rumgeschlagen. Wenn man vorher noch 
nichts mit den MS-Betriebssystemaufrufen zu tun hatte ist das etwas 
fummelig.
Hier mal ein paar Infos die mir dabei weitergeholfen haben:

Beispiel von Microsoft:
http://support.microsoft.com/kb/190351/de

Beispiel bei Codeproject:
http://www.codeproject.com/KB/threads/redir.aspx

Beispiel wie Programmers Notepad 2 bei WinAVR das macht (in der Datei 
toolrunner.cpp)
SVN-Repository:
https://pnotepad.svn.sourceforge.net/svnroot/pnotepad

Thomas

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe schon sehr lange was zu diesem Thema gesucht Leute.
Gibt es da von irgendjemand noch irgendwelch Beispiele?

@Thomas W.
https://pnotepad.svn.sourceforge.net/svnroot/pnotepad

Unter dem obigen Link sind haufen Datein. Ich habe leider die Datei 
toolrunner.cpp nicht finden können wo liegt Sie genau??

Gruß Sven

Autor: FBI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
z.B. hier:
https://pnotepad.svn.sourceforge.net/svnroot/pnote...
https://pnotepad.svn.sourceforge.net/svnroot/pnotepad/trunk/pnwtl/toolrunner.cpp
CU

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Windows stellt die Funktionen ShellExecute und ShellExecuteEx zu 
Verfügung (Windows SDK). Damit kannst du Programme oder Dateien mit dem 
dazugehörigen Programm starten. Bei ShellExecuteEx muss dazu eine Struct 
mit den entsprechenden Parametern gefüllt werden. Zum Beispiel kann man 
den Namen einer PDF-Datei übergeben, und die Datei wird mit dem 
Acrobat-Reader geöffnet.

MfG Spess

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

Karl heinz Buchegger, hat was mit
> Und denk immer daran: Wenn dein Benutzer sein System nicht
> so konfiguriert hat, wie du das erwartest, dann bist du ersschossen.

geschrieben!

Was meint er mit "erschossen". Ist mein PC hin oder mein Betriebsystem 
oder das Programm?

Autor: Norgan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Erschossen" = es funktioniert nicht und der Benutzer kotzt.

Ist der Benutzer einer von der zahlenden Sorte, auch als "Kunde" 
bekannt, kann das unangenehm werden.

Normalerweise macht man sowas anders. Wenn "--->" in den folgenden 
Bildern "ruft auf" bedeutet, dann macht man statt
Codegenerator ---> Compiler
normalerweise
Buildtool ---> Codegenerator
Buildtool ---> Compiler
D.h. man lässt eine übergeordnete Instanz wie make den 
Softwaregenerierungsprozess und den Übersetzungsprozess koordinieren. 
Das klassische Bausteinprinzip, für das IDE-User häufig kein Händchen 
mehr haben, hat schon was.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Norgan wrote:
> "Erschossen" = es funktioniert nicht und der Benutzer kotzt.
>
> Ist der Benutzer einer von der zahlenden Sorte, auch als "Kunde"
> bekannt, kann das unangenehm werden.

Yep.
Den hast du dann stundenlang an der Strippe und darfst mit ihm
sein System debuggen um rauszukriegen warum ein Fremdprodukt,
welches eigentlich nicht dein Bier ist, du aber leichtsinniger-
weise eingebunden hast, ausgerechnet auf seinem System nicht
funktioniert.

'Ausreden' wie "Das ist ja gar nicht mein System, warum soll ich
mich damit rumschlagen warum xyz hier nicht funktioniert" gelten
dann nicht. Der Kunde will eine Lösung, und da er (aus seiner Sicht)
in erster Linie mit deinem Programm arbeitet und von xyz nichts
sieht, bist du dran.

Hatte das Spielchen jahrelang mit Microsofts DAO. Bei 10 Rechnern
ist im Schnitt 1 dabei, auf dem DAO einfach nicht läuft und keiner
(noch nicht mal Microsoft) weiß warum. Und jetzt mach das mal einem
Kunden klar, der auf diese Datenbankfunktionalität angewiesen ist,
weil er Fremddaten damit einlesen muss.

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das wäre dann der Richtige weg?

> Buildtool ---> Codegenerator
> Buildtool ---> Compiler

Bloß das verstehe ich nicht ganz was Ihr damit meint.
Buildtool!? Was ist das, noch nie gehört?
Wie Arbeiten dann die ganzen Programme wie AVRStudio?

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Buildtool" bedeutet i.A. ein Shell-Script (Batchfile) oder das Programm 
"make". Das setzt aber dan voraus, dass sowohl der AVR-C-Compiler als 
auch das entsprechende Buildtool korrekt installiert sind, deshalb ist 
mir nicht ganz klar, welche Vorteile das bringt.

> Das klassische Bausteinprinzip, für das IDE-User häufig kein Händchen
> mehr haben, hat schon was.

Außer, der schon genannte "Kunde" ist ein IDE-Benutzer und hat kein 
Händchen dafür ;)

Konkret: Wenn der Kunde sich mit "make" auskennt, und am besten noch den 
AVR-Compiler selbst installieren kann, bestens! Denn dann musst du 
deinen Codegenerator als Baustein verpacken, den der Kunde in sein 
make-System einbauen kann (das kostet wenig Arbeit deinerseits).

Falls nicht, mein Beileid, denn das angesprochene "Baukastenprinzip" 
wurde für Computerexperten entwickelt, nicht für Menschen. Zum Beispiel 
gibt es keine allgemein funktionierende Methode, herauszufinden, ob und 
wo der AVR-Compiler installiert ist; es gibt nur Insellösungen die 
funkionieren oder auch mal nicht (z.B. PATH-Variable, die kann richtig 
gesetzt sein oder nicht).

Wenn du dich aber auf ein System beschränkst, sieht es rosiger aus. Zum 
Beispiel wurde zumindest Windows-weit ein solches System eingeführt, 
nämlich die allseits bekannte Registry (auf die ironischerweise von 
Unix-Fans immer geschimpft wird, obwohl oder vielleicht gerade weil sie 
ein Problem einheitlich löst welches unter Unix auf jedem System anders 
gelöst werden muss). Soll heißen, der AVR-Compiler muss auf dem 
Kundensystem zwar installiert sein; danach ist es aber bei den meisten 
Produkten (und hoffentlich auch dem AVR-Compiler) über die Registry 
möglich, dessen Standort herauszufinden.

Sollte auch das schiefgehen, bleibt immer noch die Möglichkeit, dass der 
Benutzer selbst Hand anlegt und den Befehl zum Aufruf des AVR-Compilers 
per Hand eingibt und dieser Befehl dann im schon genannten system() bzw. 
ShellExecuteEx() verwendet wird.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morin wrote:
> "Buildtool" bedeutet i.A. ein Shell-Script (Batchfile) oder das Programm
> "make". Das setzt aber dan voraus, dass sowohl der AVR-C-Compiler als
> auch das entsprechende Buildtool korrekt installiert sind, deshalb ist
> mir nicht ganz klar, welche Vorteile das bringt.

Es hilft dir zumindest insofern, als dass du einen zu deinem Programm
externen 'Seiteneingang' hast, der bei der Fehlersuche hilfreich sein
kann.
Du lässt dein Programm die make-Steuerdatei generieren und kannst
dann in der Datei nachsehen was das Programm so alles generiert
hat, ob die Pfade stimmen etc.
Danach: DOS-Box auf und make mal händisch anwerfen lassen.
Anhand der Fehlermeldungen kommt man dann meist weiter.

Stösst man zb den Compiler direkt aus dem Programm heraus an,
dann hat man das Problem, dass man den tatsächlich an system
übergebenen String nicht mehr sieht und es daher schwierig ist
exakt diese Zeile in einer Commandline zu reproduzieren.

Persönlich denke ich, dass man gerade bei der Anbindung an externe
Komponenten nie genug Testmöglichkeiten und Variabilität einbauen
kann. Sei es, dass system-Aufrufe komplett gedumpt werden, sei es
dass man Umwege über eine Batch Datei geht, sei es dass man ein
Commando-Template in eine externe Datei legt, in der das Programm
dann Parameter ersetzt, ...
Solange es keine Probleme gibt, ist das alles wunderbar. Wenn es
aber, aus welchem Grund auch immer, Probleme gibt, ist man arm
drann.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.