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


von sepentis (Gast)


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

von (prx) A. K. (prx)


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.

von Sven P. (Gast)


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.

von Sepentis (Gast)


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

von Karl H. (kbuchegg)


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.

von Sven P. (Gast)


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...

von Bill (Gast)


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.

von Heinz-Dietrich Saupe (Gast)


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ß

von mp (Gast)


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.

von Peter D. (peda)


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

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.