2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Nous avons parlé plus tôt de connaissances de base telles que les pointeurs et les structures. Au début de cet article, nous ferons quelques applications complexes de ces connaissances de base, comme les files d'attente.
En fait, en 2018, j'ai enregistré une série de vidéos sur l'architecture des programmes, qui comprenaient des didacticiels étape par étape sur la formation de files d'attente et une série de réflexions et de techniques pratiques de programmation de haut niveau. Elles ont été bien accueillies et reconnues par de nombreux fans et. amis. .
Cependant, comme le didacticiel a été enregistré relativement tôt, la qualité sonore est relativement mauvaise et certains détails ne sont pas parfaits. Par conséquent, cette épine est toujours restée coincée dans mon cœur Afin de permettre aux acharnés du camp de formation spécial sur les microcontrôleurs de Wuji d'apprendre nos projets plus efficacement et mieux, j'ai récemment prévu de réorganiser ces contenus de base et d'en faire une série de. tutoriels graphiques/vidéo sur l'architecture logicielle 2.0.
Lorsque je travaillais en tant qu'ingénieur R&D, j'ai souvent rencontré certains produits de communication, tels que des tableaux de contrôle industriels, des PDU et l'Internet des objets.
Généralement, lors de la fabrication de ce type de produit, ce sera un casse-tête lors de l'écriture et de la réception de flux de données, qu'il s'agisse d'une communication série ou d'une communication sans fil.
Par exemple, STM32 reçoit le flux de données du port série.
Au début, j'ai défini un tableau et une variable d'indice de tableau pour traiter le flux de données reçu. Le code est le suivant :
Cette méthode pose de nombreux problèmes et augmente la complexité pour les ingénieurs qui écrivent du code.
La maintenance du code est fastidieuse
Étant donné que vous devez vérifier manuellement les limites de la mémoire tampon du tableau pour éviter les erreurs hors limites, les tableaux ne sont pas aussi faciles à développer et à gérer que les files d'attente lorsque vous devez traiter des flux de données plus complexes ou ajouter de nouvelles sources de données.
Les données sont sujettes à confusion
L'exploitation directe de tableaux dans un service d'interruption (ISR) peut entraîner une concurrence en matière de ressources avec le programme principal. Si plusieurs tâches accèdent au même tableau, des mécanismes de synchronisation supplémentaires (tels que des verrous mutex) sont nécessaires pour éviter les conditions de course aux données et les incohérences.
Si la réception et le traitement des données ne sont pas synchronisés, l'utilisation de baies peut entraîner une confusion dans l'ordre des données, entraînant une perte de paquets de données causée par des problèmes de programme. J'ai déjà été confronté à ce problème. J'ai besoin de code supplémentaire pour résoudre ce problème, ce qui augmente la complexité du programme. De plus, je n'ai aucune expérience et il n'est pas stable de le faire après tous les efforts.
Ce genre de problème m'a longtemps dérangé. Ce n'est que lorsque j'ai changé de travail plus tard et lu le code écrit par d'autres ingénieurs que j'ai réalisé que les files d'attente pouvaient résoudre ces problèmes. Depuis, la façon dont je gère le flux de données est devenue la suivante :
Cela semble-t-il beaucoup plus simple ? En fait, l'algorithme de traitement des données de la file d'attente n'est pas simple, il utilise simplement la file d'attente pour créer un modèle général pour le traitement des données, la prochaine fois que vous rencontrerez des besoins similaires, vous pourrez l'utiliser directement en termes professionnels, cela signifie la portabilité et la portabilité. le code. Plus réutilisable.
Ce n'est qu'une des applications des files d'attente. L'essence des files d'attente est la mise en cache des données et leur retrait selon la règle du premier entré, premier sorti.
Cela consiste à stocker d'abord les données, puis à les extraire pour les traiter lorsque le processeur dispose de temps libre ou lorsque certaines conditions du programme sont remplies.
Sur la base de cette fonctionnalité, de nombreuses applications pratiques peuvent être dérivées. Surtout lorsqu'il s'agit d'applications qui doivent garantir l'ordre des données.
J'ai résumé quelques-uns des endroits que j'utilise le plus.
Lorsque le microcontrôleur reçoit des données via le port série, il utilise généralement une file d'attente pour mettre en mémoire tampon les octets reçus, ce qui garantit que les données ne seront pas perdues avant d'être traitées par le programme principal.
Dans les appareils de lecture ou d'enregistrement audio, les files d'attente sont utilisées pour mettre en mémoire tampon les échantillons de données audio afin de mettre en œuvre une lecture ou un enregistrement tour par tour. Par exemple : Par exemple, dans le projet 6 de notre camp de formation spécial sur les microcontrôleurs Wuji, l'hôte d'alarme WiFi et 4G dispose d'une fonction d'invite vocale. Par exemple, si vous appuyez sur le bouton d'armement loin de chez vous, la voix « armement loin de chez vous ». sera joué, et si le bouton d'armement à la maison est enfoncé, la voix « armement à la maison » sera jouée.
Si j'appuie rapidement sur ces deux boutons, afin de m'assurer que la voix peut être jouée complètement, je peux d'abord lancer l'événement clé dans le cache de file d'attente, afin que la voix puisse être jouée complètement en séquence.
Dans les systèmes utilisant RTOS, les files d'attente sont utilisées pour la livraison des messages et la synchronisation entre les tâches et prennent en charge la planification de tâches complexes.
Après avoir détecté les événements clés, ils peuvent d'abord être mis dans la file d'attente, et le programme principal peut traiter ces événements afin d'éviter que les événements clés ne soient perdus en raison d'appuis trop rapides sur les touches. Ceci est actuellement utilisé dans notre projet.
Les données ADC que nous collectons peuvent également être mises en file d'attente après certains traitements afin qu'elles puissent être traitées ou analysées au moment approprié.
L'interaction des données lors de la mise à niveau du micrologiciel est relativement importante, ce qui est très approprié pour utiliser des files d'attente pour garantir l'intégrité des données. Elle est également utilisée dans notre projet 6. Pendant le processus de mise à niveau du micrologiciel, les blocs de données téléchargés du micrologiciel peuvent être mis dans la file d'attente, puis. écrits dans la mémoire flash en séquence. Il existe de nombreuses applications similaires. Dans l’ensemble, les files d’attente ont résolu pour moi de nombreux problèmes difficiles.
La file d'attente est une structure de données linéaire qui suit le principe du premier entré, premier sorti (FIFO), c'est-à-dire que les premières données à entrer dans la file d'attente seront les premières à être supprimées. Dans une file d'attente, les données sont généralement placées dans la file d'attente à une extrémité, appelée queue de la file d'attente, et les données sont retirées de la file d'attente à l'autre extrémité, appelée tête de file d'attente. Cette structure rend les files d'attente très adaptées aux situations où les données doivent être traitées de manière ordonnée.
Nous pouvons considérer la file d'attente comme le fait de mettre des balles de ping-pong dans un tuyau bidirectionnel. Nous enfonçons des balles de ping-pong dans le tuyau par la gauche. Cette action est appelée mise en file d'attente. Nous retirons la balle de ping-pong du côté droit du tuyau. Cette action est appelée retrait de la file d'attente.
Les balles de ping-pong dans le tuyau s’aligneront en formation. La balle de tennis de table qui entre en premier sortira en premier. C'est la règle du premier entré, premier sorti dans la file d'attente.
Les balles de ping-pong sont comparées aux données. Le pipeline est un cache qui stocke des données. Le nombre de balles de ping-pong que le pipeline peut contenir signifie la quantité de données que le cache peut stocker. La file d'attente dans l'image ci-dessus peut stocker 4 éléments de données. C'est équivalent à Buff[4].
L'implémentation du programme de la file d'attente se fait via un tableau de taille fixe, un pointeur de tête et un pointeur de queue. Les tableaux sont responsables du stockage des données. Le pointeur principal est responsable de l'adresse à partir de laquelle les données doivent être extraites lors de la sortie de la file d'attente. Le pointeur de queue est responsable de l'adresse à laquelle les données doivent être stockées lorsqu'elles sont mises en file d'attente. Par conséquent, les opérations de mise en file d'attente et de retrait de la file d'attente sont deux pointeurs, jouant l'algorithme premier entré, premier sorti des données dans le tableau.
Différents ingénieurs implémentent les codes de file d'attente différemment. Si vous n'avez pas une riche expérience de projet ou si vous n'avez jamais utilisé de files d'attente auparavant, ne soyez pas gêné de savoir que vous devez être capable d'écrire l'algorithme de file d'attente.
Lorsque j'ai commencé, j'ai également transplanté directement les programmes de file d'attente d'autres personnes et j'ai continué à les utiliser dans mes propres projets. Après les avoir utilisés avec compétence dans plusieurs projets, j'ai ensuite étudié le code détaillé de l'implémentation de l'algorithme de file d'attente et l'ai écrit plusieurs fois moi-même.
Par conséquent, vétérans de notre camp d'entraînement spécial, ne l'écrivez pas vous-même au début. Apprenez d'abord à l'utiliser, tirez des conclusions à partir d'un exemple, appliquez-le à différents scénarios et projets, puis essayez de l'écrire vous-même une fois que vous vous êtes familiarisé. avec cela, c'est une séquence d'apprentissage très importante.
Prenons comme exemple le programme de file d'attente de notre camp de formation spécial Infinite Microcontroller Project. Il y a 4 fonctions au total.
File d'attente vide (x)
Effacer la fonction de file d'attente. Avant chaque utilisation de la file d'attente, la file d'attente doit être effacée. La fonction clear fera pointer le pointeur de tête et le pointeur de queue par défaut, qui est le premier élément du tableau. une exception d’adresse se produira.
Description formelle du paramètre : x - est une variable de structure de file d'attente
File d'attenteDataIn(x,y,z)
La fonction de mise en file d'attente des données consiste à jeter un ou plusieurs octets de données dans la file d'attente spécifiée.
Description formelle du paramètre :
x - Variable de structure de file d'attente
y - adresse des données
z - La quantité de données à mettre en file d'attente, en octets.
Avis:
①.Les données saisies ne peuvent être que de type char non signé.
② Si la file d'attente est pleine et que les données continuent d'être mises en file d'attente, les données seront écrasées à partir du premier emplacement de données.
File d'attenteDataOut(x,y)
La fonction de retrait de données consiste à prendre un octet de données de la file d'attente spécifiée.
Description formelle du paramètre : x - Variable de structure de file d'attente y - Les données extraites, l'adresse à stocker
Remarque : Notre fonction de retrait de la file d'attente ne peut prendre qu'un seul octet de données à la fois.
QueueDataLen(x)
Efface toutes les données de la file d'attente spécifiée. Description formelle du paramètre : x - variable de structure de file d'attente
Le contenu suivant implique des explications de code et des vidéos qui ne sont pas pratiques à modifier. Vous pouvez me contacter pour organiser Feishu pour une meilleure expérience de lecture.
Récemment, de nombreux fans m'ont demandé comment apprendre les microcontrôleurs. Sur la base de mes dix années d'expérience dans l'industrie, j'ai passé un mois à compiler soigneusement un « micro-ordinateur monopuce ».
Le meilleur parcours d'apprentissage pour les microcontrôleurs + tutoriels d'entrée de gamme à avancés pour les microcontrôleurs + boîte à outils", Le tout partagé gratuitement avec les fans inconditionnels ! ! !
A part ça, je partage en larmes ce que j'ai au fond de ma boîte22 projets open source populaires,InclureCode source + schéma + PCB + documentation, te laisserDevenez rapidement un maître!
Pour des packages de tutoriels et des parcours d'apprentissage détaillés, veuillez me voirLe début de cet article ci-dessous。