MorphOS / Gestion d’une interruption

6 sujets de 1 à 6 (sur un total de 6)

  • glames

      #5591

      Bonjour, [édité pour retirer les ajoutés par Sputnik ;-)]

      Je vous joins un exemple de code d’interruption qui ne fonctionne pas

      sur mon Peg2/MorphOS.

      Les messages « Initialisation de l’interruption » et « Activation de

      l’interruption » sont affichés, ce qui semble indiquer que

      l’instruction AddTimerInt et StartTimerInt fonctionnent.

      Par contre, on ne sort pas de la boucle « while », ce qui semble

      indiquer que:

      – soit l’interruption n’est pas exécutée,

      – soit mon paramètre b_quitter n’est pas mis à jour.

      Qu’en pensez-vous?

      [Le même source fonctionne sous OS4]

      Merci d’avance de vos remarques/réponses/tests.

      Glames

      ==============================================================

      #include

      #include

      #include

      /***** Prototypes ********************************************************/

      ULONG AffMsg(int *is_data);

      /***** Variables globales ************************************************/

      struct Library *LowLevelBase; /* Low level */

      /* Fonction */

      int main(void)

      {

      /* Variables locales */

      APTR p_idfInterrupt;

      int b_quitter; /* Quitter l’application */

      /* Initialisations */

      b_quitter=FAUX;

      /* Ouvertures bibliothèques */

      LowLevelBase = OpenLibrary(« lowlevel.library »,0);/* librairie lowlevel (bas-niveau) */

      /* Initialisation de l’interruption */

      p_idfInterrupt=AddTimerInt(AffMsg,&b_quitter);

      if (p_idfInterrupt)

      {

      printf(« Initialisation de l’interruptionn »);

      /* Démarrage de l’interruption */

      StartTimerInt(p_idfInterrupt, 10000L, FALSE);

      printf(« Activation de l’interruptionn »);

      /* Attente interruption */

      while (b_quitter==FAUX)

      {

      }

      printf(« Fin de l’attente grâce à AffMsg appelée par interruptionn »);

      /* Arrêt de l’interruption */

      StopTimerInt(p_idfInterrupt);

      /* Libération de l’interruption */

      RemTimerInt(p_idfInterrupt);

      }

      else

      printf(« Can’t init timer interruptn »);

      //Fermeture bibliothèque

      CloseLibrary(LowLevelBase);

      }

      ULONG AffMsg(int *is_data)

      {

      (*is_data)=VRAI;

      return(0);

      }

      ================================================

      glames

        #93568

        J’ai ajouté un printf dans la fonction AffMsg, ce qu’il ne faut pas faire pour cause de plantage mais cela m’a permis de voir que ça ne plantait pas : donc la fonction ne semble jamais appelée.

        henes

          #93569

          Version corrigée :

          #include

          #include

          #include

          #include

          /***** Prototypes ********************************************************/

          ULONG AffMsg(void);

          /***** Variables globales ************************************************/

          struct Library *LowLevelBase; /* Low level */

          struct EmulLibEntry AffMsg_Gate = {TRAP_LIB, 0, (void *)AffMsg};

          /* Fonction */

          int main(void)

          {

          /* Variables locales */

          APTR p_idfInterrupt;

          volatile int b_quitter; /* Quitter l'application */

          /* Initialisations */

          b_quitter=0;

          /* Ouvertures bibliothèques */

          LowLevelBase = OpenLibrary("lowlevel.library",0);/* librairie lowlevel (bas-niveau) */

          /* Initialisation de l'interruption */

          p_idfInterrupt=AddTimerInt(&AffMsg_Gate,(APTR)&b_quitter);

          if (p_idfInterrupt)

          {

          printf("Initialisation de l'interruptionn");

          /* Démarrage de l'interruption */

          StartTimerInt(p_idfInterrupt, 10000L, 0);

          printf("Activation de l'interruptionn");

          /* Attente interruption */

          while (b_quitter==0)

          {

          }

          printf("Fin de l'attente grâce à AffMsg appelée par interruptionn");

          /* Arrêt de l'interruption */

          StopTimerInt(p_idfInterrupt);

          /* Libération de l'interruption */

          RemTimerInt(p_idfInterrupt);

          }

          else

          printf("Can't init timer interruptn");

          //Fermeture bibliothèque

          CloseLibrary(LowLevelBase);

          }

          ULONG AffMsg(void)

          {

          int *is_data = (int *)REG_A1;

          (*is_data)=1;

          return(0);

          }

          henes

            #93570

            Il y avait trois problèmes :

            – AffMsg() appelé en mode 68k alors que le tout est PPC

            – AffMsg() qui ne prenait pas son argument depuis le registre a1

            – b_quitter qui n’était pas volatile et donc while(b_quitter==0) était sans doute optimisé en while(1)

            Edit: il manque un if(LowLevelBase) aussi

            Edit2: en fait, je pense que cela plantait bien avec ta version au moment où AffMsg() était appelé en mode 68k… vérifie ton log (console, port série ou buffet ramdebug suivant ta config).

            glames

              #93571

              Henes,

              Merci beaucoup pour ta réponse rapide et précise!

              Génial.

              Je teste tout ça et te tient au courant.

              Glames

              glames

                #93572

                Salut Henes,

                ça marche comme attendu!

                Merci encore :-)

                Glames

              6 sujets de 1 à 6 (sur un total de 6)

              • Vous devez être connecté pour répondre à ce sujet.

              Forums AmigaOS, MorphOS et AROS Développement MorphOS / Gestion d’une interruption

              Amiga Impact