2010-05-02 14 views
2

Je construis un noyau léger pour un Cortex-M3. À partir d'une interruption de priorité élevée, je voudrais appeler du code pour exécuter une interruption de priorité inférieure et transmettre certains paramètres.Passer des paramètres entre des gestionnaires d'interruptions sur un Cortex-M3

Je ne souhaite pas utiliser une file d'attente pour envoyer du travail à l'interruption de priorité inférieure.

J'ai juste un tampon et une taille pour y passer. Dans le manuel de proramming, il est dit que le gestionnaire d'interruption SVC est synchrone, ce qui veut probablement dire que si vous l'appelez d'une interruption moins prioritaire que le gestionnaire SVC, il sera appelé immédiatement (le résultat est que vous pouvez passer des paramètres à lui comme si c'était un appel de fonction (un peu comme les appels du BIOS dans MS-DOS)).

Je voudrais le faire dans l'autre sens: passer des paramètres d'une interruption de haute priorité à une priorité de priorité inférieure (pour le moment je le fais en laissant les paramètres dans un emplacement fixe en mémoire).

Quelle est la meilleure façon de le faire (si possible)?

Merci,

Répondre

1

Je ne suis pas familier avec l'architecture Cortex-M3, mais je suis sûr que ce que vous devez fournir un mécanisme de verrouillage sur la mémoire partagée.

L'interruption de priorité plus élevée peut interrompre le traitement de priorité inférieure à tout moment (sauf si certains comment vous synchronisez spécifiquement cela avec le matériel et vous gaurenteed cela ne se produira pas, mais cela est sans doute pas le cas)

Le mécanisme de verrouillage peut être aussi simple qu'un drapeau à un bit, dans une section critique (désactivation des interruptions pour la lecture-modification-écriture sur le drapeau) pour garantir un échange atomique sur le drapeau de verrouillage. L'indicateur est alors le mécanisme de synchronisation pour lire et écrire dans l'espace mémoire partagé, permettant aux deux processus de verrouiller l'autre pendant qu'il accède. le sha ressource rouge, sans désactiver les interruptions pendant une période prolongée (je suppose que si l'accès à la mémoire partagée est assez rapide, vous pouvez simplement désactiver les interruptions pendant que vous accédez directement à la mémoire partagée)