Où mettre des calculs?Handler interruption intérieure ou boucle principale?(Application en temps réel intégré)

StackOverflow https://stackoverflow.com//questions/9609882

Question

Je développe une application intégrée de contrôle moteur et j'ai des doutes sur quoi avec quelques calculs qui transforment les valeurs numériques ADC en valeurs physiques signées (AMPS).

Devrais-je effectuer les calculs dans le gestionnaire d'interruption ou dois-je simplement utiliser le gestionnaire pour définir un drapeau global et effectuer les calculs dans la boucle principale lorsque le drapeau a été défini?

Merci d'avance.

Était-ce utile?

La solution

Il n'y a pas de réponse unique pour cela.Cela dépend de vos besoins de synchronisation, de la charge d'interruption existante, etc.

Si c'est un multiple assez simple ou quelque chose, alors je le ferais simplement dans l'interruption et passer à autre chose.

Assurez-vous simplement de savoir ce que vous faites et ne passez pas plus de temps dans votre interruption que vous ne le devriez.

Autres conseils

Le moins de travail que vous puissiez faire dans votre gestionnaire d'interruption, mieux c'est.À l'heure actuelle, ce n'est peut-être pas une grosse affaire pour votre candidature, mais il y aura une heure lorsque votre charge système est plus élevée et que vous ne voudrez pas conserver d'autres tâches prioritaires plus prioritaires pour gérer les interruptions.Vous voudrez peut-être examiner des sémaphores et une multithreading appropriée plutôt que de simplement définir des drapeaux mondiaux.

Cela dépend de ce que vous voulez faire avec les valeurs ADC et de la rapidité avec laquelle vous devez le faire. Si vous avez besoin de prendre des mesures critiques sur la base des valeurs de l'ADC, vous devriez traiter cela dans l'interruption. Toutefois, si tel est le cas, vous devez vous épargner de la valeur de la valeur analogique «réelle» des comptes ADC, vous devez simplement exprimer vos seuils critiques en termes de comptes ADC.

Par exemple, si votre ADC sortit 8 comptes par volt, vous devez déclencher une butée d'urgence si l'ADC rapporte plus de 1,5 volts, vous écrivez votre code d'interruption pour déclencher la butée électronique à 12 décomptes. Vous pouvez alors passer toujours le compte de l'ADC à la boucle principale de la traduction en unités conviviales pour les objectifs de l'interface utilisateur, etc.

Le principe général est que pour vous garantir que vous puissiez répondre à vos délais, vous structurez votre application et tous les paramètres pour le rendre aussi simple que possible de répondre à ces délais. Si quelque chose n'a pas de délai difficile, mettez-le dans la boucle principale (à nouveau, en général).

Une chose à penser est la cohérence des données.Si vous obtenez plusieurs valeurs connexes de l'ADC (position, tension, courant, etc.), vous voudrez peut-être faire quelque chose pour vous assurer de travailler avec un ensemble cohérent.Cela peut signifier qu'une mise à jour de fond est meilleure qu'une mise à jour de l'ISR.Même la consistance d'une seule lecture pour un laissez-passer donné de l'algorithme peut être importante.Considérez ce code de fond.

  delta = data-lastData;
  //ISR could update data here.
  lastData = data;
  something = K1* data + K2 * delta;  //this may be wrong now

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top