Technologieaustausch

Mikrocontroller-Software-Architektur Serielle (5)-Warteschlange

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Wir haben vorhin über Grundkenntnisse wie Zeiger und Strukturen gesprochen. Zu Beginn dieses Artikels werden wir einige komplexe Anwendungen dieses Grundwissens durchführen, beispielsweise Warteschlangen.

Tatsächlich habe ich 2018 eine Reihe von Videos zur Programmarchitektur aufgenommen, die Schritt-für-Schritt-Anleitungen zur Warteschlangenbildung sowie eine Reihe praktischer Programmierdenken und -techniken auf hohem Niveau enthielten. Sie wurden von vielen Fans gut aufgenommen und anerkannt Freunde. .

Da das Tutorial jedoch relativ früh aufgenommen wurde, ist die Tonqualität relativ schlecht und einige Details sind nicht perfekt. Deshalb ist mir dieser Dorn im Auge geblieben, damit die Hartgesottenen des Wuji Microcontroller Special Training Camp unsere Projekte effizienter und besser verstehen können. Ich habe kürzlich vor, diese grundlegenden Inhalte neu zu organisieren und in eine Serie umzuwandeln der Softwarearchitektur 2.0 Grafik-/Video-Tutorials.

1. Warum sollte ich über Warteschlangen sprechen?

Als ich als F&E-Ingenieur arbeitete, stieß ich häufig auf Kommunikationsprodukte wie Industriesteuerplatinen, PDUs und das Internet der Dinge.

Im Allgemeinen bereitet das Schreiben und Empfangen von Datenströmen bei der Herstellung dieser Art von Produkten Kopfschmerzen, unabhängig davon, ob es sich um serielle oder drahtlose Kommunikation handelt.

Beispielsweise empfängt STM32 einen Datenstrom über die serielle Schnittstelle.

In den frühen Tagen habe ich ein Array und eine Array-Indexvariable definiert, um den empfangenen Datenstrom zu verarbeiten. Der Code lautet wie folgt:

Diese Methode weist viele Probleme auf und erhöht die Komplexität für das Schreiben von Code durch Ingenieure.

  • Die Codepflege ist mühsam

Da Sie die Array-Puffergrenzen manuell überprüfen müssen, um Fehler außerhalb der Grenzen zu vermeiden, lassen sich Arrays nicht so einfach erweitern und verwalten wie Warteschlangen, wenn Sie komplexere Datenströme verarbeiten oder neue Datenquellen hinzufügen müssen.

  • Daten sind anfällig für Verwirrung

Der direkte Betrieb von Arrays in einem Interrupt-Dienst (ISR) kann zu Ressourcenkonkurrenz mit dem Hauptprogramm führen. Wenn mehrere Aufgaben auf dasselbe Array zugreifen, sind zusätzliche Synchronisierungsmechanismen (z. B. Mutex-Sperren) erforderlich, um Datenwettlaufbedingungen und Inkonsistenzen zu vermeiden.

Wenn Datenempfang und -verarbeitung nicht synchronisiert sind, kann die Verwendung von Arrays zu Verwirrung in der Datenreihenfolge führen, was zu Datenpaketverlusten aufgrund von Programmproblemen führen kann. Ich habe mich schon früher mit diesem Problem beschäftigt. Ich benötige zusätzlichen Code, um dieses Problem zu lösen, was die Komplexität des Programms erhöht. Außerdem habe ich keine Erfahrung und es ist trotz all der Mühe nicht stabil.

Diese Art von Problem beschäftigte mich lange Zeit. Erst als ich später den Job wechselte und den von anderen Ingenieuren geschriebenen Code las, wurde mir klar, dass Warteschlangen diese Probleme lösen können. Seitdem gehe ich mit dem Datenfluss wie folgt um:

Fühlt es sich viel einfacher an? Tatsächlich ist der Algorithmus der Warteschlange für die Datenverarbeitung nicht einfach. Wenn Sie das nächste Mal auf ähnliche Anforderungen stoßen, können Sie ihn direkt verwenden des Codes.

Dies ist nur eine der Anwendungen von Warteschlangen. Das Wesentliche bei Warteschlangen ist das Eingeben und Entfernen von Daten aus der Warteschlange.

Das heißt, die Daten werden zuerst gespeichert und dann zur Verarbeitung herausgenommen, wenn die CPU freie Zeit hat oder bestimmte Bedingungen des Programms erfüllt sind.

Basierend auf dieser Funktion lassen sich viele praktische Anwendungen ableiten. Besonders wenn es um Anwendungen geht, die die Datenordnung sicherstellen müssen.

2. In welchen Szenarien sollten Warteschlangen verwendet werden?

Ich habe einige der Orte zusammengefasst, die ich am häufigsten verwende.

2.1 Serieller Kommunikationsdatenpuffer

Wenn der Mikrocontroller Daten über die serielle Schnittstelle empfängt, verwendet er normalerweise eine Warteschlange zum Puffern der empfangenen Bytes. Dadurch wird sichergestellt, dass die Daten nicht verloren gehen, bevor sie vom Hauptprogramm verarbeitet werden.

2.2 Audioverarbeitung

In Audiowiedergabe- oder Aufnahmegeräten werden Warteschlangen zum Puffern von Audiobeispieldaten verwendet, um eine schrittweise Wiedergabe oder Aufnahme zu implementieren. Zum Beispiel: In Projekt 6 unseres Wuji Microcontroller Special Training Camp verfügt der WLAN- und 4G-Alarmhost über eine Sprachansagefunktion. Wenn Sie beispielsweise die Scharfschalttaste außerhalb des Zuhauses drücken, ertönt die Stimme „Scharfschalten außerhalb des Zuhauses“. wird abgespielt, und wenn die Taste „Scharfschalten zu Hause“ gedrückt wird, wird die Stimme „Scharfschalten zu Hause“ abgespielt.

Wenn ich diese beiden Tasten schnell drücke, kann ich, um sicherzustellen, dass die Stimme vollständig abgespielt werden kann, zuerst das Schlüsselereignis in den Warteschlangencache werfen, sodass die Stimme vollständig nacheinander abgespielt werden kann.

2.3 Aufgabenplanung und Synchronisierung

In Systemen, die RTOS verwenden, werden Warteschlangen für die Nachrichtenzustellung und Synchronisierung zwischen Aufgaben verwendet und unterstützen die komplexe Aufgabenplanung.

2.4 Schlüsseleingabeverarbeitung

Nachdem Schlüsselereignisse erkannt wurden, können diese zuerst in die Warteschlange gestellt werden, und das Hauptprogramm kann diese Ereignisse verarbeiten, um zu verhindern, dass die Schlüsselereignisse aufgrund zu schneller Tastendrücke verloren gehen. Dies wird derzeit in unserem Projekt verwendet.

2,5 ADC-Daten

Die von uns gesammelten ADC-Daten können nach einer bestimmten Verarbeitung auch in die Warteschlange gestellt werden, damit sie zum richtigen Zeitpunkt verarbeitet oder analysiert werden können.

2.6 Datenfluss für Firmware-Upgrade

Die Dateninteraktion beim Firmware-Upgrade ist relativ groß, was sich sehr gut für die Verwendung von Warteschlangen zur Gewährleistung der Datenintegrität eignet. Sie wird auch in unserem Projekt 6 verwendet. Während des Firmware-Upgrade-Prozesses können die heruntergeladenen Firmware-Datenblöcke in die Warteschlange gestellt werden nacheinander in den Flash-Speicher geschrieben. Es gibt viele ähnliche Anwendungen. Insgesamt haben Warteschlangen für mich viele schwierige Probleme gelöst.

3. Warteschlangenprinzip

Die Warteschlange ist eine lineare Datenstruktur, die dem First-In-First-Out-Prinzip (FIFO) folgt, d. h. die ersten Daten, die in die Warteschlange gelangen, werden auch als erste entfernt. In einer Warteschlange werden Daten normalerweise an einem Ende in die Warteschlange gestellt, dem sogenannten Ende der Warteschlange, und Daten werden am anderen Ende, dem sogenannten Kopf der Warteschlange, aus der Warteschlange entfernt. Durch diese Struktur eignen sich Warteschlangen sehr gut für Situationen, in denen Daten auf geordnete Weise verarbeitet werden müssen.

Wir können uns die Warteschlange so vorstellen, dass wir Tischtennisbälle von links in die Röhre stopfen. Wir nehmen den Tischtennisball von der rechten Seite der Röhre heraus. Diese Aktion wird als Entnehmen bezeichnet.

Die Tischtennisbälle im Rohr werden in einer Formation aufgereiht. Der Tischtennisball, der zuerst reinkommt, kommt zuerst raus. Dies ist die First-In-First-Out-Regel in der Warteschlange.

Ping-Pong-Bälle werden mit Daten verglichen. Wie viele Ping-Pong-Bälle die Pipeline speichern kann, bedeutet, wie viele Daten der Cache speichern kann. Die Warteschlange im Bild oben kann 4 Daten speichern. Sie entspricht Buff[4].

Die Programmimplementierung der Warteschlange erfolgt über ein Array fester Größe, einen Kopfzeiger und einen Endzeiger. Arrays sind für die Speicherung von Daten verantwortlich. Der Head-Pointer ist für die Adresse verantwortlich, von der Daten beim Entnehmen aus der Warteschlange entnommen werden sollen. Der Endzeiger ist dafür verantwortlich, an welcher Adresse die Daten gespeichert werden sollen, wenn sie in die Warteschlange gestellt werden. Daher sind die Vorgänge des Einreihens und Entfernens aus der Warteschlange zwei Zeiger, die den Daten-First-In-First-Out-Algorithmus im Array abspielen.

4. Nutzung von Warteschlangen

Verschiedene Ingenieure implementieren Warteschlangencodes unterschiedlich. Wenn Sie nicht über umfassende Projekterfahrung verfügen oder noch nie Warteschlangen verwendet haben, müssen Sie sich nicht schämen, dass Sie in der Lage sein müssen, den Warteschlangenalgorithmus zu schreiben.

Als ich anfing, habe ich die Warteschlangenprogramme anderer Leute direkt übertragen und sie weiterhin in meinen eigenen Projekten verwendet. Nachdem ich sie in mehreren Projekten kompetent eingesetzt hatte, studierte ich dann den detaillierten Code der Warteschlangenalgorithmus-Implementierung und schrieb ihn einige Male selbst.

Deshalb, liebe Veteranen unseres speziellen Trainingslagers, schreiben Sie es nicht zuerst selbst, sondern ziehen Sie Schlussfolgerungen aus einem Beispiel, wenden Sie es auf verschiedene Szenarien und Projekte an und versuchen Sie dann, es selbst zu schreiben, nachdem Sie es vertraut gemacht haben damit. Dies ist eine sehr wichtige Lernsequenz.

Nehmen Sie als Beispiel das Warteschlangenprogramm unseres Infinite Microcontroller Project Special Training Camp. Es gibt insgesamt 4 Funktionen.

WarteschlangeLeer(x)

Löschen Sie die Warteschlangenfunktion. Vor jeder Verwendung der Warteschlange muss die Löschfunktion dafür sorgen, dass der Kopfzeiger und der Endzeiger standardmäßig auf das erste Element des Arrays zeigen Es kommt zu einer Adressausnahme.

Formale Parameterbeschreibung: x – ist eine Variable der Warteschlangenstruktur

QueueDataIn(x,y,z)

Die Funktion zum Einreihen von Daten besteht darin, ein oder mehrere Datenbytes in die angegebene Warteschlange zu werfen.

Formale Parameterbeschreibung:

x – Variable der Warteschlangenstruktur

y – Datenadresse

z – Die Menge der in die Warteschlange einzureihenden Daten in Bytes.

Beachten:

①.Die eingegebenen Daten können nur vom Typ unsigned char sein.

② Wenn die Warteschlange voll ist und die Daten weiterhin in der Warteschlange stehen, werden die Daten vom ersten Datenspeicherort überschrieben.

QueueDataOut(x,y)

Die Funktion zum Entfernen von Daten aus der Warteschlange besteht darin, ein Datenbyte aus der angegebenen Warteschlange zu entnehmen.

Formale Parameterbeschreibung: x – Warteschlangenstrukturvariable y – Die entnommenen Daten, die zu speichernde Adresse

Hinweis: Unsere Funktion zum Entfernen aus der Warteschlange kann jeweils nur ein Datenbyte aufnehmen.

QueueDataLen(x)

Alle Daten in der angegebenen Warteschlange löschen. Formale Parameterbeschreibung: x – Variable der Warteschlangenstruktur

5. Nutzung der Videodemonstrationswarteschlange

Der folgende Inhalt enthält einige Code- und Videoerklärungen, deren Bearbeitung umständlich ist. Sie können mich kontaktieren, um Feishu für ein besseres Leseerlebnis zu arrangieren.


Kürzlich haben mich viele Fans gefragt, wie man Mikrocontroller lernt. Basierend auf meiner zehnjährigen Erfahrung in der Branche habe ich einen Monat lang sorgfältig einen „Einzelchip-Mikrocomputer“ zusammengestellt.

Der beste Lernpfad für Mikrocontroller + Tutorials für Einsteiger bis hin zu fortgeschrittenen Mikrocontrollern + Toolkit“ Alles kostenlos mit eingefleischten Fans geteilt! ! !

Abgesehen davon teile ich unter Tränen mit, was ich unten in meiner Kiste habe22 beliebte Open-Source-Projekte,EnthaltenQuellcode + Schaltplan + PCB + Dokumentation, dich lassenWerde schnell ein Meister

Für Tutorial-Pakete und detaillierte Lernpfade wenden Sie sich bitte an michDer Anfang dieses Artikels unten

Lernpfad vom Einstiegsniveau bis zum fortgeschrittenen Hacken von Mikrocontrollern (mit Tutorials + Tools)

Lernpfad vom Einstiegsniveau bis zum fortgeschrittenen Hacken von Mikrocontrollern (mit Tutorials + Tools)

Lernpfad vom Einstiegsniveau bis zum fortgeschrittenen Hacken von Mikrocontrollern (mit Tutorials + Tools)