2010-06-03 18 views
4

J'ai écrit un code en c pour Arm7 en utilisant RTOS. Il y a plusieurs tâches dont la priorité est définie au même niveau. Ainsi, les tâches s'exécutent à la base round-robin.Comment calculer l'heure d'une tâche RTOS

Il existe une exception: une tâche (par défaut) a défini une priorité inférieure à celle de l'autre tâche dans rtos. Donc, si aucune tâche n'est en cours d'exécution, la tâche par défaut ou priorité inférieure s'exécute.

Maintenant, je veux calculer le temps total exact (durée) pour cette tâche par défaut s'exécute.

Peut-on donner une idée de ce qu'il faut faire .... et comment le faire dans le code ..

Cordialement Dani

Répondre

3

Il serait utile que vous nous avez donné plus d'informations sur votre plate-forme (CPU, RTOS) mais l'idée générale est la suivante:

La plupart des RTOS ont un type de légende ou de crochet de "changement de tâche". La plupart des plates-formes embarquées ont des périphériques de minuterie facilement accessibles (minuteries matérielles). Donc, à chaque fois que vous passez de & à la tâche de priorité basse, prenez un instantané du compteur & pour calculer l'intervalle de temps. Toutes sortes de mises en garde s'appliquent, comme la prise en compte de la temporisation (y compris plusieurs reports si votre période de temporisation est très courte), des modes faible consommation/sommeil (si vous les utilisez), du temps passé en ISR, etc.

5

Un moyen très simple de voir quand la tâche par défaut ou inactive est en cours est de faire basculer cette tâche par une broche GPIO inutilisée (mais accessible) ou un voyant LED, si votre matériel en possède une. Ensuite, si vous connectez un oscilloscope à la ligne d'E/S, vous pouvez voir combien de temps le processeur reste dans la tâche inactive pendant la durée de la période d'oscillation vue sur l'oscilloscope. La ligne restera dans un état stable chaque fois que les autres tâches sont en cours d'exécution.

Une autre méthode, si vous pouvez obtenir le code du système d'exploitation, est de rendre la ligne haute lorsque la tâche par défaut est sélectionnée et faible pour toute autre tâche.

1

Je suis d'accord avec la réponse de Dan - voici quelques ajouts/améliorations:

(1) calculs à base de fenêtres. parce que le défaut n'a probablement pas de périodicité, vous devrez calculer son temps d'exécution en termes de pourcentage dépensé dans cette tâche sur une fenêtre (disons 1000msec). Vous devrez définir une variable statique utilisée pour accumuler les clics du minuteur. Une fois que votre fenêtre a expiré (c.-à-d. Que 1000 ms sont passés), vous pouvez calculer le temps passé en défaut par rapport à 1000 ms qui sera le pourcentage dépensé par défaut. Comme je lis votre description, il semble que l'état par défaut est fondamentalement un état inactif - ce qui signifie que ce pourcentage est à peu près votre micro-utilisation disponible.

(2) un retournement par heure.. Si vous pouvez utiliser un compteur 32 bits et que vous capturez les horodatages usec, vous pouvez le faire un peu plus d'une heure avant le basculement. Si vous utilisez ceci pour un projet de maison, vous avez la possibilité d'ignorer les survols. Cela contribuera à une fenêtre distordue de 1000 msec, et c'est tout. Si, d'autre part, vous allez surveiller pour une utilisation maximale et définir un défaut ou un diagnostic à cause de cela ... alors vous voulez le considérer.

(3) Inclinaison ISR. Déterminer si vous devez gérer le temps passé en ISR différemment que le temps passé dans une autre tâche dépend de la façon dont votre RTOS gère le changement de contexte. Comme Dan le mentionne, la plupart des RTOS ont une sorte de callback ou de hook qui se déclenche quand un changement de tâche se produit. Certains RTOS ont un crochet séparé uniquement pour les ISR. Je ne suis pas exactement sûr de ce que la motivation pour cela est autre qu'une théorie générale que les utilisateurs sont moins susceptibles de se soucier du temps passé dans (espérons-le) brèves ISR que sur les tâches de l'utilisateur eux-mêmes. Dans tous les cas, vérifiez comment votre RTOS gère cette commutation et continuez à partir de là.

Si vous ne le faites pas correctement, le temps passé dans les ISR sera attribué à toute tâche en cours au moment du déclenchement des ISR. Si vous êtes par défaut, votre tâche par défaut était "absorber" l'heure ISR. Si vous n'avez pas beaucoup d'ISR en cours d'exécution, alors je l'ignorerais complètement.

Bonne chance! Je l'ai fait avec la famille PowerPC 551X, et c'était pour la production automobile SW donc ça devait être parfait! Vous devriez l'avoir beaucoup plus facile :)