Salut,
Comme je l'ai expliqué dans un autre fil (celui d'IFRELO je crois), je n'utilise pas d'OS.
J'ai une boucle de polling en tache de fond, qui regarde en permanence si des évènements sont échus, et les exécute le cas échéant.
Dans ces évènements, on trouve :
-lecture sur les UARTS (Bluetooth debug et Bluetooth GR)
-écriture sur les UARTS (idem)
-vérification des triggers (position atteinte, vitesse, états actionneurs, switchs, timeout...)
-déclenchement des actions (selon les états triggers) : déplacement, actionneurs, rotation, ...
-évolution de la strat : quand il n'y a plus d'action exécutable, le grafcet est terminé et la strat passe à l'état suivant
-construction des grafcets de strat
-évitement (arrêt sur détection + pathfinding)
-détection des patinages (non implémenté)
En plus de cela, j'ai plusieurs niveaux d'interruption, correspondant à :
-lecture de la vitesse courante
-intégration de la position courante
-asservissement en position
-lissage de la sortie de l'asservissement en position
-asservissement en vitesse
-lissage de la consigne vitesse
Au niveau de la boucle de polling en tache de fond, je n'ai rien d'hyper critique : dans mes tests, elle ne s'est jamais exécutée à + de 10ms d'intervalle. Le cas exceptionnel est lors du calcul de pathfinding (400ms), mais de toute manière le robot est à l'arrêt dans ce cas là.
Ce qui est important selon moi, c'est la fiabilité des boucles d'asservissement et d'integration en position, ce qui est assuré par le mécanisme d'interruptions.
Du coup, pas d'OS
Ce n'est pas forcément une solution idéale car cela ne permet pas d'avoir une fonction par stratégie, qui s'exécute au fur et à mesure du match. Cela oblige à construire des grafcets à l'avance, donc c'est assez contraignant. Je dirais que c'est ce qui me manque le plus.
Mais pour l'instant, je n'ai pas prévu de changer ce mécanisme car cela laisse beaucoup de souplesse (et surtout, j'ai tout codé moi-même donc j'ai la maitrise totale du code et des effets de bords).
N'hésite pas si tu as d'autres questions
Goulou