Einheit 3 / 9

Eingebettete Systeme und Mikrocontroller-Code

Gewinne:

  • Möglichkeit, Register-, Interrupt- und Timing-Anforderungen für den Mikrocontroller mit einer klaren Eingabeaufforderung zu definieren
  • Möglichkeit, den von KI erzeugten C/Arduino-Code im Hinblick auf Registereinstellungen, Pufferüberlauf und Echtzeitbeschränkungen zu überprüfen
  • Fähigkeit, die Gewohnheit anzuwenden, den generierten Code durch Messung auf Hardware (Oszilloskop, serielle Schnittstelle) zu überprüfen.

Bei der Entwicklung eingebetteter Systeme überschneiden sich Software und Hardware: Das falsche Setzen eines Registerbits, das zu lange Halten eines Interrupts oder das Überlaufen eines Puffers führen zu seltsamen, schwer reproduzierbaren Fehlern im Feld, selbst wenn der Code „kompiliert“ und ausgeführt wird. KI ist in diesem Bereich wirklich ein Beschleuniger; Es kann erste Grundgerüste, Hardware-Abstraktionsfunktionen, Zustandsmaschinen und Kommunikationsroutinen erzeugen. Aber AI sieht das Datenblatt Ihrer Karte nicht, kennt Ihre Taktfrequenz nicht und erkennt Ihre Echtzeitbeschränkungen nicht. In dieser Einheit erfahren Sie, wie Sie die Arbeit von Mikrocontrollern für KI klar definieren, wie Sie den generierten C/Arduino-Code überprüfen und warum Sie alles in der Hardware messen sollten.

Anforderung klar definieren: Register, Schnitt, Timing

Der KI zu sagen, sie solle „eine LED zum Leuchten bringen“, wird nicht funktionieren; Welche Karte, welcher Pin, welche Taktfrequenz, welches Timing? Wenn Sie der KI eine eingebettete Aufgabe zuweisen, verwenden Sie dieses Framework: Hardware (MCU-Familie, Uhr, Pin), Funktion (was passieren wird), Einschränkung (Timing, Leistung, Speicher) und Schnittstelle (Register, HAL, Arduino-Bibliothek).

Schwache Eingabeaufforderung / Starke Eingabeaufforderung

SCHWACH: „PWM mit STM32 erzeugen.“ (Ergebnis: Welcher Timer, welche Frequenz, welcher Pin ist unklar; allgemeiner, wahrscheinlich falscher Registernamenscode.) STARK: „Erzeuge 20 kHz, 0–100 % einstellbares Tastverhältnis-PWM auf TIM3 CH1 (PA6) für STM32F103 (72 MHz Systemtakt). Schreiben Sie auf Registerebene (nicht HAL). – Prescaler- und ARR-Werte für 20 kHz BERECHNEN und die Berechnung in der Kommentarzeile anzeigen. – Stellen Sie das Tastverhältnis mit einem Funktionsparameter ein zwischen 0 und 100. - Kommentieren Sie jedes von Ihnen verwendete Registerbit.

Der Unterschied besteht darin, dass die leistungsstarke Eingabeaufforderung dafür sorgt, dass das Modell die Berechnung anzeigt und die Taktannahme offenlegt. So können Sie die Prescaler/ARR-Werte unabhängig überprüfen:

Für 20-kHz-PWM (72-MHz-Takt):Timer_clock = 72 MHzWenn wir Vorteiler = 72-1 → Zählertakt = 1 MHz wollen ARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Überprüfung: 1e6 / (49+1) = 20.000 Hz ✓

AI-Code prüfen: Worauf ist zu achten?

Nur weil der generierte Code kompiliert wird, bedeutet das nicht, dass er ordnungsgemäß funktioniert. Befolgen Sie diese Checkliste:

Kontrollbereich

Worauf Sie achten sollten

Register-/Biteinstellungen

Exakt kompatibel mit Datenblatt, korrekte Bitmaske

Interrupt (ISR)

Ist es kurz? Keine Blockerverzögerung? Wird flüchtig verwendet?

Puffer/Array

Gibt es Grenzkontrollen? Überlaufgefahr?

Timing

Mit Verzögerung oder Timer? Werden die tatsächlichen Zeitvorgaben eingehalten?

Typ und Breite

8/16/32-Bit-Überlauf, vorzeichenbehaftete/vorzeichenlose Verwechslung

Stromversorgung/Watchdog

Endlosschleifen-Fütterungswächter?

Interrupt Service Routines (ISR) sind die häufigste Fehlerquelle. KI fügt manchmal eine Verzögerung () oder eine lange Schleife in den ISR ein. Dies führt dazu, dass andere Interrupts verpasst werden und der Watchdog zurückgesetzt wird. Regel: ISR sollte so kurz wie möglich sein; Die Hauptaufgabe sollte darin bestehen, ein Flag einzurichten und es in die Hauptschleife zu verschieben.

// SCHWACH (KI erzeugt dies manchmal): Blockerfunktion in ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // kann lange dauern - BAD CASE_Delay(10); // Verzögerung im ISR – SEHR SCHLECHT }}// STARK: ISR kurz; Job wird in die Hauptschleife verschobenvolatile uint8_t tick_flag = 0; // volatile CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; tick_flag = 1; //einfach Flag setzen }}// in der Hauptschleife:if (tick_flag) { tick_flag = 0; read_sensor(); }

Achtung: Jede vom Interrupt und der Hauptschleife gemeinsam genutzte Variable muss flüchtig sein. Andernfalls könnte der Compiler die Variable im Register zwischenspeichern und die Aktualisierung verpassen. KI vergisst dieses Schlüsselwort oft; Achten Sie beim Lesen des Codes gezielt darauf.

Pufferüberlauf und Typfehler

KI kann Daten vom seriellen Port in ein Array fester Größe kopieren, ohne dass die Grenzen überprüft werden. In einem eingebetteten System bedeutet dies, dass zusammenhängender Speicher zerstört wird und es zu unerklärlichen Abstürzen kommt. Stellen Sie sicher, dass das Limit bei jedem Strcpy, Array-Index und DMA-Puffer überprüft wird. Ebenso wird ein 8-Bit-Zähler nach 255 zurückgesetzt; Die KI kann dies ignorieren und sich auf ein überlaufendes Konto verlassen.

Überprüfung in Hardware: „Funktioniert“ wird gemessen, nicht angenommen

In einem eingebetteten System ist der Zähler der zuverlässigste Beweis, nicht der Compiler. Überprüfen Sie den generierten Code auf diese drei Arten:

  1. Oszilloskop/Logikanalysator: Messung der PWM-Frequenz, des Signal-Timings und der Kommunikationswellenform. Wenn Sie 20 kHz wünschen, sehen Sie 20 kHz auf dem Bildschirm.
  2. Protokoll der seriellen Schnittstelle (UART): Drucken Sie Variablenwerte, Zustandsübergänge und Fehlerzähler aus und vergleichen Sie sie mit dem erwarteten Verhalten.
  3. Bindungs- und Stresstests: Testen Sie, ob das System der höchsten Last, den schnellsten Daten und dem schlechtesten Timing standhält.

Wenn der gemessene Wert nicht mit der Berechnung übereinstimmt, ist die Taktannahme, der Vorteilerwert oder die Registereinstellung falsch; Verfolgungsjagd.

Mini-Koffer

Ein Team von Studenten lässt die KI mit einem Ultraschallsensor HC-SR04 einen Entfernungsmesscode drucken. Der Code wird kompiliert, aber der Abstand liefert immer lächerliche Werte. Wenn sie es an das Oszilloskop anschließen, sehen sie, dass der Echozweig sein Timing in Millisekunden statt in Mikrosekunden berechnet; AI verwendete millis() anstelle von micros(). Dieser Ein-Wort-Fehler verfälschte die gesamte Messung um den Faktor 1000. Wenn sie die rohe Echozeit in das serielle Protokoll drucken und sie mit einem echten Lineal vergleichen, finden sie den Fehler und beheben ihn. Lektion: Kompilierter Code ist kein korrekter Code; Die Messung in der Hardware zeigt den Fehler sofort an.

Häufige Fehler

  • Akzeptieren von Registernamen und Bitmasken, ohne sie mit dem Datenblatt zu vergleichen.
  • Blockierungsverzögerung oder lange Verarbeitung innerhalb des ISR zulassen.
  • Vergessen Sie die Volatilität bei gemeinsam genutzten Variablen.
  • Überprüfung der Puffer- und Array-Grenzen umgehen; Ich sehe den Überlauf nicht.
  • Verlassen Sie sich auf Taktfrequenz- und Timing-Annahmen, ohne diese zu überprüfen.
  • Betrachten wir den Code als „funktionierend“, ohne ihn mit einem Oszilloskop/seriellem Protokoll zu messen.

Zusammenfassend

  • Definieren Sie die eingebettete Aufgabe klar in Bezug auf Hardware, Funktion, Einschränkungen und Schnittstelle.
  • Lassen Sie die KI Timing-Werte wie Prescaler/ARR berechnen und selbstständig verifizieren.
  • Halten Sie ISRs kurz und verwenden Sie volatile für gemeinsam genutzte Variablen.
  • Suchen Sie insbesondere nach Register-, Pufferlimit- und Typbreitenfehlern.
  • „Es funktioniert“ wird mit einem Oszilloskop, einem Logikanalysator und einem seriellen Protokoll nachgewiesen, nicht mit dem Compiler.
  • Wenn der gemessene Wert nicht mit der Berechnung übereinstimmt, verfolgen Sie die Annahmen.

Anwendungsaufgabe

Bitten Sie die KI mit einem Mikrocontroller (Arduino, STM32, ESP32) um eine PWM oder eine periodische Aufgabe mit einer bestimmten Frequenz. Vor dem Laden des Codes: (1) Überprüfen Sie die Häufigkeits-/Timingwerte unabhängig vom Konto in der Kommentarzeile, (2) Überprüfen Sie den ISR und die gemeinsam genutzten Variablen auf Volatilität und Blockierung. Messen Sie nach dem Hochladen die tatsächliche Frequenz mit einem Oszilloskop oder Logikanalysator und vergleichen Sie sie mit dem Ziel. Wenn es eine Abweichung gibt, suchen Sie die Quelle, korrigieren Sie sie und notieren Sie, was als falsch angenommen wurde.