C'est génial que vous vouliez être indépendant du compilateur! Malheureusement, les compilateurs hitech et CCS pour les PIC bas de gamme utilisent de nombreuses déclarations de préprocesseur spécifiques au compilateur, des routines d'accès aux broches spécifiques au compilateur et, dans le cas des routines spécifiques au compilateur CCS, pour accéder aux fonctions essentielles telles que SPI, I2C, ADC, etc.
Il n'est pas possible d'écrire votre code pour qu'il ne soit pas spécifique au compilateur sans beaucoup de préprocesseur #define, #ifdef, #ifndef et ainsi de suite pour avoir accès à des parties spécifiques de ce que chaque compilateur propose. Cela rendrait votre code illisible.
La meilleure chose que vous puissiez viser est d'être indépendant de l'IDE et d'utiliser quelque chose comme l'éclipse, donc au moins vous utilisez le même IDE. Cela entraînera la perte des assistants CCS pour la configuration des fonctions de base, mais vous donnera une plus grande flexibilité dans l'utilisation du même IDE.
Une autre chose à considérer est que hitech et CCS n'ont pas (au moins dans le passé) un véritable éditeur de liens pour le compilateur c et vous obligent à utiliser "#include myfile.c" que je méprise personnellement ... mais c'est une autre histoire.
Je n'ai pas commenté le compilateur IAR car je n'ai utilisé que CCS et hitech. Les deux ont bien fonctionné, mais je n'ai jamais été vraiment satisfait non plus après avoir migré de la plate-forme Motorola (maintenant freescale) et utilisé le compilateur metroworks qui était plus avancé à l'époque. Le compilateur IAR semble bon mais je ne l'ai jamais utilisé.
Si vous utilisiez des pièces PIC18, je recommanderais le compilateur C18 de Microchip. Il se conforme beaucoup plus étroitement à ANSI C que le compilateur CCS. Je ne suis pas sûr du compilateur Hi-Tech car je ne l'ai pas utilisé. Comme cela a été dit précédemment, si vous avez vraiment besoin de rendre le code indépendant du compilateur, vous devrez utiliser de nombreuses directives de précompilateur. Je recommanderais de jeter un œil à certains des exemples de programmes Microchip qui prennent en charge plusieurs compilateurs pour avoir une idée de la façon dont cela est fait.
la source
Malheureusement, vous trouverez qu'il est très difficile de trouver un programme indépendant du compilateur pour un microcontrôleur. Il y a plusieurs problèmes, en voici deux:
Différences de périphériques, dénomination SFR, etc. (en particulier par rapport à d'autres processeurs, mais même avec des compilateurs de la même famille), et;
Fonctionnalités non standard sur certains compilateurs comme la définition de bits individuellement ou différentes structures pour invoquer le code assembleur.
La série 16F est très limitée en termes d'architecture et n'est pas vraiment conçue pour supporter un compilateur C. C'est pourquoi il n'y a pas de CCG pour cela.
la source
Jetez un oeil à SDCC . Il prend en charge de nombreux périphériques PIC16 et PIC18. GCC prend en charge PIC24 et dsPIC.
la source
Les aspects les plus susceptibles d'être dépendants du compilateur sont:
Ma façon préférée de gérer cela est d'écrire des macros pour ces aspects et de demander au compilateur de sélectionner la macro appropriée en fonction des macros prédéfinies spécifiques au compilateur. J'ai fait une bibliothèque RFM70 et des exemples d'applications de cette façon qui fonctionnent sur PIC14 (HiTechC), PIC16 (C18) et ARM (GCC).
(mise à jour) Ma bibliothèque RFM70 est maintenant terminée. Il prend en charge C sur PIC 16F (compilateur Hitech), C et C ++ sur LPC11114 (Cortex) et LPC2148 (ARM7TDMI) (compilateur GCC) et Arduino (ATMega128, compilateur GCC). Ceci est généré (y compris la documentation doxygen) à partir de la même source en effectuant un prétraitement dans un script Python. Le support Jal est en cours de développement, peut-être que ProtonBasic suivra. http://www.voti.nl/rfm70
la source