0

Je trouve que dans RTOS uC/OS-II, il existe une tâche inactive qui s'exécute lorsqu'aucune autre tâche n'est prête à s'exécuter. Si une tâche inactive peut consommer des ressources, comment pouvons-nous la réduire?Réduire l'utilisation des ressources d'une tâche inactive

+0

qu'est-ce que vous essayez de réduire? une tâche inactive est essentiellement 'while (nothing_ready_to_run) {no_op; } 'il n'y a rien à optimiser. – msw

+0

Une tâche inactive peut consommer de la mémoire, de l'alimentation ou des ressources d'E/S. Lequel a besoin d'être réduit? – Gabe

+0

Mémoire et puissance. Intéressant de savoir que les ressources d'E/S sont utilisées pendant une tâche inactive. Comment est-il possible d'utiliser les ressources d'E/S? –

Répondre

3

Habituellement, la tâche inactive est l'endroit où le processeur est mis en mode de faible consommation (veille), si c'est un système de faible puissance et le processeur a un tel mode. Il s'agit généralement d'une instruction d'assemblage spécifique. Par exemple, sur l'ARM Cortex M3, vous devez exécuter l'instruction "WFI". Sur d'autres puces, il pourrait y avoir un registre spécifique en dehors du noyau qui gère la puissance (par opposition à une instruction). Notez qu'il existe souvent des conditions (exigences à satisfaire) avant d'entrer en mode basse consommation. Parfois, vous avez besoin d'avoir des interruptions verrouillées, parfois déverrouillées, avant d'aller dormir; Vérifiez la fiche technique de votre puce.

Habituellement, avant de passer en mode basse consommation, vous devez mettre hors tension tous les périphériques dont vous n'avez pas besoin. Encore une fois, vérifiez la fiche technique de votre puce. Aussi, si vous voulez utiliser une interruption pour vous réveiller, assurez-vous que le périphérique n'est pas éteint et que l'interruption est activée, sinon vous ne vous réveillerez pas. Dernier point: souvent lors du débogage (par exemple sous le contrôle d'un périphérique JTAG), des choses bizarres se produisent lors de l'entrée en mode basse consommation, donc vous voulez désactiver "dormir" dans la tâche inactive lors du débogage, et seulement lorsque vous utilisez sans le débogueur. Habituellement, il s'agit d'une décision à la compilation (#ifdef ...)

1

Une boucle inactive typique est susceptible d'exercer très peu de portes de processeur et consomme donc très peu de puissance dans le noyau, mais si elle est critique, vous pouvez invoquer un mode veille dans la boucle d'inactivité, de sorte qu'aucun code n'est exécuté - le noyau s'arrête juste. Cependant, il est probable que pour maintenir une réponse en temps réel, les périphériques restent alimentés et capables de générer des interruptions, de sorte que, dans la pratique, les avantages peuvent être minimes.

En termes d'autres ressources, la boucle inactive sera typiquement simplement une branche à l'instruction en cours; une instruction, pas de données; il ne peut pas être beaucoup plus petit que ça. Le code source de uC/OS-II est fourni, vous pouvez donc jeter un coup d'oeil!

Bien sûr, si vous avez étendu la tâche inactive en la modifiant directement ou en implémentant un hook, cette utilisation des ressources est entièrement sous votre contrôle, mais vous ne pouvez rien obtenir pour rien.

Questions connexes