[Programmation] MPLAB X v3.61 : "glitch" sur variable passée en argument d'une fonction
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

MPLAB X v3.61 : "glitch" sur variable passée en argument d'une fonction



  1. #1
    inviteb565bafd

    MPLAB X v3.61 : "glitch" sur variable passée en argument d'une fonction


    ------

    Bonjour,

    J'utilise MPLAB X v3.61 et XC16 3.31 (version gratuite) et je rencontre un problème de variable qui devient aléatoire alors qu'elle est passée en argument d'une fonction.

    - Déclaration de la fonction :
    Code:
    INT32 loadDataArray(UINT8 arrayID, UINT16 dotNumber, UINT16*outBuffer)
    {
      UINT16 index = 0;
      for(index = 0; index < dotNumber; index++)
        {
          outBuffer[index] = EEPROM_readWord(arrayStartAddress[arrayID] + (index*2));
        }
      return 0;
    }
    - Utilisation :
    Code:
    #define MY_ARRAY 0
    #define ARRAY_DOTS 500
    
    UINT16 arrayStartAddress[2]={
    1000,
    2000
    };
    
    UINT16 myBuffer[500];
    
    loadDataArray(MY_ARRAY, ARRAY_DOTS, myBuffer);
    J'avais d'énormes erreurs de lecture dans l'EEPROM, alors que la lecture occasionnelle d'un byte ou word ne posait aucun problème (donc EEPROM OK).
    En mettant des retours un peu partout, il s'avère que la variable "dotNumber" n'était pas de 500 comme définie par ARRAY_DOTS, mais quelque chose comme 23000, ce qui créait bien sur un overflow et un buffer rempli de 0x00 et 0xFF.

    J'ai pu "rafistoler" ma fonction en utilisant une variable intermédiaire déclarée en local, mais c'est dégueulasse et je retrouve ce type d'erreurs dans plusieurs projets...
    Code:
    INT32 loadDataArray(UINT8 arrayID, UINT16 dotNumber, UINT16*outBuffer)
    {
    UINT16 dotNum=dotNumber;
      UINT16 index = 0;
      for(index = 0; index < dotNum; index++)
        {
          outBuffer[index] = EEPROM_readWord(arrayStartAddress[arrayID] + (index*2));
        }
      return 0;
    }
    Et là je retrouve bien "dotNum=500"
    Est-ce que quelqu'un a déjà rencontrer ce type d'erreurs? Je ne trouve aucune explication et assez c'est difficile à détecter, et pénible... (j'ai l'impression que c'est de plus en plus récurrent avec la version gratuite du compilateur).

    Merci

    -----

  2. #2
    Vincent PETIT
    Animateur Électronique

    Re : MPLAB X v3.61 : "glitch" sur variable passée en argument d'une fonction

    Salut,
    C'est un problème d'optimisation. Étant donné que ARRAY_DOTS est une directive du préproceseur, une fois que le compilateur va le remplacer par la valeur 500 dans tout le programme, il va se rendre compte que cette valeur ne sert à rien dans le programme.

    Le passage d'un argument dans une fonction relève de la compilation alors que la directive relève du préproceseur (qui ne va pas faire le passage en paramètre dans la fonction) il va juste remplacer le mot ARRAY_DOTS par 500 c'est tout.

    Il ne faut pas se servir d'une directive de cette manière.
    Là où il n'y a pas de solution, il n'y a pas de problème.

  3. #3
    jls28

    Re : MPLAB X v3.61 : "glitch" sur variable passée en argument d'une fonction

    Bonjour,

    je trouve les commentaires de Vincent peu convaincants;

    la seule erreur que je trouve c'est que :

    si la fonction est définie
    INT32 loadDataArray(UINT8 arrayID, UINT16 dotNumber, UINT16*outBuffer);

    il serait plus exact de lui passer le buffer comme ceci :
    &myBuffer[0]

    ou bien sinon on peut aussi définir la fonction comme ceci:
    INT32 loadDataArray(UINT8 arrayID, UINT16 dotNumber, UINT16 outBuffer[]);

    du point de vue du code généré, les deux solutions sont équivalentes

  4. #4
    RISC

    Re : MPLAB X v3.61 : "glitch" sur variable passée en argument d'une fonction

    Salut,
    quel PIC/dsPIC utilises-tu ?
    Ils 'nont généralement pas beaucoup de RAM et tu sembles déclarer de très gros tableaux...
    a+

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Différences entre "uniforme" et "varying" variable (GLSL)
    Par invite1b8cbfb5 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 14/01/2017, 17h18
  2. [MPLAB] Problème "out of bounds" fenêtre "WATCH"
    Par invite8a011b82 dans le forum Électronique
    Réponses: 4
    Dernier message: 22/08/2012, 12h47
  3. Matlab: fonction "filter" --> le signal est "retourné" --> pourquoi ?
    Par invitea29b3af3 dans le forum Électronique
    Réponses: 1
    Dernier message: 21/11/2011, 09h24
  4. Pour en finir avec l'argument : "la technologie du futur ..." !
    Par invitebd2b1648 dans le forum Discussions scientifiques
    Réponses: 126
    Dernier message: 25/10/2010, 21h21
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...