Dans un article précédent , nous avons expliqué comment, selon l'auteur, il est possible de programmer les actions habituelles d'un microcontrÎleur en temps réel, en les divisant en plusieurs tùches indépendantes (ou presque indépendantes) les unes des autres.
Un microcontrÎleur a été choisi, avec un noyau issu d'une famille trÚs répandue d'ARM Cortex M. Des options familiÚres à beaucoup, et pas seulement à l'auteur, avec les nombres 0,3,4 et 7, M4 a été choisie, car elle était à portée de main.
Les deux considérations qui nous ont poussés à nous engager sur la voie glissante et fragile de «l'invention du vélo», comme certains lecteurs l'ont remarqué avec humour, étaient en fait simples. La premiÚre était que nous devons encore vivre et vivre avec ces «cortex». Et la seconde est d'essayer de ne pas faire quelque chose d'universel (gagner la gloire et la fortune), mais de faire quelque chose de plus étroitement ciblé, dans l'espoir d'atteindre l'efficacité et la simplicité. Ceux qui font parfois quelque chose avec leurs mains se souviendront facilement que, en rÚgle générale, un tournevis spécialement sélectionné est meilleur que celui pris dans un ensemble universel brillant.
Un exemple d'assembleur a Ă©tĂ© donnĂ© afin de montrer que pas plus de 80 cycles d'horloge sont consacrĂ©s Ă la commutation. Et Ă une vitesse d'horloge de 72 mĂ©gahertz, il s'avĂšre un peu plus de 1 microseconde. Une tique de 50 microsecondes ne sera donc pas si chĂšre. Seulement 2% des frais gĂ©nĂ©raux. Par consĂ©quent, comme lâa dit lâun des personnages prĂ©fĂ©rĂ©s de lâauteur, «il est conseillĂ© de souffrir».
Donc, nous avons N tĂąches, dont chacune est garantie d'exĂ©cuter un morceau (tick T) de temps et est garantie de rĂ©pĂ©ter ce segment au plus tard aprĂšs (N-1) T ticks, plus un retard ne dĂ©passant pas D. Ce retard ennuyeux, heureusement , est limitĂ© par la taille maximale possible dans le temps, qui est Ă©gale Ă la somme de la durĂ©e de fonctionnement de toutes les interruptions autorisĂ©es. En d'autres termes, la tĂąche qui a le plus d'interruptions potentielles pour une pĂ©riode donnĂ©e avant le prochain tick est la plus malchanceuse. Pendant une pĂ©riode plus longue, la tĂąche ne peut pas ĂȘtre retardĂ©e. Elle recevra inĂ©vitablement son crĂ©neau horaire au plus tard en (N-1) microsecondes T + D. Ă mon avis, cela s'appelle dur en temps rĂ©el.
Les tĂąches doivent terminer leurs tĂąches et rendre compte de la mise en Ćuvre. Ă qui dois-je faire rapport? Apparemment, quelqu'un est en charge, et il arrive, en rĂšgle gĂ©nĂ©rale, qu'ils soient beaucoup plus petits que leurs subordonnĂ©s (en vĂ©ritĂ©, l'auteur a Ă©galement rencontrĂ© des exceptions lorsqu'il y avait quatre patrons pour trois travailleurs avec les deux mains gauches, dont un seul connaissait et respectait le mot " adĂ©quation »).
Et si «vous ĂȘtes nombreux, mais j'en suis un», cela signifie une file d'attente. Beaucoup commenceront Ă pousser et essaieront de se faufiler. Et quelqu'un devra attendre, puis ĂȘtre en retard et expliquer. MalgrĂ© le fait que tout cela a l'air terrible, cela s'appelle beau: la lutte pour la ressource. Les files d'attente sont une solution bien connue de tous. J'en connaissais beaucoup qui ne nourrissent pas de pain - laissez-moi faire la queue.
Mais la nÎtre ne peut pas attendre! En ce sens, les tùches. Ils sont en temps réel difficile. Supposons que deux tùches lisent les lectures une fois par seconde, et que la troisiÚme devrait mesurer quelque chose toutes les 10 millisecondes, la mettre dans une pile et faire rapport au sommet. Et ils lui disent: "Dis-moi, on n'a pas fini avec les chefs."
Apparemment, vous devez vous tourner, pour le moins, vers un temps pas tout à fait réel (temps réel doux).
Ayons une tĂąche spĂ©ciale qui sait attendre et aime le faire. La ressource qu'il servira sera le canal de communication. Comme vous le savez, vous nây mettrez pas tout Ă la fois.
Mais, vous pouvez immĂ©diatement dĂ©terminer la vitesse du canal afin que rien ne soit perdu. Pour ce faire, vous devez connaĂźtre les performances avec lesquelles tous nos graphomanes, pah, tĂąches fonctionnent. Ăvidemment, vous devez Ă©galement calculer la taille du ou des tampons Ă partir desquels tous les packages seront envoyĂ©s (ou vers la droite).
Si le canal n'en est pas un, alors l'essence ne change pas. Pour chaque canal, une tùche distincte est simplement ajoutée, conçue pour attendre (et, bien sûr, espérer et croire).
Quelques mots sur le canal de communication avec l'opĂ©rateur, ou plus simplement avec la personne. Ici, le canal est bidirectionnel, mais la direction extĂ©rieure est la plus intĂ©ressante. Faites immĂ©diatement une rĂ©serve, il y a une circonstance que, mĂȘme avec un fort dĂ©sir, il est impossible d'exclure. Il s'agit d'une surcharge de canal. Pendant les tests, nous devons l'atteindre et devons avoir un mĂ©canisme pour voir son apparition. Je ne dis pas, ce n'est pas bon de tromper, mais un peu peut ĂȘtre laissĂ© de cĂŽtĂ©. Vaughn, Gerasim, en a abusĂ© complĂštement.
Par consĂ©quent, nous supposons immĂ©diatement que le message Ă l'opĂ©rateur de la tĂąche peut ĂȘtre perdu. Et pour qu'une personne sache cela, nous allons les numĂ©roter. Cela permettra de dĂ©terminer oĂč et combien de fois notre opĂ©rateur s'est retrouvĂ© sans rien. En fin de compte, vous pouvez toujours faire quelque chose dans le code, ou ajouter des calculs, ou mĂȘme le connecter au circuit Ă©lectrique pour corriger la situation. Il semble que pour le moment, ce sera plus facile. Mais, bien sĂ»r, cela n'est pas nĂ©cessaire pour les applications militaires. Pour ĂȘtre honnĂȘte, perdre un message ne ressemble pas Ă une honte uniquement lors du dĂ©bogage.
Par exemple, ayons une interface série duplex sans acquittement à 115200 bauds. Par exemple, RS422 dans la configuration "économie" deux fils - là , deux - en arriÚre. Sa capacité est d'environ 10 000 octets par seconde. Prenons la taille moyenne d'un message pour une personne égale à 50 octets. Nous obtenons 200 messages par seconde ou un message en 5 millisecondes. Si nous avons trois tùches qui veulent communiquer quelque chose, laissez-les le faire toutes les 15 millisecondes chacune. En moyenne, bien sûr. Et si ce n'est pas en moyenne, des calculs statistiques sérieux ou une expérience à grande échelle seront nécessaires. Choisissez le dernier. AprÚs tout, nous avons appris à détecter les messages manquants et nous verrons tout sur l'écran de l'émulateur de terminal.
Alors, laissez les trois tùches créer des messages individuels. Laissez les messages différer en importance ou en urgence du contenu et nos tùches les mettent dans le tampon approprié. Allouez ces trois tampons en anneau pour trois niveaux d'urgence, comme le montre la figure 1.

La quatriÚme tùche sélectionne parmi ces tampons un message selon notre plan approuvé et essaie de le délivrer. Si l'envoi n'est pas encore possible, la quatriÚme tùche estime combien il peut dormir et le fait. AprÚs avoir dormi, elle dispose déjà de l'espace nécessaire dans la mémoire tampon pour envoyer.
Les tampons de diverses urgences, bien sĂ»r, ne stockent pas les messages eux-mĂȘmes, mais leurs adresses (liens). Dans le mĂȘme temps, les tĂąches elles-mĂȘmes n'ont pas besoin d'attendre du tout. Ok? Non, pas vraiment. Cela ne fonctionne pas, et voici pourquoi. Chacun de ces trois tampons en anneau est une ressource partagĂ©e. Imaginez que la tĂąche 1 Ă©tait sur le point de mettre une adresse dans un tampon central. Elle lit le mot, vĂ©rifie que l'endroit est vide, c'est-Ă -dire que la valeur est zĂ©ro et (Ă ce moment elle est remplacĂ©e par une autre tĂąche 2, qui veut faire exactement la mĂȘme chose et elle rĂ©ussit), la premiĂšre tĂąche, en revenant, met le mot lĂ , Ă©crasant tout ce qui rĂ©ussi deuxiĂšme. Voici un collĂšgue qui demande des mots. Il me semble savoir ce qu'il va dire.
-Oui, tout est trÚs simple, vous pouvez interdire les interruptions pendant la durée du test et rien de grave ne se passera, ce n'est pas pour longtemps.
- C'est vrai, pas pour longtemps, mais combien de fois? Combien de temps allons-nous retirer de la tùche? Et lequel? J'ai oublié d'avertir, nous n'interdisons jamais les interruptions, notre dure secte du temps réel nous interdit de le faire.
-Et si vous n'interdisez pas les interruptions, vous pouvez demander Ă notre commutateur de tĂąches d'y mettre l'adresse du message. Il peut le faire atomiquement.
- Oui, peut-ĂȘtre, mais je veux lui demander autre chose, puis une autre. Et pourquoi alors avons-nous atteint 72 degrĂ©s, puis tout diluer avec de l'eau? DĂ©solĂ©, je voulais dire 72 cycles pour changer de contexte.
Essayons de le faire plus facilement, comme dans la figure 2.

Dans ce cas, chaque tĂąche a son propre tampon ou son propre ensemble de tampons, si vous voulez une urgence, une pompe et une importance diffĂ©rentes. Personnellement, en tant que simple opĂ©rateur, j'ai toujours la mĂȘme importance pour tout le monde.
Un tel schéma ne vous oblige pas à vous battre pour la ressource. Maintenant, nous avons une option trÚs fonctionnelle. Je n'aime pas ça. Mais que faire si les tùches à gauche de l'image n'ont rien à envoyer? Il serait alors plus sage de demander à la tùche de droite de se réveiller lorsque la raison apparaßt, et de ne pas se réveiller juste pour régler à nouveau l'alarme. Les tùches à gauche sont plus faciles à faire. De plus, une fonction qui aide à réveiller un ami a été mentionnée dans un précédent post.
Je prĂ©vois une proposition de rationalisation: "Que l'interruption du port sĂ©rie (UART) lui-mĂȘme soit engagĂ©e dans la tĂąche 4 en cours, il y aura des Ă©conomies." Vous pouvez le faire, mais je ne pense pas que ce soit bon. Je vais essayer de clarifier. Les tĂąches de gauche, en effet, peuvent elles-mĂȘmes activer la procĂ©dure d'interruption UART, et elle commencera Ă fonctionner et ne s'arrĂȘtera pas tant qu'elle n'aura pas tout fait. La procĂ©dure d'interruption devrait maintenant faire tout ce que la tĂąche 4 faisait auparavant. Le temps nĂ©cessaire pour traiter l'interruption va gonfler, pas une seule tĂąche ne pourra ĂȘtre activĂ©e jusqu'Ă ce que le prochain «spool» soit terminĂ©. Et que disons-nous Ă nos camarades du cercle persistant en temps rĂ©el? Mais on nous a dit que la rĂ©ponse Ă toute interruption externe devait ĂȘtre aussi courte que possible. C'est juste un bon ton. Ou, en d'autres termes: il faut faire le bien, le mal et sans vous ça marchera.
La figure 3 explique en quoi consiste le processus et quels sont les défis rencontrés.

Passons maintenant à la situation, pourrait-on dire, un miroir. C'est quand l'information vient de l'extérieur. Que ce soit une chaßne SPI avec plusieurs gondoliers avec gondoles et un petit orchestre à cordes amateur. Non, il est trop tÎt pour penser au repos. Ne laissez que l'interface SPI et quelques puces. Par exemple, capteur de pression atmosphérique, accéléromÚtre et mémoire stockée.
Je dois dire tout de suite - un exemple stupide. Pas Ă cause du gondoliero avec leur Ă©ternel "je devrais ajouter, monsieur." Non, il est stupide, en fait, de mĂ©langer dans une mĂȘme interface des donnĂ©es dâentrĂ©e dâimportance diffĂ©rente. En effet, si vous avez besoin de connaĂźtre l'accĂ©lĂ©ration, alors, c'est sĂ»r, afin de savoir rapidement quand retirer la pĂ©dale d'accĂ©lĂ©rateur, ou tourner les volets, ou fermer les yeux, enfin. Ces informations sont souvent nĂ©cessaires. Mais la pression, elle, change lentement et devra descendre d'environ trois mĂštres, de sorte que dans les rangs infĂ©rieurs, la vie deviendra plus chaude.
Quant Ă la mĂ©moire stockĂ©e, et qui l'a gĂ©nĂ©ralement mis sur ce SPI? Y a-t-il un deuxiĂšme SPI? Et n'est pas prĂ©vu? Nulle part oĂč aller, quelque chose doit ĂȘtre fait. Redirigez les flĂšches dans la direction opposĂ©e de la figure 2 et commencez Ă rĂ©flĂ©chir.
La tùche 4 dessert désormais le SPI et ne se réveille que par ses signaux. Sa connexion avec la tùche 1, qui veut mettre quelque chose dans la mémoire stockée, est dirigée vers l'extérieur et s'effectue à travers la file d'attente. Il est également nécessaire de prévoir un mécanisme pour surveiller le débordement du tampon en anneau. La production des valeurs d'accélération et de pression de la tùche 4 devrait fournir sans la participation de deux tùches consommatrices. Vous avez juste besoin de tourner et de suivre. Nous pouvons maintenant esquisser une image explicative et rédiger une note explicative. Dans la figure 4, ces
les actions sont représentées schématiquement (ou diagramme).

VĂ©rification de sous-dĂ©passement - ces actions vous aident Ă savoir si la valeur d'accĂ©lĂ©ration a le temps de changer avant d'ĂȘtre relue par la tĂąche consommatrice. Cette vĂ©rification est reprĂ©sentĂ©e par une action distincte sur la figure 4 uniquement pour attirer l'attention sur elle. En fait, cette Ă©tape se produit avec la lecture de la valeur de l'accĂ©lĂ©romĂštre selon le schĂ©ma, comme le montre la figure 5.

Il est Ă noter qu'il existe une ressource partagĂ©e, puisque le lieu de stockage du rĂ©sultat est Ă©galement un indicateur d'actions (sĂ©maphore). Les courses sont possibles ici, parlant le langage des circuits, mais pour nous, ce n'est pas une omission. AprĂšs tout, se glisser dans la porte de fermeture d'un vĂ©hicule uniquement dans la vie peut ĂȘtre considĂ©rĂ© comme une fortune. Ici, nous considĂ©rerons cela avec confiance comme un retard.
L'accÚs à la mémoire se fait par portions afin de limiter le temps de chacune de ces étapes. Ainsi, nous assurerons une lecture uniforme des valeurs d'accélération changeant rapidement, et entre les deux, nous nous occuperons dans le temps du reste.
Eh bien, il reste maintenant à trouver quelque chose de convenable à partir de fer et à expérimenter comme il se doit. Ce sera, je pense, la prochaine histoire.