Bonjour,
Je suis en train de reprendre pas mal de programmes, notamment des bibliothèques de périphériques et de composants pour les familles de microcontrôleur Microchip PIC24.
Ma question concerne les bonnes pratiques d'utilisation des directives préprocesseurs, car j'ai apporté des modifications pour automatiser certaines déclarations mais j'ai des soucis avec les priorités de #ifndef notamment
Pour donner un exemple, j'ai des "conflits" entre mon fichier HardwareProfile.h et uart.h dont voici les extraits de code :
HardwareProfile.h :
uart.h :Code:#ifndef HARDWARE_PROFILE_H #define HARDWARE_PROFILE_H /*** Includes ***/ // Common includes #include <xc.h> #include <stdio.h> #include <stdlib.h> #include <string.h> // Peripherals includes #include "uart.h" // Modules includes #include "uLCD.h" /*** Peripherals ***/ // UART1 - uLCD #define UART1_BAUDRATE 115200UL #define UART1_USE_BRGH 1 #define UART1_RX_FIFO_SIZE 256 #define UART1_TX_FIFO_SIZE 256 #define UART1_RX_TRIS _TRISE3 #define UART1_RX_IN _RE3 #define UART1_RX_PDEN _CNPDE3 #define UART1_RX_RPIN 83 #define UART1_TX_TRIS _TRISE2 #define UART1_TX_OUT _LATE2 #define UART1_TX_RPOUT _RP82R /*** Components and Modules ***/ // uLCD serial display #define uLCD_1_UART UART1_PERIPH // Declared in "uart.h" #define uLCD_1_BAUDRATE UART1_BAUDRATE /*** Interrupts ***/ // UART1 IRQ Priority #ifdef UART1_IRQ_PRIORITY #undef UART1_IRQ_PRIORITY #define UART1_IRQ_PRIORITY 7 // Priority: 7=highest, 1=lowest #endif #endif /* HARDWARE_PROFILE_H */
Le résultat attendu serait que tout ce que je définis dans HardwareProfile écrase les valeurs par défaut, doncCode:#ifndef UART_H #define UART_H /*** Includes ***/ // Standard includes #include <stdio.h> #include <string.h> // Common includes #include "HardwareProfile.h" /*** Calculate UART peripheral number ***/ #define UART_NUM 1 // Minimum UART periph number is 1 #ifdef _U1MD #undef UART_NUM #define UART_NUM 1 #endif #ifdef _U2MD #undef UART_NUM #define UART_NUM 2 #endif #ifdef _U3MD #undef UART_NUM #define UART_NUM 3 #endif #ifdef _U4MD #undef UART_NUM #define UART_NUM 4 #endif /*** Define UART peripherals ***/ #if(UART_NUM>=1) #define UART1_PERIPH 0 #endif #if(UART_NUM>=2) #define UART2_PERIPH 1 #endif #if(UART_NUM>=3) #define UART3_PERIPH 2 #endif #if(UART_NUM>=4) #define UART4_PERIPH 3 #endif /*** Define UART default Rx and Tx buffer size ***/ #if(UART_NUM>=1) #ifndef UART1_RX_FIFO_SIZE #define UART1_RX_FIFO_SIZE 32 #endif #ifndef UART1_TX_FIFO_SIZE #define UART1_TX_FIFO_SIZE 32 #endif #endif /*** Define UART default IRQ priority to lowest ***/ #if(UART_NUM>=1) #ifndef UART1_IRQ_PRIORITY #define UART1_IRQ_PRIORITY 1 // Priority: 7=highest, 1=lowest #endif #endif #if(UART_NUM>=2) #ifndef UART2_IRQ_PRIORITY #define UART2_IRQ_PRIORITY 1 // Priority: 7=highest, 1=lowest #endif #endif #if(UART_NUM>=3) #ifndef UART3_IRQ_PRIORITY #define UART3_IRQ_PRIORITY 1 // Priority: 7=highest, 1=lowest #endif #endif #if(UART_NUM>=4) #ifndef UART4_IRQ_PRIORITY #define UART4_IRQ_PRIORITY 1 // Priority: 7=highest, 1=lowest #endif #endif #endif /* UART_H */
UART1_RX_FIFO_SIZE = 256
UART1_TX_FIFO_SIZE = 256
UART1_IRQ_PRIORITY = 7
Sauf que c'est l'inverse qui se produit.
Si je commente #include "uart.h", les valeurs sont bonnes, mais j'ai une erreur de compilation dans HardwareProfile.h à cause de UART1_PERIPH qui apparaît comme non déclaré (ligne 34)
Du coup je ne sais pas si je dois déplacer des directives de uart.h dans uart.c pour éviter ce problème, car j'aimerais que mes bibliothèques soient propres et qu'il n'y ait pas de "crosstalk" entre les headers
-----