zisky:
- Schopnost generovat vložený kód daný registrem a hardwarovým kontextem pro Arduino/STM32/ESP32 s AI
- Schopnost rozpoznat a opravit vložené vzory, jako jsou přerušení, časovače a neblokující smyčky ve výstupu AI
- Schopnost zkontrolovat vygenerovaný kód z hlediska paměti, reálného času a zabezpečení před jeho nahráním na hardware
V mechatronice je mikrokontrolér místem, kde se myšlenky setkávají s fyzickým světem. Karty jako Arduino, STM32, ESP32; čte senzory, řídí akční členy, komunikuje a to vše při omezené paměti, omezeném výpočetním výkonu a přísných požadavcích na časování. Umělá inteligence je v této oblasti velmi užitečná: dokáže extrahovat nastavení registrů na základě datasheetu senzoru, kódovat komunikační protokol, nastavit přerušení časovače. Ale vestavěné systémy jsou jednou z oblastí, kde umělá inteligence produkuje nejvíce „přesvědčivých nepravd“; protože adresy registrů, bitové masky a chování časování jsou specifické pro desku a jedna bitová chyba narušuje celé chování. V této části se zabýváme tím, jak nechat vygenerovat vložený kód pomocí AI a jak jej zkontrolovat před načtením do hardwaru.
Rozdíl Embedded Code od Pure Software
Desktopový program má dostatek paměti, operační systém a snadné ladění. Vloženému kódu chybí většina z těchto:
Velikost
desktop
vestavěný systém
paměť
úroveň GB
Úroveň kB (např. 2 kB paměti RAM)
načasování
Obecně flexibilní
Těsné, v reálném čase
ladění
Snadné (ladicí program, protokol)
Pevný (JTAG, sériový, LED)
Výsledek chyby
Program se zhroutí
Pohon/hardware může být poškozen
přístup ke zdrojům
Abstrakty OS
Direct access to the Register
Tyto rozdíly určují vaše kritéria pro vyhodnocení výstupu AI: využití paměti, reálný čas (neblokování) a přesnost hardwarových registrů jsou vždy na prvním místě vašeho kontrolního seznamu.
Blocker vs Non-Blocking Code
Nejčastější chybou začátečníků (a často AI) je použití delay(). delay(1000) locks the processor for 1 second; Během této doby nelze číst žádná další čidla, nelze ovládat žádná tlačítka. This is unacceptable in mechatronics. Místo toho se používá neblokující vzor založený na millis().
// BAD: blocker -- procesor nemůže dělat žádnou jinou práci po dobu 1 sekundy void loop() { digitalWrite(LED, HIGH); zpoždění(1000); // everything stops digitalWrite(LED, LOW); zpoždění(1000); // Nouzové tlačítko nelze v tuto chvíli přečíst!}// DOBRÉ: neblokování -- smyčka není blokována, ostatní úlohy se spustí if (nowMs - previousMs >= interval) { previousMs = nowMs; ledStatus = !ledStatus; digitalWrite(LED, ledStatus); } buttonCheck(); // can run in every cycle sensorRead(); //může běžet v libovolné smyčce}
Neblokující vzor je základem vestavěné mechatroniky: regulační smyčka plyne nepřetržitě, žádný úkol nezamyká jiný. Když řeknete AI, aby při psaní kódu „nepoužívejte zpoždění, pište neblokování založené na miliskách“, přímo zlepšuje kvalitu výstupu.
Tip: Hledejte zpoždění ( ve vloženém kódu z AI. Pokud vidíte zpoždění v hlavní řídicí smyčce, nejčastěji tento kód není vhodný pro systém v reálném čase a měl by být přepsán.
Přerušení a časovače
Časově kritické události (puls kodéru, tlačítko, periodické vzorkování) zachycujeme s přerušeními namísto čekání v hlavní smyčce. Rutina přerušení (ISR) by měla být napsána krátce a pečlivě: žádná zpoždění, Serial.print nebo dlouhé výpočty v ní; Shared variables are marked volatile.
volatile long encoderCounter = 0; // ISR a smyčka jsou sdíleny -> nestálá podmínka void enkoderISR() { // Short ISR: stačí počítat, nic jiného nedělat if (digitalRead(ENC_B)) enkoderCounter++; else encoderCounter--;}void setup() { pinMode(ENC_A, INPUT_PULLUP); pinMode(ENC_B, INPUT_PULLUP); připojitInterrupt(digitalPinToInterrupt(ENC_A), enkoderISR, RISING);}void loop() { long counter; noInterrupts(); //krátká přerušení pro atomický čítač čtení = encoderCounter; přerušení(); //transact safely with the counter...}
Tři kritické body v tomto příkladu jsou místa, kde AI často chybí: (1) sdílený kodérCounter musí být „volatilní“, jinak optimalizace kompilátoru vynechá aktualizace; (2) the ISR should be short; (3) Při čtení vícebajtové proměnné v hlavní smyčce musí být přerušení pro atomické čtení na krátkou dobu uzavřena, jinak může do čtení zasáhnout ISR a může být načtena poloviční/poškozená hodnota (race condition). Nezapomeňte zkontrolovat, zda jsou tyto tři přítomny v kódu AI.
Register Accuracy and Datasheet
AI může věrohodně zkreslit adresu registru senzoru nebo konfigurační bit MCU. Například registr řízení spotřeby MPU6050 IMU je 0x6B; Pokud to AI uvede jako 0x6A, kód je zkompilován, zdá se, že funguje, ale senzor se neprobudí. Takové chyby jsou detekovány pouze při porovnání s datasheetem.
// probuzení MPU6050: podle datasheetu PWR_MGMT_1 = 0x6B, hodnota 0x00#definovat MPU_ADDR 0x68#definovat PWR_MGMT_1 0x6B // <-- VERIFY from datasheetWire.beginTransmission(MPU_ADDR);Wire.write(PWR_MGMT_1);Wire.write(0x00); // probuzení z režimu spánkuWire.endTransmission(true);
Upozornění: Ověřte každou adresu registru, bitovou masku a adresu I2C/SPI zadanou AI z datového listu. Tyto hodnoty jsou specifické pro kartu a čip; Hodnota, kterou si AI „pamatuje“, může být z jiné revize čipu. Nesprávný registr tiše vede k nesprávnému chování.
Slabá výzva / Silná výzva
SLABÝ:"Čtení teplotního senzoru na ESP32."(Který senzor? Který protokol? Který pin? Obecný, pravděpodobně špatný kód.)STRONG:"Čtení teplotního senzoru DS18B20 na ESP32 (Arduino framework) z GPIO4 pomocí OneWire. Neblokování zápisu, vzorkování každou 1 sekundu (pomocí zpoždění, hodnota chyby čtení v milis7 nebo oprava -1). každá knihovna a připojení pinů, které použijete v prvním komentáři, použijte z paměťových důvodů místo řetězce String.
Výkonná výzva; Poskytuje čip, framework, senzor, protokol, pin, vzor vzorkování, chybový stav a paměťové omezení. Tímto způsobem je výstup jak ověřitelný, tak realistický.
Review Checklist for Embedded Code
Před načtením výstupu AI jej projděte tímto seznamem:
- Blokování: Je v hlavní smyčce zpoždění nebo dlouhé blokování?
- volatilní: Jsou proměnné sdílené s ISR volatilní?
- Atomový přístup: Je vícebajtová sdílená proměnná bezpečná ke čtení?
- Registrovat: Jsou adresy a bitové masky kompatibilní s datovým listem?
- Paměť: Řetězec, velká pole, vytváří rekurze přetečení úrovně KB?
- Zpracování chyb: Jsou zpracovány chyby čtení senzoru, časové limity komunikace?
- Bezpečný start: Jsou výstupy akčního členu při spuštění v bezpečném (pasivním) stavu?
Mini pouzdro
Inženýr vestavěných systémů Baran nechal AI napsat kód, který čte IMU pro dron. Kód se zkompiluje a zdá se, že funguje, ale hodnoty úhlu jsou nesmyslné. Baran použije kontrolní seznam: porovná adresy registrů s datovým listem a zjistí, že AI nesprávně vydává konfigurační registr gyroskopu (0x1A místo 0x1B), takže stupnice citlivosti je špatná. Po opravě se hodnoty ustálí. Pak delay(10) upozornění v hlavní smyčce; převést to na strukturu založenou na miliskách, protože blokování smyčky řízení letu je nepřijatelné. Nakonec zjistí, že sdílená proměnná čítače není volatilní a přidá ji. AI dala kostru rychle; Ale seznam recenzí zachytil tři samostatné chyby: registr, blokování a nestálost a hardware nebyl vůbec ohrožen.
Časté chyby
- Zabití odezvy v reálném čase pomocí delay() v hlavní řídicí smyčce.
- Vyhněte se tomu, aby proměnná sdílená s ISR byla nestálá a nedocházelo k tichému poškození dat.
- Čtení vícebajtové sdílené proměnné neatomicky a generování sporu.
- Neověřuje se registr/bitové masky dané AI v datovém listu.
- Vytvoření přetečení paměti pomocí řetězců a velkých polí v omezené paměti RAM.
- Zapomínání na prvotní zabezpečení výstupů akčních členů.
V souhrnu
- Vložený kód; Pracuje s omezenou pamětí, krátkým načasováním a přímým přístupem k registru.
- V hlavní smyčce je místo zpoždění použit neblokující vzor založený na miliskách.
- ISR je udržován krátký; sdílené proměnné musí být nestálé a musí mít atomický přístup.
- Adresy registrů a bitové masky jsou vždy ověřeny podle datasheetu; AI se může mýlit.
- Paměť, zpracování chyb a stav bezpečného spuštění jsou vždy kontrolovány.
- Výkonná výzva; Zahrnuje čip, framework, senzor, protokol, pin a omezení.
Aplikační úkol
Vyberte senzor (např. DS18B20, MPU6050 nebo HC-SR04) a mikrokontrolér (Arduino/ESP32/STM32). Nechte AI vygenerovat neblokující čtený kód pomocí výkonné šablony výzvy v této jednotce. Poté postupujte podle sedmi položek kontrolního seznamu pro kontrolu jednu po druhé: porovnejte alespoň jednu hodnotu registru/pinu s datovým listem, zkontrolujte zpoždění smyčky, zkontrolujte nestálý stav sdílených proměnných. Kolik položek „prošlo“ na první pokus a kolik vyžadovalo opravu? Poznamenejte si každý problém, který najdete, a jeho opravu.