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

Lazarus Pascal Discussion :

Types incompatibles dans rpi-hal


Sujet :

Lazarus Pascal

  1. #1
    Membre éclairé
    Types incompatibles dans rpi-hal
    Bonjour à toutes et à tous,

    J'utilise l'unité "rpi_hal" pour gérer les GPIO sur mon Raspberry Pi 3B+ qui est un environnement 64 bits. Ce dernier a pour OS raspian Stretch et j'y utilise Lazarus 1.6.2

    Dans cet environnement, la ligne suivante ne me produit aucune erreur :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
          BeginThread(@isr_handler,@isr,isr.ThreadId);  // http://www.freepascal.org/docs-html/prog/progse43.html


    Maintenant sur mon PC 64 bits avec Ubuntu 18.0.4 et Lazarus 2.0.6, cela me produit l'erreur suivante :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    rpi_hal.pas(15793,31) Error: Incompatible type for arg no. 1: Got "<address of function(Pointer):LongInt;Register>", expected "<procedure variable type of function(Pointer):Int64;Register>"


    La fonction "isr_handler est définie comme suit :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    function isr_handler(p:pointer):longint; // (void *isr)


    Si, sur mon PC, je remplace longint par int64, ça compile, mais alors, ça provoque l'erreur sur mon Raspberry.

    Dois-je comprendre que Lazarus 1.6.2 attend des pointeurs 32 bits (bien que fonctionnant dans un environnement 64 bits) alors que Lazarus 2.0.6 attend des pointeurs 64 bits ?

    Quelle balise de compilation employer pour faire cette différence.

    Cordialement.

    Pierre.

  2. #2
    Membre expert
    Salut Pierre c'est surement du au fait que les versions de Lazarus ne sont pas les même (la déclaration de BeginThread à changer entre les 2), il peut aussi s'agir que la déclaration ne soit pas les même d'un processeur à l'autre "arm vs intel/amd" mais j'en doute vu que tes 2 environnement tournent en 64 bits. Ou bien il faudrait que ton unité ai besoin d'une petite mise à jour.

    sous ton raspi peux tu cliquer sur longint et regarder la déclaration de celui-ci et comparer avec ubuntu ?

    peut-être juste en rajoutant une commande préprocesseur dans l'unité

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      {$if lcl_fullversion > 1062000} //1080000 faudrait regarder à partir de quelle version le changement s'opère exactement
          {$IFDEF cpux86_64}
             function isr_handler(p : Pointer): Int64;
          {$ELSE}
             function isr_handler(p : Pointer): Longint;
          {$ENDIF}
      {$else}
            // a voir si une autre commande suivant le cpu est nécessaire ici
            function isr_handler(p : Pointer): Longint;
      {$ifend}


    A+

    Jérôme

    EDIT : Petites questions : la version 1.6.2 de Lazarus elle en 32 ou 64 bits ? car d'après cette page seul les CPU ARM 32 bits sont détectés. Es tu sure que ta Raspian Stretch est une version 64 bits ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Membre éclairé
    Citation Envoyé par BeanzMaster Voir le message
    ... EDIT : Petites questions : la version 1.6.2 de Lazarus elle en 32 ou 64 bits ? car d'après cette page seul les CPU ARM 32 bits sont détectés. Es tu sure que ta Raspian Stretch est une version 64 bits ?
    Merci pour le type de directive permettant de séparer les processeurs.

    Le Raspberry Pi 3B+ est bien muni d'un processeur 64 bits, mais je n'y avais pas pris garde, L'OS Raspbian Strecth est bien en 32 bits lui.

    Cordialement.

    Pierre

###raw>template_hook.ano_emploi###