IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Initialisation d'un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut Initialisation d'un tableau
    Bonjour,

    Je développe sur un microcontrôleur (STM32), et j'utilise une librairie fournie par ST pour établir une communication en LoRa. La question me semble plus d'ordre générale, je ne crée donc pas ce sujet dans la partie embarquée, mais n’hésitez pas à déplacer si nécessaire.
    J'ai accès aux sources de cette librairie, mais je souhaiterais dans la mesure du possible éviter de les modifier pour faciliter les mises à jour. Pour se connecter à un réseau LoRa, il est nécessaire de définir des identifiants propres à chaque carte éléctronique, dans un fichier utilisateur (que je peux modifier/remplacer), sous forme de #define. Ces defines sont ensuite utilisés par la libraire pour initialiser des variables utilisées à la connexion (les ID ci-dessous sont ceux par défaut, je les ai remplacé par les miens et je me connecte sans problème au réseau) :

    Commissioning.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    #define IEEE_OUI                                           0x01, 0x01, 0x01   
     
    #define LORAWAN_DEVICE_EUI                                 { IEEE_OUI, 0x01, 0x01, 0x01, 0x01, 0x01 }
     
    #define LORAWAN_JOIN_EUI                                  { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }
     
    #define LORAWAN_APP_KEY                                    { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
     
    #define LORAWAN_NWK_KEY                                    { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
    lora.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
    static uint8_t JoinEui[] = LORAWAN_JOIN_EUI;
    static uint8_t AppKey[] = LORAWAN_APP_KEY;
    static uint8_t NwkKey[] = LORAWAN_NWK_KEY;
    Je souhaite pouvoir définir ces identifiants en EEPROM, et j'ai donc créé une structure, qui va lire les identifiants au démarrage, si présent. L'idée est donc de modifier les define pour passer un pointeur vers ma structure. Actuellement, j'ai fait les modifications suivantes (qui fonctionnent) :

    Commissioning.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    #define LORAWAN_DEVICE_EUI                              config.radio.lora_credentials.dev_eui
     
    #define LORAWAN_JOIN_EUI                                  config.radio.lora_credentials.join_eui
     
    #define LORAWAN_APP_KEY                                   config.radio.lora_credentials.app_key
     
    #define LORAWAN_NWK_KEY                                  config.radio.lora_credentials.nwk_key
    lora.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static uint8_t *DevEui = LORAWAN_DEVICE_EUI;
    static uint8_t *JoinEui = LORAWAN_JOIN_EUI;
    static uint8_t *AppKey = LORAWAN_APP_KEY;
    static uint8_t *NwkKey = LORAWAN_NWK_KEY;
    Comme vous pouvez le voir, j'ai dû modifier le fichier lora.c, ce que je souhaiterai éviter. Si je le laisse comme précédemment, j'obtiens l'erreur "invalid initializer". Y a t'il une solution ?
    Dans le cas contraire, je créerais un patch avec git, mais ça n'est pas l'idéal.

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Si ces tableaux n'étaient déclarés static, tu aurais pu y accéder en les déclarant extern au sein de ton propre programme et écraser ce qu'ils contiennent avec tes propres valeurs au démarrage. Mais - et c'est compréhensible pour une bibliothèque publique - ils le sont, et si la bibliothèque ne fournit pas d'accesseur tu es dans l'obligation d'altérer son code. C'est certain que cela crée une tâche de maintenance qui peut être malvenue mais tu peux faire cela relativement proprement, par exemple en fournissant un fichier patch qui sera appliqué à une copie « clean » du code de la bibliothèque via un hook pré-build.

    La bibliothèque est-elle compilée séparément de ton projet ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    Bonjour et merci pour ta réponse.

    J'ai tenté plusieurs approches, et je me doutais bien que ce n'étais probablement pas possible, mais c'est toujours bien d'avoir un avis extérieur.

    La bibliothèque est compilée avec le projet, je vais rester sur ce que j'ai fait, avec un patch généré par git. Par contre, si ce fichier (lora.c) est modifié lors d'une MAJ de la librairie, le patch risque de ne plus fonctionner ?

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Évidemment oui il faut maintenir le patch à chaque mise à jour. À voir ce qu'il est possible d'implémenter en tests unitaires de ton côté ; peut-être en compilant la bibliothèque séparément, agrémentée d'un fichier source de ton cru ?

    En passant le type des pointeurs devrait probablement être uint8_t *const (voire const uint8_t *const) puisque l'adresse d'un tableau est fixe.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    Effectivement, ça devrait être des constantes. Il y a une différence entre uint8_t *const, const uint8_t *const et const uint8_t * ?

    Merci pour ton aide.

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    La position du mot-clef const par rapport à l'astérisque importe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    int i = 1337,
        j = -1;
     
    const int *p = &i; // données en lecture seule
    *p = j; // erreur !
    p = &j; // OK
     
    int const *q = &i; // totalement équivalent à l'écriture précédente
    *q = j; // erreur !
    q = &j; // OK
     
    int *const r = &i; // adresse en lecture seule
    *r = j; // OK
    r = &j; // erreur !
     
    const int *const s = &i; // données ET adresse en lecture seule
    *s = j; // erreur !
    s = &j; // erreur !
    Dans ton cas, l'écriture équivalente à la déclaration sous forme de tableau est uint8_t *const, puisque le contenu du tableau n'est pas déclaré en lecture seule mais sa position en mémoire est, par nature, constante.

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo