10
votes

Comment un planificateur VXWorks est-il exécuté?

aimerait savoir comment le planificateur est appelé afin qu'il puisse changer de tâche. Comme dans le cas même si son planification préventive ou son planification de Robin Robin - le planificateur doit entrer dans la photo pour effectuer tout type de commutation de tâches. Supposant qu'une tâche à faible priorité a une boucle infinie - quand le planificateur intervient-il et passe à une tâche de priorité supérieure?

La requête est: 1. Qui appelle le planificateur? [en VXWorks] 2. S'il est appelé à intervalles réguliers - comment est-ce mis en œuvre ce mécanisme?

Merci d'avance.

- Ashwin


1 commentaires

Bien que je ne connaisse pas VXworks, dans d'autres OS, le planificateur est typiquement appelé par une interruption de la minuterie, il peut donc changer de tâche même si une tâche est actuellement occupée.


4 Réponses :


0
votes

sauf si vous avez une version de la cible de manière majororielle personnalisée, le planificateur est invoqué par l'interruption de la minuterie. Les détails sont spécifiques à la plate-forme, cependant.


0 commentaires

0
votes

Le planificateur est également invoqué si la tâche actuelle est terminée ou bloque.


0 commentaires

14
votes

La réponse simple est que VXWorks prend le contrôle via une interruption matérielle de la minuterie système qui se produit continuellement à des intervalles fixes, tandis que le système est en cours d'exécution.

Voici plus de détails:

Lorsque VXWorks démarre, il configure votre matériel pour générer une minuterie Interruption tous les n millisecondes, où n est souvent 10 mais dépend complètement de votre matériel. L'intervalle de minuterie est généralement configuré par Vxworks dans votre Package de support de la carte (BSP) quand il commence.

Chaque fois que la minuterie tire une interruption, le système commence à exécuter la minuterie manutention d'interruption . Le gestionnaire d'interruption de la minuterie fait partie de Vxworks, alors maintenant VXWorks a le contrôle. La première chose qu'elle fait est de sauvegarder l'état de la CPU (comme des registres) dans le Bloc de contrôle des tâches (TCB) de la tâche en cours d'exécution.

Puis, finalement, Vxworks exécute le planificateur pour déterminer qui fonctionne ensuite. Pour exécuter une tâche, Vxworks copie l'état de la tâche de son TCB dans les registres de la machine et, après cela, la tâche a le contrôle de la CPU.

Info bonus:

vxworks fournit Hooks dans La logique de commutation de tâche afin que vous puissiez avoir une fonction appelée chaque fois que votre tâche est préemptée.


3 commentaires

Notez que cela n'est vrai que si vous activez la planification Round Robin (en appelant KerneltiMesLice ()), la valeur par défaut est la planification préventive basée sur la priorité.


@nos: l'interruption de la minuterie est toujours en cours d'exécution pour garder une trace du nombre de tiques, des minuteries de surveillance et des délais d'attente de sémaphore quelle que soit la politique de planification. Il arrive simplement que pour la planification préventive basée sur la priorité, le planificateur VXWorks ne choisit pas une nouvelle tâche à exécuter à moins que certaines opérations de minuterie ne propose une tâche de priorité plus élevée à la file d'attente Ready. Mais juste point. J'ai toujours voulu mettre à jour cette réponse pour être plus précis et inclure des appels système, que j'ai complètement oublié de mentionner à l'époque.


Il convient également de rappeler que Round Robin est en plus de la priorité. Vous obtenez une priorité basée indépendamment. La planification Round Robin n'affecte que les tâches dans le même niveau de priorité. De plus, même dans une priorité seulement, les tâches peuvent toujours utiliser, par exemple, des tâches de tâches, de sorte que les tiques du système doivent encore apporter.



6
votes

indiv fournit une très bonne réponse, mais il est partiellement exact.
Le fonctionnement réel du système est un peu plus complexe.

Le programmateur peut être exécuté à la suite d'opérations soit synchrone ou asynchrone.

synchrone fait référence à des opérations qui sont causées en raison du code de la tâche en cours d'exécution. Un exemple de ce serait prendre un sémaphores (semTake).
Si le sémaphores n'est pas disponible, la tâche en cours d'exécution sera Pend et ne sera plus disponible pour exécuter. À ce stade, le planificateur sera appelé et déterminer la prochaine tâche qui doit exécuter et effectuera un changement de contexte.

Les opérations asynchrones font essentiellement référence aux interruptions. les interruptions de minuterie ont été très bien décrit par indiv. Cependant, un certain nombre de différents éléments pourrait provoquer une interruption d'exécution: le trafic réseau, capteur, données série, etc ...

Il est également bon de se rappeler que l'interruption de la minuterie ne provoque pas nécessairement un changement de contexte! Oui, l'interruption aura lieu, et la tâche retardée et les compteurs de tranche de temps diminuera. Toutefois, si la tranche de temps n'est pas expiré, ou pas plus transitions de la tâche prioritaire du suspendu à l'état prêt, le planificateur ne sera pas réellement être invoqué, et vous revenir à la tâche d'origine, au point exact où l'exécution a été interrompue.

Notez que le planificateur ne possède pas son propre contexte; il n'est pas une tâche. Il est tout simplement le code qui exécute dans tout ce contexte, il est appelé à partir. Soit à partir du contexte d'interruption (asynchrone) ou à partir du contexte de la tâche invocateur (synchrone).


1 commentaires

Notez que le planificateur n'a pas son propre contexte; Ce n'est pas une tâche. C'est simplement un code qui s'exécute dans n'importe quel contexte il est invoqué. Soit à partir du contexte d'interruption (asynchrone) ou du contexte de la tâche d'appel (synchrone). Ceci est vrai pour la plupart des OSES, je crois, en temps réel ou non