2012-12-24 3 views
2

Je développe un petit système intégré sur un microcontrôleur ARM SANS SYSTÈME D'EXPLOITATION. Il y a plusieurs types d'interruptions (boutons, conversion de A à D, minuterie, etc.) et un seul thread. Je souhaite avoir une file d'attente FIFO à traiter où chaque routine de service d'interruption ajoute son événement à la file d'attente et le thread principal (et unique) supprime les événements de la file d'attente à traiter. Un accès clair à la structure de données de la file d'attente dans la routine de service d'interruption est dangereux, mais un spinlock entraînera un blocage parce que si le thread principal a le verrou et qu'une interruption se produit, l'ISR attendra indéfiniment le verrou.Spinlock dans IRQ sur un petit système embarqué

Bien sûr, je sais déjà que je peux désactiver les interruptions pendant que le thread principal dérange la file d'attente, mais ce n'est pas idéal.

Quelle est la meilleure façon de procéder ici?

Merci A

Répondre

0

Si vous pouvez vous en sortir avec une file d'attente d'anneau de taille fixe, vous n'avez pas besoin quoi que ce soit compliqué (je suppose que les interruptions sont désactivées dans le ISR), car il y a juste un lecteur - votre noyau thread - qui met à jour le pointeur de queue, et un écrivain - ISR - qui met à jour le pointeur de la tête. Sinon, utilisez les instructions Load Linked/Store Conditional pour implémenter un lock-free queue.

Questions connexes