mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Code in Assembler wandeln für andere Compiler


Autor: sepentis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also ich würde gerne mal wissen ob es einen Weg gibt ein C-Codestück
(CCS Compiler für PIC16LF877) in Assembler zu wandeln um dieses Kunden 
zur vefügung zu stellen, damit Sie es auch bei anderen C-Compilern 
einbauen könne.
Ich habe für eine Messkarte verschiedene Funktionen geschrieben die ich 
gerne dem Kunden liefern würd. Jedoch besitzen nicht alle unsere Kunden 
den C-Compiler von CCS und ich möchte auch nicht dauernt von Email 
bombadiert werden wie man die Funktionen in einen anderen Compiler 
umsetzen muss.

MFG
Sepentis

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht üblicherweise nur, wenn alle Compiler die gleiche Konvention für 
Parameterübergabe, Assembler-Syntax, Segmentnamen usw. verwenden. Anders 
ausgedrückt: geht ziemlich sicher nicht.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast einen Konzeptfehler:

sepentis wrote:
> also ich würde gerne mal wissen ob es einen Weg gibt ein C-Codestück
> (CCS Compiler für PIC16LF877) in Assembler zu wandeln um dieses Kunden
> zur vefügung zu stellen, damit Sie es auch bei anderen C-Compilern
> einbauen könne.
Ein Compiler kann mit Assemblercode nichts anfangen. Ein Compiler ist 
dazu gedacht, eine Hochsprache (C) in Maschinensprache (ASM) zu 
übersetzen, welche dann vom Assembler in Maschinencode 
(Programm-'Datei') umgesetzt wird. So war das jedenfalls mal gedacht.

> Ich habe für eine Messkarte verschiedene Funktionen geschrieben die ich
> gerne dem Kunden liefern würd. Jedoch besitzen nicht alle unsere Kunden
> den C-Compiler von CCS und ich möchte auch nicht dauernt von Email
> bombadiert werden wie man die Funktionen in einen anderen Compiler
> umsetzen muss.
Ist eigentlich vollkommen wurscht, welchen C-Compiler die Kunden 
benutzen. Frag dich mal, warum C damals erfunden wurde --.
Wenn du z.B. klares ANSI-C oder ISO-C schreibst, kann jeder konforme 
Compiler damit umgehen. Spezialitäten wie '((attribute))' oder '#pragma' 
oder andere proprietäre Verrenkungen musst du dann eben in Makros 
packen.

Autor: Sepentis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst mal Dank.

Was den Beitrag über ANSI-C uns ISO-C angeht das ist mir sehr wohl klar.
Ich habe auch weniger das Problem das mein Code nicht der Norm gerecht 
wird.
Es geht um die Hardware-Funktionen die mein Compiler in entsprechenden
Code umsetzt (sprich ansteuerung des ADCs, PWM usw des PICs). Diese 
Befehle sind leider bei jedem Compiler etwas anders. Deshalb wollte ich 
diese Programmteile direkt in ASM übersetzen damit diese Funktionen so 
übernommen werden können. Der Compiler den ich benutzte kann übrigens 
ohne weiteres
ASM Code einbinden. Das hat man vor Jahren auch gemacht, wo die Compiler 
noch nicht so perfekt auf Geschwindigkeit optimiert waren. Diese 
Codeteile hat man dan in Maschinensprache geschrieben und eingebunden.

MFG
Sepentis

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

Bewertung
0 lesenswert
nicht lesenswert
Sepentis wrote:

> ASM Code einbinden. Das hat man vor Jahren auch gemacht, wo die Compiler
> noch nicht so perfekt auf Geschwindigkeit optimiert waren. Diese
> Codeteile hat man dan in Maschinensprache geschrieben und eingebunden.

... und jeder Compiler hat sein eigenes Süppchen gekocht, wie seine 
Assemblersyntax aussieht bzw. welche Aufrufkonventionen er benutzt.
Wenn du dich darauf einlässt, dann sind graue Haare vorprogrammiert.

Das Beste was du machen kannst:
Die tatsächlich hardwarerelevanten Teile an einer Stelle sammeln und 
dort mit #ifdef den jeweils für einen Compiler passenden auswählen, bzw. 
mittels entsprechender Makro-Magic die Syntax entsprechend anpassen.

Ein bischen was, wenn auch nur wenig, muss man schon von jemandem 
voraussetzen, der ein Programm aus Einzelteilen zusammenbauen möchte.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sepentis wrote:
> Erst mal Dank.
>
> Was den Beitrag über ANSI-C uns ISO-C angeht das ist mir sehr wohl klar.
> Ich habe auch weniger das Problem das mein Code nicht der Norm gerecht
> wird.
Gut, Prinzip verstanden :-)

> Es geht um die Hardware-Funktionen die mein Compiler in entsprechenden
> Code umsetzt (sprich ansteuerung des ADCs, PWM usw des PICs). Diese
> Befehle sind leider bei jedem Compiler etwas anders. Deshalb wollte ich
> diese Programmteile direkt in ASM übersetzen damit diese Funktionen so
> übernommen werden können.
Ich bin mir recht sicher, dass das keine Befehle sind. Du meinst doch 
bestimmt nur Register, die du beschreibst und ausliest, oder?
Würde mich andernfalls recht wundern, aber naja.

> Der Compiler den ich benutzte kann übrigens
> ohne weiteres
> ASM Code einbinden. Das hat man vor Jahren auch gemacht, wo die Compiler
> noch nicht so perfekt auf Geschwindigkeit optimiert waren. Diese
> Codeteile hat man dan in Maschinensprache geschrieben und eingebunden.
Ja, und der Compiler kopiert sie und reicht sie 1:1 an den Assembler 
weiter.
Und übrigens: Die Syntax, um Assemblerquelltext in C einzubetten, ist 
erst Recht verflucht-noch-eins compilerspezifisch. Noch katastrophaler 
sind die Aufrufkonventionen...

Autor: Bill (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
am einfachsten finde ich alle HW/Compilerspezifischen dinge werden in 
makros gepackt.

statt dem ifdef würde ich aber für jede zielplattform ein header zb
"port.h" shreiben der die defines setzt und von jedem file included 
wird.

Autor: Heinz-Dietrich Saupe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi sepentis,

natürlich würde Dein Weg funktionieren, sofern Du darauf achtest, 
genormte Aufrufe Deiner übersetzten Assembler(Sub-)Routinen zu 
verwenden, d.h. alle C-Compiler die gleichen Funktionen nutzen.

Dann mußt Du lediglich Deinen Assembler-Code entsprechend schreiben, in 
den Obj-Code übersetzen und dann an Dein aufrufendes C-Programm linken.

Du mußt bei der Programmierung von Pics etc. allerdings darauf achten, 
daß Du hier möglicherweise homogene Hardware-Vorrausetzungen benötigst. 
Das hat aber nichts mit Deiner ursprünglichen Frage zu tun.

Gruß

Autor: mp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wahrscheinlich hast du die ganzen CCS spezifischen Befehle wie 
PINHIGH(),PINLOW() etc. verwendet. Das ist dann leider nicht portierbar. 
Ich nehme auch manchmal den CCS Compiler, benutze aber nur den ANSI-C 
kompatiblen Teil damit ich auch mit dem Hi-Tech Compiler compilieren 
kann.
BTW Die ganzen "Hardwarebefehle" des CCS machen etrem viel unnötigen 
Overhead und haben teilweise auch bugs. Ist eigentlich genau so ne 
schlechte Idee wie bascom. Nicht portierbar und du weisst nie genau was 
der compiler da eigentlich macht.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sepentis schrieb:
> Es geht um die Hardware-Funktionen die mein Compiler in entsprechenden
> Code umsetzt (sprich ansteuerung des ADCs, PWM usw des PICs). Diese
> Befehle sind leider bei jedem Compiler etwas anders.

Du meinst eine Art Wizzard, dem Du in einer speziellen Zwischensprache 
sagst, was er konfigurieren soll.

Da würde ich raten, einfach nicht den Wizzard zu nehmen, sondern die 
nötigen IO-Register selber zu setzen.
Dann ist der Code auch für andere Compiler portabel.
Allerdings muß man dazu das Datenblatt des Chips lesen, d.h. die 
Funktionesbeschreibung der entsprechenden Peripheriekomponente.


Peter

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.