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
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.
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.
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
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.
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...
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.
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ß
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.