So toll, dass Sie compilerunabhängig sein wollen! Leider verwenden Hitech- und CCS-Compiler für die Low-End-PICs viele compilerspezifische Präprozessordeklarationen, compilerspezifische Pin-Zugriffsroutinen und im Fall von CCS-Compilerspezifischen Routinen für Zugriffskernfunktionen wie SPI, I2C, ADC usw.
Es ist nicht möglich, Ihren Code so zu schreiben, dass er nicht compilerspezifisch ist, ohne viel Präprozessor #define, #ifdef, #ifndef usw., um Zugriff auf bestimmte Teile des Angebots jedes Compilers zu erhalten. Dies würde Ihren Code unlesbar machen.
Das Beste, was Sie anstreben können, ist, IDE-unabhängig zu sein und so etwas wie Eclipse zu verwenden. Zumindest verwenden Sie dieselbe IDE. Dies führt zum Verlust von CCS-Assistenten für die Einrichtung von Kernfunktionen, bietet Ihnen jedoch mehr Flexibilität bei der Verwendung derselben IDE.
Eine andere zu berücksichtigende Sache ist, dass sowohl hitech als auch CCS (zumindest in der Vergangenheit) keinen echten c-Compiler-Linker haben und dass Sie "#include myfile.c" verwenden müssen, was ich persönlich verachte ... aber das ist eine andere Geschichte.
Ich habe den IAR-Compiler nicht kommentiert, da ich nur CCS und Hitech verwendet habe. Beide funktionierten einwandfrei, aber ich war auch nach der Migration von der Motorola-Plattform (jetzt Freescale) und der Verwendung des zu dieser Zeit fortgeschritteneren Metroworks-Compilers nie wirklich zufrieden. Der IAR-Compiler sieht gut aus, aber ich habe ihn nie benutzt.
Wenn Sie PIC18-Teile verwenden, würde ich den C18-Compiler von Microchip empfehlen. Es entspricht ANSI C viel besser als der CCS-Compiler. Ich bin mir über den Hi-Tech-Compiler nicht sicher, da ich ihn nicht verwendet habe. Wie bereits erwähnt, müssen Sie viele Pre-Compiler-Anweisungen verwenden, wenn Sie wirklich compilerunabhängigen Code erstellen müssen. Ich würde empfehlen, einen Blick auf einige der Microchip-Beispielprogramme zu werfen, die mehrere Compiler unterstützen, um eine Vorstellung davon zu bekommen, wie es gemacht wird.
quelle
Leider werden Sie feststellen, dass es sehr schwierig ist, ein compilerunabhängiges Programm für einen Mikrocontroller zu finden. Es gibt mehrere Probleme, hier sind nur zwei:
Unterschiede in Peripheriegeräten, SFR-Namen usw. (insbesondere gegenüber anderen Prozessoren, aber auch bei Compilern derselben Familie) und
Nicht standardmäßige Funktionen einiger Compiler wie das Setzen von Bits einzeln oder unterschiedliche Strukturen zum Aufrufen von Assemblycode.
Die 16F-Serie ist architektonisch sehr begrenzt und nicht wirklich für die Unterstützung eines C-Compilers ausgelegt. Deshalb gibt es kein GCC dafür.
quelle
Schauen Sie sich SDCC an . Es unterstützt viele der PIC16- und PIC18-Geräte. GCC unterstützt PIC24 und dsPIC.
quelle
Die wahrscheinlichsten Aspekte, die vom Compiler abhängig sind, sind:
Meine bevorzugte Methode, dies zu handhaben, besteht darin, Makros für diese Aspekte zu schreiben und den Compiler das richtige Makro basierend auf compilerspezifischen vordefinierten Makros auswählen zu lassen. Auf diese Weise habe ich eine RFM70-Bibliothek und Beispielanwendungen erstellt, die auf PIC14 (HiTechC), PIC16 (C18) und ARM (GCC) ausgeführt werden.
(Update) Meine RFM70-Bibliothek ist jetzt vollständig. Es unterstützt C auf PIC 16F (Hitech-Compiler), C und C ++ auf LPC11114 (Cortex) und LPC2148 (ARM7TDMI) (GCC-Compiler) und Arduino (ATMega128, GCC-Compiler). Dies wird (einschließlich der Sauerstoffdokumentation) aus derselben Quelle generiert, indem eine Vorverarbeitung in einem Python-Skript durchgeführt wird. Jal-Support ist in der Entwicklung, vielleicht folgt ProtonBasic. http://www.voti.nl/rfm70
quelle