Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

PIC18_XC18_Pointeur de fonction sur 0x00



  1. #1
    amoniaque

    PIC18_XC18_Pointeur de fonction sur 0x00

    Bonjour,

    J'utilise un PIC18F14K50 et je compile avec XC18 1.20 sous mplabX 1.70.

    J'ai une fonction permettant d'enregistrer un appel de fonction suite à un délai ( Delay_Task_Register() ) qui a comme paramètre un pointeur de fonction :
    Code:
    u8 Delay_Task_Register( BOOLEAN Resettable, u16 Period, TaskCallback Pointer)
    .

    Lorsque j'enregistre une tâche, et que la fonction a appeler n'est pas utilisée ailleurs alors l'adresse de cette fonction est 0x00. Ce qui provoque un reset une fois appelée...
    Alors que si cette même fonction est utilisée ailleurs, l'adresse a une valeur cohérente et tout fonctionne bien.

    J'ai fait le test sous simulation mplabX et sur demo board.

    Vu que ça n'est pas clair, voici des screenshots pendant la simulation :
    Address0x00_Img1.png
    Address0x00_Img2.png

    Est ce que quelqu'un aurait déjà rencontré le même problème ?

    Merci par avance.

    -----


  2. Publicité
  3. #2
    Seb.26

    Re : PIC18_XC18_Pointeur de fonction sur 0x00

    Fais un "faux" appel à ta fonction ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  4. #3
    amoniaque

    Re : PIC18_XC18_Pointeur de fonction sur 0x00

    C'est à dire ?

    Parce que là c'est une fonction, et je n'en n'aurai pas qu'une :-/.

  5. #4
    Seb.26

    Re : PIC18_XC18_Pointeur de fonction sur 0x00

    Citation Envoyé par amoniaque Voir le message
    C'est à dire ?
    Parce que là c'est une fonction, et je n'en n'aurai pas qu'une :-/.
    Si j'ai tout compris :
    ton pb vient du fait que le compilo/linker remplace l'adr de ta fonction par 0x00 quand cette fonction n'est pas appelée ailleurs.

    Donc si tu appèle ta fonction l'adr sera OK, non ? ... donc force un appel à ta fonction ... mais comme t'as pas forcement envie que ta fonction soit exécutée, tu fais un truc genre :
    Code:
    ...
    main()
    ...
    {
      char a;
      char b;
    
      a=0;
      b=a+1;
    
      if( a==b)
      {
        ma_fonction(); // ne sera jamais exécuté mais le linker l'ignore
      }
    ...
    }
    le hic sera de trouver un truc suffisamment sioux pour que je compilo n'y voit que du feu (car a ne sera jamais == à b dans mon exemple).
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  6. #5
    amoniaque

    Re : PIC18_XC18_Pointeur de fonction sur 0x00

    La solution est bonne, enfin elle marche.
    Je voulais faire ça sans passer par un morceau de scotch du genre mais bon ...

    Je pense que le soucis peut être régler de manière plus "conventionnel" mais pour le moment ça ira bien comme ça.

    Merci !

  7. A voir en vidéo sur Futura
  8. #6
    RISC

    Re : PIC18_XC18_Pointeur de fonction sur 0x00

    Salut Amoniaque,

    Du au changement de format des fichiers de debug (plus évolué), il est recommandé d'utiliser MPLAB X >= v1.85 avec le XC8 v1.20 ;=)

    a+
    Ma marotte ? les microcontrôleurs ;=)

  9. Publicité
  10. #7
    amoniaque

    Re : PIC18_XC18_Pointeur de fonction sur 0x00

    Salut RISC,

    Et... Ça ne change rien .
    Mais au moins je suis à jour .

    A+

  11. #8
    RISC

    Re : PIC18_XC18_Pointeur de fonction sur 0x00

    Salut,

    Je n'ai pas dit que cela changerait quelque chose dans ton programme, par contre , si tu debogues, tu verras la différence dans la fenêtre WATCH (en particulier si tu utilises des pointeurs).

    a+

    PS : attention aux broches D+/D- sur le PIC18F14K50, elles sont TRES piegeuses....si JAMAIS tu travailles en Vdd = 5V, il faut absolument utiliser un adaptateur de programmation (AC164114) / debug (AC244223 ) car ces broches ne doivent en aucun cas excéder 3.6V (spec USB). Si tu utilises Vdd = 5V, l'outil de programmation (Pickit3, ICD3,...) envoie donc des signaux 5V...ce qui fragilise /endommage les broches D+/D- car elles sont partagées avec les broches PGC / PGD....
    Ma marotte ? les microcontrôleurs ;=)

  12. #9
    amoniaque

    Re : PIC18_XC18_Pointeur de fonction sur 0x00

    Citation Envoyé par RISC Voir le message
    Salut,

    Je n'ai pas dit que cela changerait quelque chose dans ton programme, par contre , si tu debogues, tu verras la différence dans la fenêtre WATCH (en particulier si tu utilises des pointeurs).

    a+
    Pas encore vu le changement mais ça ne saurait tarder.

    PS : attention aux broches D+/D- sur le PIC18F14K50, elles sont TRES piegeuses....si JAMAIS tu travailles en Vdd = 5V, il faut absolument utiliser un adaptateur de programmation (AC164114) / debug (AC244223 ) car ces broches ne doivent en aucun cas excéder 3.6V (spec USB). Si tu utilises Vdd = 5V, l'outil de programmation (Pickit3, ICD3,...) envoie donc des signaux 5V...ce qui fragilise /endommage les broches D+/D- car elles sont partagées avec les broches PGC / PGD....
    Merci du conseil, surtout que j'utilise du PIC18F et pas LF donc en effet je balance du 5V lors de la prog'...
    La doc le spécifie en plus, Vusb+0.3V max ...

  13. #10
    cherwam07

    Re : PIC18_XC18_Pointeur de fonction sur 0x00

    Salut,

    La doc du compilateur dit ca :
    Unused functions in a program are removed. A function is considered unused if it is
    not called, directly or indirectly, nor has had its address taken. The entire
    function is removed, as if it was never present in the original source code. No
    code will be produced for it and you will not be able to set a breakpoint on
    any line in the function in the debugger.
    Referencing a function’s assembly-domain symbol in a separate hand-written assembly module will prevent it being removed. The assembly code
    need only use the symbol in the GLOBAL directive.
    C'est assez bizarre du coup car ta fonction est censée est considérée comme "used". Mais bon il peut y avoir des bugs dans tous les outils.

    Tu peux tenter de faire ce qui est proposé qui est :
    - Créer un fichier .asm que tu ajoutes à ton projet.
    - Réferencer le symbole de ta fonction dans ce fichier avec la directive GLOBAL
    Code:
        GLOBAL function1, function2

  14. #11
    amoniaque

    Re : PIC18_XC18_Pointeur de fonction sur 0x00

    Salut,

    Citation Envoyé par cherwam07 Voir le message
    - Réferencer le symbole de ta fonction dans ce fichier avec la directive GLOBAL
    Code:
        GLOBAL function1, function2
    Ça marche comme il faut .

    Merci beaucoup.

    A+

Sur le même thème :

Discussions similaires

  1. dm sur fonction
    Par owen97 dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 06/01/2013, 20h15
  2. DM sur fonction
    Par maths19 dans le forum Mathématiques du supérieur
    Réponses: 38
    Dernier message: 15/12/2012, 19h30
  3. Besoin d'aide sur Exercice sur les lilmites d'une fonction
    Par Myleneeeeeeeeeeeeee dans le forum Mathématiques du collège et du lycée
    Réponses: 5
    Dernier message: 07/11/2012, 18h44
  4. fonction e^ix ou fonction definie sur C
    Par antberkik dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 25/12/2010, 13h05
  5. erreur 0X00 programmation PIC plus questions sur les PIC
    Par ROTT dans le forum Électronique
    Réponses: 4
    Dernier message: 22/07/2007, 14h36