2009-04-10 17 views
2

J'écris une structure pour un périphérique intégré qui a la capacité d'exécuter plusieurs applications. Lorsque vous passez d'une application à l'autre, comment puis-je m'assurer que l'état de mon application actuelle est correctement nettoyé? Par exemple, disons que je parcours une boucle intensive dans une application et qu'une demande est faite pour exécuter une seconde application alors que cette boucle n'est pas encore terminée. Je ne peux pas supprimer l'objet contenant la boucle tant que la boucle n'est pas finie, mais je ne sais pas comment m'assurer que l'objet en boucle est dans un état prêt à être supprimé. Ai-je besoin d'une sorte de mécanisme de sondage ou de rappel d'événement qui me notifie quand il a terminé?Gestion des interruptions en C++

Merci.

+0

Se pourrait-il que votre question concerne la programmation et le multitâche plutôt que les interruptions? Les interruptions indiquent généralement des déclencheurs externes de bas niveau. – lothar

Répondre

1

Habituellement, si vous avez besoin de faire ce genre de chose, vous aurez un OS/RTOS qui peut gérer les multiples tâches (même si le système d'exploitation est une chose de type homebrew simple).

Si vous ne possédez pas déjà un RTOS, vous pouvez regarder dans un (il y a des centaines disponibles) ou en incorporant quelque chose de regarder simple comme protothreads: http://www.sics.se/~adam/pt/

1

Vous avez deux fils: l'un en cours d'exécution du noyau et un exécutant l'application? Vous devez créer une fonction dans votre noyau, dites ReadyToYield(), que l'application peut appeler lorsque vous êtes prêt à la fermer. ReadyToYield() marquerait le thread du noyau pour lui donner la bonne nouvelle puis s'assoirait et attendrait que le thread du noyau décide quoi faire. Il pourrait ressembler à ceci:

volatile bool appWaitingOnKernel = false; 
volatile bool continueWaitingForKernel; 

Sur le fil de l'application appel:

void ReadyToYield(void) 
{ 
    continueWaitingForKernel = true; 
    appWaitingOnKernel = true; 
    while(continueWaitingForKernel == true); 
} 

Sur l'appel de thread noyau:

void CheckForWaitingApp(void) 
{ 
    if(appWaitingOnKernel == true) 
    { 
     appWaitingOnKernel = false; 

     if(needToDeleteApp) 
      DeleteApp(); 
     else 
      continueWaitingForKernel = false; 
    } 
} 

De toute évidence, la mise en œuvre effective dépend ici du sous-jacent O/S mais c'est l'essentiel.

John.

0

(1) Vous devez écrire du code thread-safe. Ceci n'est pas spécifique aux systèmes embarqués.

(2) Vous devez sauvegarder l'état lorsque vous effectuez un changement de contexte.