[Programmation] Microcontroleur - Questions sur les bonnes pratiques directives de preprocesseurs
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Microcontroleur - Questions sur les bonnes pratiques directives de preprocesseurs



  1. #1
    ATdevice

    Microcontroleur - Questions sur les bonnes pratiques directives de preprocesseurs


    ------

    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 :
    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 */
    uart.h :
    Code:
    #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 */
    Le résultat attendu serait que tout ce que je définis dans HardwareProfile écrase les valeurs par défaut, donc

    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

    -----

  2. #2
    Vincent PETIT
    Animateur Électronique

    Re : Microcontroleur - Questions sur les bonnes pratiques directives de preprocesseurs

    Bonjour,
    A titre perso, je ferai dans le main.h qui sera appelé en dernier dans le main.c ou dans le main.c après avoir appelé les fichiers entêtes .h
    Code:
    #ifdef UART1_RX_FIFO_SIZE
    #undef UART1_RX_FIFO_SIZE
    #define UART1_RX_FIFO_SIZE                    256
    #endif

    Je n'ai pas essayé mais de prime abord je dirai qu'il faut déclarer le plus tard possible les directives que tu souhaites
    Là où il n'y a pas de solution, il n'y a pas de problème.

  3. #3
    ATdevice

    Re : Microcontroleur - Questions sur les bonnes pratiques directives de preprocesseurs

    Je suis pas spécialement fan de déclarer dans "main.h", le but du "HardwareProfile.h" c'est justement de grouper tous les paramètres relatifs au hardware pour le projet courant.

    J'ai déplacé certaines déclarations dans "uart.c" pour tester, ça fonctionne mais est-ce que c'est une bonne chose d'avoir des déclarations dans des fichiers ".c"?

    J'attends vos recommendantions avant d'appliquer les changements à tous mes fichiers (I2C, SPI, ADC...) j'en ai une pile ^^

    uart.h :
    Code:
    #ifndef UART_H
    #define UART_H
    
    /*** Includes ***/
    
    // No dependencies
    
    /*** 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
    
    #endif /* UART_H */
    uart.c :
    Code:
    /*** Includes ***/
    
    // Common includes
    #include "HardwareProfile.h"
    // Peripherals includes
    #include "uart.h"
    
    /*** Define UART default Rx and Tx buffer size ***/
    
    #if(UART_NUM>=1)
    #ifndef UART1_RX_FIFO_SIZE
    #define UART1_RX_FIFO_SIZE          16
    #endif
    #ifndef UART1_TX_FIFO_SIZE
    #define UART1_TX_FIFO_SIZE          16
    #endif
    #endif
    
    #if(UART_NUM>=2)
    #ifndef UART2_RX_FIFO_SIZE
    #define UART2_RX_FIFO_SIZE          16
    #endif
    #ifndef UART2_TX_FIFO_SIZE
    #define UART2_TX_FIFO_SIZE          16
    #endif
    #endif
    
    #if(UART_NUM>=3)
    #ifndef UART3_RX_FIFO_SIZE
    #define UART3_RX_FIFO_SIZE          16
    #endif
    #ifndef UART3_TX_FIFO_SIZE
    #define UART3_TX_FIFO_SIZE          16
    #endif
    #endif
    
    #if(UART_NUM>=4)
    #ifndef UART4_RX_FIFO_SIZE
    #define UART4_RX_FIFO_SIZE          16
    #endif
    #ifndef UART4_TX_FIFO_SIZE
    #define UART4_TX_FIFO_SIZE          16
    #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
    HardwareProfile.h (modification au niveau de la ligne 39) :
    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
    #define UART1_IRQ_PRIORITY                              7 // Priority: 7=highest, 1=lowest
    
    #endif /* HARDWARE_PROFILE_H */
    Dernière modification par ATdevice ; 17/11/2021 à 16h07.

Discussions similaires

  1. Règles et bonnes pratiques de raccordement d'étanchéité sur ITE
    Par invite648870f1 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 8
    Dernier message: 25/11/2019, 22h56
  2. Bonnes pratiques pour la détermination d'un titre
    Par invite41dc3dcb dans le forum Chimie
    Réponses: 1
    Dernier message: 03/10/2015, 21h53
  3. Routage CI : quelles sont les règles et bonnes pratiques
    Par pouic92 dans le forum Électronique
    Réponses: 1
    Dernier message: 02/05/2013, 08h46
  4. Bonnes pratiques pour tuber un conduit dévoyé ?
    Par invitef2d75a77 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 17
    Dernier message: 09/12/2009, 19h11
  5. [Biochimie] Duplicates selon les bonnes pratiques de laboratoire
    Par invitecc2a5091 dans le forum Biologie
    Réponses: 6
    Dernier message: 02/10/2008, 13h01
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...