Tak dobrze, że chcesz być niezależny od kompilatora! Niestety kompilatory hitech i CCS dla niższych PIC używają wielu specyficznych dla kompilatora deklaracji preprocesora, specyficznych dla kompilatora procedur dostępu do pinów, aw przypadku specyficznych dla kompilatora CCS procedur dostępu do podstawowych funkcji, takich jak SPI, I2C, ADC i tak dalej.
Nie jest możliwe napisanie kodu, który nie jest specyficzny dla kompilatora, bez dużej ilości preprocesora #define, #ifdef, #ifndef itd., Aby uzyskać dostęp do określonych części tego, co każdy kompilator ma do zaoferowania. To spowodowałoby, że Twój kod byłby nieczytelny.
Najlepszą rzeczą, na którą możesz dążyć, to być niezależnym od IDE i używać czegoś takiego jak zaćmienie, więc przynajmniej używasz tego samego IDE. Spowoduje to utratę kreatorów CCS do konfigurowania podstawowych funkcji, ale zapewni większą elastyczność w korzystaniu z tego samego IDE.
Inną rzeczą do rozważenia jest to, że zarówno hitech, jak i CCS nie mają (przynajmniej w przeszłości) prawdziwego linkera kompilatora c i wymagały użycia „#include myfile.c”, którego osobiście gardzę… ale to inna historia.
Nie komentowałem kompilatora IAR, ponieważ używałem tylko CCS i hitech. Oba działały dobrze, ale nigdy nie byłem zadowolony z migracji po migracji z platformy Motorola (teraz freescale) i użyciu kompilatora metroworks, który był wówczas bardziej zaawansowany. Kompilator IAR wygląda dobrze, ale nigdy go nie użyłem.
Jeśli korzystasz z części PIC18, poleciłbym kompilator C18 firmy Microchip. Jest znacznie bardziej zgodny z ANSI C niż kompilator CCS. Nie jestem pewien co do kompilatora Hi-Tech, ponieważ go nie używałem. Jak już powiedziano wcześniej, jeśli naprawdę chcesz, aby kod był niezależny od kompilatora, będziesz musiał użyć wielu dyrektyw prekompilatora. Polecam przyjrzeć się niektórym przykładowym programom Microchip, które obsługują wiele kompilatorów, aby dowiedzieć się, jak to zrobić.
źródło
Niestety okaże się, że bardzo trudno jest znaleźć niezależny od kompilatora program dla mikrokontrolera. Jest kilka problemów, tutaj są tylko dwa:
Różnice w urządzeniach peryferyjnych, nazwach SFR itp. (Zwłaszcza w porównaniu z innymi procesorami, ale nawet w przypadku kompilatorów z tej samej rodziny), oraz;
Niestandardowe funkcje niektórych kompilatorów, takie jak ustawianie bitów indywidualnie lub różne struktury do wywoływania kodu asemblera.
Seria 16F jest bardzo ograniczona pod względem architektury i tak naprawdę nie została zaprojektowana do obsługi kompilatora C. Dlatego nie ma na to GCC.
źródło
Spójrz na SDCC . Obsługuje wiele urządzeń PIC16 i PIC18. GCC obsługuje PIC24 i dsPIC.
źródło
Najbardziej prawdopodobne aspekty zależne od kompilatora to:
Moim preferowanym sposobem radzenia sobie z tym jest pisanie makr dla tych aspektów, a kompilator wybiera prawidłowe makro na podstawie predefiniowanych makr specyficznych dla kompilatora. W ten sposób stworzyłem bibliotekę RFM70 i przykładowe aplikacje, które działają na PIC14 (HiTechC), PIC16 (C18) i ARM (GCC).
(aktualizacja) Moja biblioteka RFM70 jest teraz kompletna. Obsługuje C na PIC 16F (kompilator Hitech), C i C ++ na LPC11114 (Cortex) i LPC2148 (ARM7TDMI) (kompilator GCC) oraz Arduino (ATMega128, kompilator GCC). Jest to generowane (w tym dokumentacja doxygen) z tego samego źródła przez wykonanie wstępnego przetwarzania w skrypcie Python. Wsparcie Jal jest w fazie rozwoju, może nastąpi ProtonBasic. http://www.voti.nl/rfm70
źródło