MorphOS / Gestion d’une interruption
6 sujets de 1 à 6 (sur un total de 6)
-
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);
}
================================================
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);
}
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).
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