PIC 16F Anfänger .. Unterschied in der Programmsyntax bei Verwendung verschiedener Compiler

9

Wie bereits erwähnt, habe ich gerade mit der Programmierung von pic16f877a begonnen. Ich kann jetzt mit 7 Segmentanzeigen arbeiten. Zur Zeit benutze ich den ccs Compiler. Daran ist nichts auszusetzen. Aber ich bin lieber ein compilerunabhängiger Programmierer. Also möchte ich gleichzeitig in anderen Compilern wie IAR oder Hitechc arbeiten. Ich möchte wissen, ob die "Programmanweisungsdeklaration in Compilern" außer ccs anders ist. Bitte führen Sie mich, wie ich mich dieser Sache nähere. Ich würde alle Arten von Vorschlägen begrüßen. Danke im Voraus.

VV Rao
quelle

Antworten:

9

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.

smashtastic
quelle
Wenn Sie es schaffen, bei oder über pic18 zu bleiben, sollten Sie sich den c18-Compiler ansehen. Es hat eine große Menge an Unterstützung. IAR stellt die PIC-Unterstützung ein und verkauft keine Lizenzen mehr mit Wartung.
Kortuk
Ich habe verstanden, dass die PIC16 / 12/10-Architektur der C-Sprache nicht sehr gut entspricht. Daher müssen die C-Compiler einige ungewöhnliche und nicht standardmäßige Strukturen aufweisen, um die PIC-Architektur zu kompensieren. Das Endergebnis ist, dass keiner der Compiler zusammenarbeitet.
Connor Wolf
7

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.

mjh2007
quelle
c18 für pic18, c30 für pic24 und dspic, c32 für pic32!
Kortuk
CCS ist insofern hilfreich, als bestimmte Dinge einfacher zu erledigen sind (z. B. Interrupts und Timer - in allen Microchip-Beispielen müssen Sie ASM schreiben, damit Interrupts in C18 richtig funktionieren), aber es liegt näher an ANSI C.
J. Polfer
Sie benötigen nur eine Montageanweisung, und das ist die GOTO, mit der der Interrupt-Vektor so eingerichtet wird, dass er auf die Interrupt-Serviceroutine verweist.
mjh2007
3

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:

  1. Unterschiede in Peripheriegeräten, SFR-Namen usw. (insbesondere gegenüber anderen Prozessoren, aber auch bei Compilern derselben Familie) und

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

Thomas O.
quelle
3

Schauen Sie sich SDCC an . Es unterstützt viele der PIC16- und PIC18-Geräte. GCC unterstützt PIC24 und dsPIC.

Toby Jaffey
quelle
Ich fragte nach den Unterschieden in den Anweisungen, während ich verschiedene Compiler verwendete. Wie auch immer, ich erfuhr von 1 weiteren Compiler 'sdcc'. Vielen Dank.
VV Rao
2

Die wahrscheinlichsten Aspekte, die vom Compiler abhängig sind, sind:

  • Verwenden von Einzelbits (insbesondere in E / A-Ports)
  • Größen von ganzen Zahlen und Zeichen, die signiert oder nicht signiert sind
  • lustige Zeiger: C18 unterscheidet Rom- und RAM-Zeiger :(
  • Konfigurationssicherungen
  • beschäftigt zu warten

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

Wouter van Ooijen
quelle