Avantages de RTOS vs Bare Metal pour la programmation MCU?

11

Remarque: cette question mentionne spécifiquement deux RTOS, mais est plus générique et peut probablement être répondue par quiconque a déjà écrit du code C pour des RTOS intégrés et a fait exécuter son logiciel directement sur des MCU.

Je souhaite en savoir plus sur les RTOS intégrés et écrire des applications pour eux. Je regarde actuellement Embox et RIOT car ils sont open source, modernes, actifs et semblent avoir une excellente documentation. Mon objectif comporte deux phases: la phase 1 est de comprendre comment compiler et flasher ces OS sur un MCU (probablement AVR ou ARM). La phase 2 consiste ensuite à écrire un simple programme C (essentiellement un démon sans tête), qui évoluerait avec le temps en tant qu '"application de loisir". Je flasherais / déploierais ensuite ce programme sur le même MCU, déployant ainsi avec succès une application composée d'Embox / RIOT et de mon application résidant dessus.

Avant de parcourir les routes qui mènent finalement à des impasses, je suis tombé sur cet article qui explique assez bien pourquoi les applications en temps réel, écrites en C / assembleur et flashées sur les MCU, n'ont pas vraiment besoin de RTOS en dessous. .

Alors maintenant, je suis vraiment confus et je remets en question une partie de ma compréhension fondamentale de la théorie informatique. Je suppose que j'essaie de prendre la décision d'utiliser ou non Embox / RIOT en premier lieu, soit:

  • Gardez le cap et continuez avec une «pile d'applications» sur le MCU des deux applications OS +; ou
  • Tenez compte de l'avertissement de l'article et allez simplement avec un MCU exécutant mon application "bare metal"

De toute évidence, le premier est plus de travail, et il vaut donc mieux avoir une bonne raison / récompense pour aller dans cette voie. Je demande donc: quels sont les avantages réels que ces RTOS intégrés (et similaires) offrent aux développeurs d'applications MCU / C? De quelles fonctionnalités spécifiques mon application C pourrait-elle bénéficier (peut-être en ne réinventant pas la roue?) En utilisant un RTOS? Qu'est-ce qui est perdu en abandonnant le RTOS et en devenant nu?

Je demande des exemples concrets ici, pas le battage médiatique que vous obtenez lorsque vous accédez à l'entrée wikipedia pour les RTOS ;-)

smeeb
la source
3
Si vous ne savez même pas ce que propose un RTOS, pourquoi êtes-vous intéressé à rédiger des candidatures pour eux? Le fait qu'un RTOS vous soit avantageux ou non dépend entièrement de ce que vous essayez d'accomplir. Cela dit, vous devez apprendre à marcher avant de pouvoir courir. Programmez pour le métal nu, et au fur et à mesure que vous rencontrez des problèmes et les résolvez, vous apprendrez vraiment quels sont les avantages et les inconvénients.
whatsisname
Merci @whatsisname (+1) - c'est un bon conseil et je vais probablement vous y mettre. Je ne pense pas que ce soit un faux pas cependant, d'être toujours intéressé par ce que les RTOS offrent, même si je suis à des mois / des années de leur besoin. Je suppose que je voudrais voir l'image entière à l'avant, à la vue de 30 000 pieds. Merci encore!
smeeb

Réponses:

11

Les programmes de microcontrôleur se composent d'un certain nombre de tâches . Disons que vous vouliez faire une monture de télescope contrôlée par ordinateur. Les tâches seraient les suivantes:

  • Récupérez un nouvel octet d'entrée dans le tampon série USB.
  • Vérifiez si nous avons reçu une commande complète.
  • Si c'est le cas, exécutez cette commande.
  • Lisez les capteurs pour la position actuelle du télescope.
  • Réglez la sortie appropriée pour contrôler la prochaine étape des moteurs.

Il s'agit d'un ensemble de tâches assez typique pour quelque chose pour lequel vous utiliseriez un microcontrôleur, et sont assez faciles à gérer avec une boucle infinie, comme:

while(TRUE) {
  uint8_t input = readUsbBuffer();
  parseCommand(input);
  readSensors();
  setMotors();
}

Si vous continuez à ajouter et à ajouter des fonctionnalités, vous finissez par rencontrer des problèmes courants pour lesquels vous souhaitez créer des abstractions, comme:

  • Votre mémoire tampon déborde, vous devez donc vous assurer que la tâche peut interrompre d'autres tâches avant qu'elle ne déborde.
  • Vous voulez économiser la batterie en dormant quand rien n'est nécessaire.
  • Vous voulez vous assurer que toutes les tâches sont justes. Si cela readSensorsprend trop de temps, vous voulez pouvoir l'interrompre et y revenir plus tard.
  • Vous voulez pouvoir réinitialiser simplement une tâche sans en affecter d'autres.
  • Vous souhaitez qu'une fuite de mémoire ou un autre bogue dans une tâche ne supprime pas les autres tâches.
  • Vous voulez pouvoir attribuer différentes tâches à différentes priorités.
  • Vous voulez pouvoir mettre en sandbox une tâche non approuvée.
  • Vous souhaitez pouvoir exécuter des tâches à des rythmes différents. Peut-être que vos capteurs ne peuvent être lus que 10 fois par seconde, mais vous souhaitez exécuter une étape de moteur 100 fois par seconde.

Un ou deux de ces éléments peuvent être manipulés manuellement relativement facilement. Si vous rencontrez suffisamment de ces types de problèmes assez fréquemment pour commencer à les généraliser dans les bibliothèques, vous avez essentiellement réinventé un RTOS. Si la gestion des tâches de votre programme est suffisamment complexe, même si vous n'utilisez pas un RTOS standard, vous finirez par en réinventer un mal.

Cependant, d'après mon expérience, la ligne où vous voulez un RTOS est très proche de la ligne où vous voulez un microprocesseur au lieu d'un microcontrôleur. Si vous prévoyez que votre micrologiciel deviendra aussi complexe, il est généralement préférable de suivre la voie du microprocesseur depuis le début.

Karl Bielefeldt
la source
Il s'agit d'une excellente analyse qui m'a vraiment fait comprendre. Je suis d'accord avec ce que vous dites, mais je suis davantage d'accord avec la réponse de @Atsby. Surtout si l'objectif est d'apprendre / d'améliorer mes propres compétences. Dans un système de production, probablement mieux avec un produit COTS ou RTLinux, mais pour pouvoir déboguer à bas niveau ce produit en cas de problème, je devrais personnellement avoir écrit un code qui fait autant de fois sur cette liste que possible.
Sam Hammamy du
7

J'ai écrit ma propre bibliothèque coopérative multi-threading pour ARM Cortex-M0.

C'était à peine quelques pages de code, et la première version de celui-ci n'a pas pris plus d'un jour pour écrire et déboguer.

Le gros avantage du roll-your-own est que vous connaissez le code et que vous pouvez le porter sur des puces que le RTOS pourrait ne pas prendre en charge. De plus, vous passez moins de temps à réfléchir à des questions telles que "est-ce que ça va planter si j'essaie d'utiliser les fonctionnalités A et B simultanément?" Depuis que vous avez écrit le code, vous connaissez la réponse.

Le filetage est la principale chose que vous obtenez d'un RTOS, et il s'avère que ce n'est pas si grave de vous implémenter. Il est rare que vous ayez besoin de nombreuses fonctionnalités d'un RTOS. Mais si vous répondez à vos besoins et que vous vous en rendez compte, utilisez un RTOS.

Atsby
la source
Merci @Atsby! Cette réponse m'a vraiment aidé à décider si cela valait la peine d'investir du temps pour en savoir plus sur Bare Metal. J'ai écrit ce qui équivaut à une bibliothèque GPIO en métal nu pour le Pi, et je pense maintenant qu'il est temps d'aller un peu plus loin. Merci!
Sam Hammamy