[Programmation] Grand tableau PIC24
Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

Grand tableau PIC24



  1. #1
    pucpood

    Grand tableau PIC24


    ------

    Bonjour,

    Pour situer mon niveau : j'ai fait de la programmation bas niveau en assembleur 68000 et 8086 pendant mes études il y a plus 20 ans (ça fait mal...).
    J'ai repris en 2022 avec un projet sur PIC24FJ1024GB610. Voilà.
    Après avoir trouvé des sujets qui tournent autour du pot, je n'ai toujours pas les idées claires sur la gestion de la RAM sur mon PIC. Soit les sujets ne traitent pas exactement mon cas, soit c'est en Anglais et ma compréhension reste approximative.

    Dans mon programme en C, je déclare en global un tableau :
    Code:
    char dummyElements [150][19]; //150 chaînes de 18 caractères
    Ça compile sans problème. Mais lorsque je remplis le tableau ça plafonne à compteur = 26 :
    Code:
    for ( compteur = 0 ; compteur < 150 ; compteur ++)
        nbEcrits = sprintf (dummyElements [compteur], "%03d", compteur);
    L'exécution se déroule sans plantage (par un coup de chance ?) et nbEcrits a toujours la bonne valeur.

    J'ai essayé :
    Code:
    __eds__ char dummyElements [150][19] __attribute__ ((eds, page)); // même comportement sans le 'page'
    mais ça plante à la compilation sur :
    Code:
    sprintf (dummyElements [compteur], "%03d", compteur);
    error: passing argument 1 of 'sprintf' from pointer to non-enclosed address space
    J'imagine que sprintf n'a pas le droit d'accéder à l'espace mémoire où a été installé le tableau ...

    Comment allier la place pour un tel tableau avec une possibilité d'accès "universelle" ?

    Merci de l'éclairage que vous pourrez m'apporter.

    Laurent

    -----

  2. #2
    Vincent PETIT
    Animateur Électronique

    Re : Grand tableau PIC24

    Bonjour,
    dummyElements est un tableau à 2 dimensions.
    Code:
    char dummyElements [150][19]
    Il faut l'utiliser en précisant la 2ème dimension, les colonnes. Par exemple pour remplir les 150 premières lignes de la colonne 0 il faut faire ça :

    Code:
    for ( compteur = 0 ; compteur < 150 ; compteur ++)
        nbEcrits = sprintf (dummyElements [compteur][0], "%03d", compteur);
    Là où il n'y a pas de solution, il n'y a pas de problème.

  3. #3
    umfred

    Re : Grand tableau PIC24

    non, le code fonctionne bien, si on précise la 2nde dimension, on ne remplit qu'un caractère, or avec le sprintf, on en écrit 3.

    @pucpood comment tu arrives à déterminer que ça bloque à compteur = 26 ?
    Est-ce qu'il y a des warning à la compilation ? si oui, voir si ces warnings sont en relation avec ce tableau
    Tu utilises quel compilateur C ? XC16 de Microchip ?

  4. #4
    pucpood

    Re : Grand tableau PIC24

    Vincent PETIT à dit :

    Il faut l'utiliser en précisant la 2ème dimension, les colonnes. Par exemple pour remplir les 150 premières lignes de la colonne 0 il faut faire ça :
    for ( compteur = 0 ; compteur < 150 ; compteur ++)
    nbEcrits = sprintf (dummyElements [compteur][0], "%03d", compteur);
    Merci de ta réponse.
    Dans mon cas ce n'est pas un élément unique que j'insère dans le tableau, mais une chaîne (une suite de char), c'est pourquoi la "colonne" n'est pas indiquée. D'ailleurs lorsqu'avec MPLab je fais un Watch du tableau, le début se passe très bien, les adresses des différents éléments du tableau sont parfaitement cohérentes et le contenu bien en place.
    Nom : LargeArray.jpg
Affichages : 136
Taille : 186,6 Ko
    A noter que pour cet essai j'ai réduit la voilure à [95][3].

  5. A voir en vidéo sur Futura
  6. #5
    pucpood

    Re : Grand tableau PIC24

    Eh bien justement, avec mon Watch. arrivé au dummyElements[27] je n'ai plus que des \\0\\0\\0\\0\\0\\0\\0\\0\\0\\0 \\0\\0\\0.
    Mais aucun problème ne se manifeste à l'exécution.

  7. #6
    pucpood

    Re : Grand tableau PIC24

    Eh bien justement, avec mon Watch. arrivé au dummyElements[27] je n'ai plus que des \\0\\0\\0\\0\\0\\0\\0\\0\\0\\0 \\0\\0\\0.
    Mais aucun problème ne se manifeste à l'exécution. Et aucun warning.
    Oui j'utilise le XC16 avec MPlabX v6.15
    Dernière modification par pucpood ; 21/11/2023 à 13h42.

  8. #7
    umfred

    Re : Grand tableau PIC24

    Je ne sais plus si c'est faisable mais si tu ajoutes un watch directement sur dummyElements[50] par exemple, est-ce qu'il te donne aussi 0 ou 50?
    Dernière modification par umfred ; 21/11/2023 à 14h20.

  9. #8
    pucpood

    Re : Grand tableau PIC24

    D'abord merci de ta contribution.
    Tout est à 0 à partir de [27] (avec dummyElements [150][19]).
    A noter que dans le Watch, le tableau est séparé en 2 : de 0 à 99, puis de 100 à 149 .

  10. #9
    Seb.26

    Re : Grand tableau PIC24

    il n'y aurait pas une histoire de "far pointers" avec le compilo ?
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #10
    pucpood

    Re : Grand tableau PIC24

    Il y a pas mal de choses autour du sujet : du 'far,' du 'near', du 'eds', du 'page' et bien d'autres, mais je suis perdu dans tout ça justement.
    Actuellement je tourne avec dummyElements[95][3] et ça passe.
    Dernière modification par pucpood ; 21/11/2023 à 15h48.

  12. #11
    Seb.26

    Re : Grand tableau PIC24

    Tu as défini ton tableau avec __eds__ ?

    https://microchipdeveloper.com/xwiki.../d-memory/eds/
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  13. #12
    pucpood

    Re : Grand tableau PIC24

    j'ai trouvé _eds_ dans des docs Microchip et j'ai essayé pour voir ce que ça donnait en me disant qu'il y avait peut-être plus de place dans cette zone. Mais ça coince à la compilation sur le sprintf () .
    Dernière modification par pucpood ; 21/11/2023 à 15h58.

  14. #13
    pucpood

    Re : Grand tableau PIC24

    Hello !
    Je connaissais cette doc, mais en la relisant j'ai compris que passer par un pointeur adéquat pouvait être la solution (__eds__ char *). Mais ça ne change rien : mon sprintf n'en veut toujours pas.
    Merci @Seb.26 pour cette piste toutefois intéressante.

  15. #14
    DAT44

    Re : Grand tableau PIC24

    Bonjour,
    le compilateur doit être pacifiste, il n'aime pas les colonnes de char ...

    Je sors ...

  16. #15
    Seb.26

    Re : Grand tableau PIC24

    Sinon, la solution BD (Bidouille Degueullasse) ...
    Tu prends Excell et tu lui fais générer une fonction avec un gros switch qui te renvoie directement le pointeur vers le char*

    genre :

    Code:
    char* monCompiloEstUnCon( uint8_t indice )
    {
      static char[19] str000;
      static char[19] str001;
      static char[19] str002;
    ...
      static char[19] str149;
    
      switch(indice)
      {
        case 0:
          return str000;
        case 1:
          return str001;
    ...
        case 149:
          return str149;
        default:
          return null;
      }
    }
    normalement tu ne devrais plus avoir de soucis (autre que d'arriver à dormir avec une solution si peu satisfaisante).
    Dernière modification par Seb.26 ; 22/11/2023 à 10h16. Motif: grrr
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  17. #16
    umfred

    Re : Grand tableau PIC24

    Est-ce tu as testé en mettant un espion sur par exemple dummyElements[50] comme j'avais demandé plus haut (dans la fenêtre variable peut-être) ?

    As-tu fais un test logiciel de valeur ? par exemple activer une sortie selon la valeur:
    Code:
    int test = strncmp(dummyElements[50],"051",3);
    if(test>0){
         // activer une sortie 1 si la chaine est "supérieure" à "051"
    }else if (test<0) {
        //activer une sortie 2  si la chaine est "inférieure" à "051"
    }else{
        //activer une sortie 3  si la chaine est "égale" à "051"
    }

  18. #17
    pucpood

    Re : Grand tableau PIC24

    Parce que tu penses je ne peux pas me fier à la fenêtre Watches de MPLab ? Elle indique bien '\0' .

  19. #18
    umfred

    Re : Grand tableau PIC24

    Tout à fait, on n'est pas à l'abri d'un bug d'affichage.
    Au moins, le test permettra de lever le doute potentiel ou de confirmer le problème.
    J'ai fait un test avec la version en ligne de mplab (mplab xpress) et bien qu'il m'affiche du 0, si je demande à voir la valeur d'un des octets, cette valeur est bonne dans la fenêtre variable. (dummyElements[50][0]=>"0";dummyElements[50][1]=>"5";dummyElements[50][2]=>"0"; )
    PS: Mettre "050" dans le code au dessus, si on commence à 0 (je me suis un peu mélangé sur les valeurs)

  20. #19
    pucpood

    Re : Grand tableau PIC24

    @umfred ! Je fais trop confiance aux outils, le tableau se remplissait bel et bien !!
    Mon problème de départ est résolu ... puisqu'il n'y en avait pas ! Mais du coup je ne sais toujours pas comment tirer parti d'un stockage dans l'EDS malgré l'aide de @Clodine sur Fantaspic.

  21. #20
    Seb.26

    Re : Grand tableau PIC24

    gloire aux Shadoks, ils avaient une fois de plus raison !

    « S'il n'y a pas de solution, c'est qu'il n'y a pas de problème. »
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

Discussions similaires

  1. Tableau maconnerie trop grand pour porte d'entrée.
    Par ivanstosic dans le forum Bricolage et décoration
    Réponses: 1
    Dernier message: 31/10/2015, 20h49
  2. Deverouiller RPINR sur pic24
    Par touf26 dans le forum Électronique
    Réponses: 2
    Dernier message: 25/10/2012, 12h58
  3. [PIC24] - Configuration Oscillateur
    Par invite3c35244f dans le forum Électronique
    Réponses: 2
    Dernier message: 03/09/2012, 16h13
  4. grand tableau dans Latex.
    Par invite1e249011 dans le forum Programmation et langages, Algorithmique
    Réponses: 47
    Dernier message: 27/07/2012, 19h36
  5. un grand tableau
    Par invite71317231 dans le forum Électronique
    Réponses: 13
    Dernier message: 26/01/2011, 19h13
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...