Question

Nous avons deux tâches (T1 et T2) dans notre système intégré vxWorks qui ont la même priorité (110).
Comment le planificateur vxWorks habituel gère-t-il cette situation si les deux tâches sont prêtes à être exécutées?
Quelle tâche est exécutée en premier?

Était-ce utile?

La solution

La tâche à exécuter en premier est la tâche générée en premier, telle que réalisée par la tâche du planificateur VxWorks. VxWorks utilise la planification basée sur les priorités par défaut. Donc, dans votre cas, puisque T1 et T2 ont la même priorité, celui qui obtient le premier processeur continuera à fonctionner indéfiniment jusqu’à ce qu’il soit explicitement bloqué (avec taskSuspend ou taskDelay ) , à ce moment, l’autre tâche READY s’exécutera jusqu’à ce qu’elle soit bloquée, etc. Cela devrait être contrôlé par des sémaphores ou des mutex (mutices?)

Le problème principal de la planification basée sur les priorités est éclairé par ce problème précis. Comment pouvons-nous déterminer combien de temps laisser ces tâches s'exécuter? Le fait qu'ils aient la même priorité complique les choses. Une autre préoccupation est que les tâches VxWorks qui ont une priorité élevée (un nombre faible signifie une priorité plus élevée) peuvent préempter votre application pour laquelle vous devez être préparé dans votre code. Ces problèmes peuvent être résolus à l'aide de la planification chronologique . Les problèmes supplémentaires posés par la planification circulaire et les solutions sont tous décrits ici .

Autres conseils

VxWorks a 256 niveaux de priorité (0 est le plus élevé, 255 le plus bas). À tout moment, la tâche la plus prioritaire est exécutée sur la CPU. Chaque niveau de priorité a conceptuellement une file d'attente dans laquelle plusieurs tâches sont mises en file d'attente.

Nous avons 3 tâches ayant la même priorité A, B, C. Supposons que A est en cours d'exécution.
Lorsque A bloque (taskDelay, SemTake, msgQReceive), B commence l'exécution.
Quand A débloque, il est mis à la fin de la file. Nous avons maintenant B, C, A.
Quand B bloque, C prend le relais, etc ...

Si la planification de tournois à la ronde (découpage temporel) est activée, le même concept s'applique, mais la tâche est placée à la fin de la file d'attente lorsque sa période est terminée.

Notez qu'une tâche préemptée par une tâche de priorité supérieure n'affectera PAS l'ordre de la file d'attente. Si A était en cours d'exécution et préempté, il poursuivra l'exécution lorsque la tâche de priorité supérieure est terminée. Il ne se place pas à la fin de la file d'attente.

Par défaut, celui qui aura été créé en premier sera exécuté et, à moins qu'il n'abandonne le processeur, l'autre ne fonctionnera jamais.

Vous pouvez activer explicitement le round robin, ce qui leur permettra de prendre le temps.

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