Pelnas:
- Galimybė generuoti įterptąjį kodą pagal registrą ir aparatinės įrangos kontekstą, skirtą Arduino / STM32 / ESP32 su AI
- Gebėjimas atpažinti ir taisyti įterptus modelius, tokius kaip pertraukimai, laikmačiai ir neblokuojančios AI išvesties kilpos
- Galimybė peržiūrėti sugeneruotą kodą atminties, realiojo laiko ir saugumo požiūriu prieš įkeliant jį į aparatinę įrangą
Mechatronikoje mikrovaldiklis yra vieta, kur idėjos susitinka su fiziniu pasauliu. Tokios kortelės kaip Arduino, STM32, ESP32; jis nuskaito jutiklius, valdo pavaras, bendrauja ir visa tai daro turėdamas ribotą atmintį, ribotą apdorojimo galią ir griežtus laiko reikalavimus. Dirbtinis intelektas šioje srityje labai praverčia: jis gali išgauti registro nustatymus pagal jutiklio duomenų lapą, užkoduoti ryšio protokolą, nustatyti laikmačio pertraukimą. Tačiau įterptosios sistemos yra viena iš sričių, kur AI sukuria „įtikinamiausius melus“; nes registrų adresai, bitų kaukės ir laiko elgsena yra būdingi plokštėms ir vienos bito klaida sutrikdo visą elgesį. Šiame skyriuje aptariame, kaip sukurti įterptąjį kodą, sugeneruotą naudojant AI, ir kaip jį peržiūrėti prieš įkeliant į aparatinę įrangą.
Įterptojo kodo skirtumas nuo grynos programinės įrangos
Darbalaukio programoje yra daug atminties, operacinė sistema ir paprasta derinti. Įterptajame kode trūksta daugumos šių dalykų:
Dydis
darbalaukis
įterptoji sistema
atmintis
GB lygis
KB lygis (pvz., 2 KB RAM)
laiko nustatymas
Paprastai lankstus
Įtempta, realiu laiku
derinimas
Lengva (derinimo priemonė, žurnalas)
Kietas (JTAG, serijinis, LED)
Klaidos rezultatas
Programa sugenda
Pavara / techninė įranga gali būti pažeista
prieiga prie išteklių
OS santraukos
Tiesioginė prieiga prie registro
Šie skirtumai lemia jūsų AI išvesties vertinimo kriterijus: atminties naudojimas, realaus laiko (neblokavimo) ir aparatinės įrangos registro tikslumas visada yra jūsų kontrolinio sąrašo viršuje.
Blokatorius prieš neblokuojantį kodą
Dažniausia pradedančiųjų klaida (ir dažnai daroma dirbtinio intelekto) yra delsos naudojimas (). delay(1000) užrakina procesorių 1 sekundei; Per šį laikotarpį negalima nuskaityti kitų jutiklių, negalima valdyti jokių mygtukų. Tai nepriimtina mechatronikoje. Vietoj to naudojamas milis() pagrįstas neblokuojantis modelis.
// BLOGAS: blokatorius -- procesorius negali atlikti jokio kito darbo 1 sekundę void loop() { digitalWrite(LED, HIGH); delsimas (1000); // viskas sustoja digitalWrite(LED, LOW); delsimas (1000); // Šiuo metu negalima nuskaityti avarinio mygtuko!}// GERAI: neblokuojantis -- ciklas neužblokuotas, kitos užduotys vykdomos if (nowMs - previousMs >= interval) { previousMs = nowMs; ledStatus = !ledStatus; digitalWrite(LED, ledStatus); } mygtukasCheck(); // gali veikti kiekviename cikle sensorRead(); //gali veikti bet kokiame cikle}
Neblokuojantis modelis yra įterptosios mechatronikos pagrindas: valdymo kilpa teka nuolat, jokia užduotis neužblokuoja kitos. Patarimas AI rašant kodą „nenaudokite delsos, rašyk militais pagrįstą neblokavimą“, tiesiogiai pagerina išvesties kokybę.
Patarimas: ieškokite delsos( įterptajame kode iš AI. Jei matote vėlavimą pagrindinėje valdymo kilpoje, dažniausiai tas kodas netinka realaus laiko sistemai ir turėtų būti perrašytas.
Pertraukimai ir laikmačiai
Laikui svarbius įvykius (kodavimo pulsą, mygtuką, periodinį atranką) fiksuojame su pertraukimais, o ne laukdami pagrindinėje kilpoje. Pertraukimo rutina (ISR) turi būti parašyta trumpai ir atsargiai: joje nėra vėlavimų, Serial.print ar ilgų skaičiavimų; Bendrinami kintamieji pažymėti nepastoviais.
nepastovus ilgas encoderCounter = 0; // ISR ir ciklas yra bendrinami -> nepastovi sąlyga void enkoderISR() { // Trumpas ISR: tiesiog suskaičiuokite, nedarykite kitų darbų if (digitalRead(ENC_B)) enkoderCounter++; else encoderCounter--;}void setup() { pinMode(ENC_A, INPUT_PULLUP); pinMode(ENC_B, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(ENC_A), enkoderISR, RISING);}void loop() { ilgas skaitiklis; noInterrupts(); //trumpi atominio skaitymo skaitiklio pertraukimai = encoderCounter; pertraukia(); //saugiai atlikite sandorį su skaitikliu...}
Trys kritiniai taškai šiame pavyzdyje yra tai, kur AI dažnai praleidžia: (1) bendrinamas kodavimo skaitiklis turi būti nepastovus, kitaip kompiliatoriaus optimizavimas praleis atnaujinimus; (2) ISR turėtų būti trumpas; (3) Skaitant kelių baitų kintamąjį pagrindinėje kilpoje, atominio skaitymo pertraukos turi būti trumpam uždarytos, kitaip skaitymo metu gali įsikišti ISR ir gali būti nuskaityta pusė/sugadinta reikšmė (rasės sąlyga). Būtinai patikrinkite, ar šie trys yra AI kode.
Registracijos tikslumas ir duomenų lapas
AI gali patikimai klaidingai pateikti jutiklio registro adresą arba MCU konfigūracijos bitą. Pavyzdžiui, MPU6050 IMU maitinimo valdymo registras yra 0x6B; Jei AI nurodo tai kaip 0x6A, kodas sukompiliuojamas, atrodo, kad jis veikia, bet jutiklis neatsibunda. Tokios klaidos aptinkamos tik palyginus su duomenų lapu.
// MPU6050 pažadinimas: pagal duomenų lapą PWR_MGMT_1 = 0x6B, reikšmė 0x00#define MPU_ADDR 0x68#define PWR_MGMT_1 0x6B // <-- PATIKRINTI iš datasheetWire.beginTransmission(MPU_ADDR);Laidas.rašymas(PWR_MGMT_1);Laidas.rašymas(0x00); // pabusti iš miego režimoWire.endTransmission(true);
Dėmesio: patikrinkite kiekvieną registro adresą, bitų kaukę ir I2C/SPI adresą, pateiktą AI iš duomenų lapo. Šios vertės priklauso nuo kortelės ir lusto; Vertė, kurią AI „atsimena“, gali būti iš kitos lusto versijos. Neteisingas registras tyliai veda prie neteisingo elgesio.
Silpnas raginimas / stiprus raginimas
SILPNAS: "Nuskaitykite temperatūros jutiklį ESP32." (Kuris jutiklis? Kuris protokolas? Kuris kaištis? Bendras, tikriausiai neteisingas kodas.) STIPRUS: "Nuskaitykite DS18B20 temperatūros jutiklį ESP32 (Arduino sistema) iš GPIO4 su OneWire. Rašykite neblokuojantį, pavyzdį kas 1 sekundę (naudojant delsą, ištaisykite 5 klaidos atvejį). Nuskaitykite -1 klaidos atvejį). pirmame komentare nurodykite kiekvieną naudojamą biblioteką ir PIN ryšį.
Galingas raginimas; Tai suteikia lustą, sistemą, jutiklį, protokolą, kaištį, mėginių ėmimo modelį, klaidos būseną ir atminties apribojimus. Tokiu būdu išvestis yra patikrinama ir tikroviška.
Peržiūrėkite įterptojo kodo kontrolinį sąrašą
Prieš įkeldami dirbtinio intelekto išvestį, peržiūrėkite šį sąrašą:
- Blokavimas: ar pagrindinėje kilpoje yra vėlavimas arba ilgalaikis blokavimas?
- nepastovus: ar su ISR bendrinami kintamieji yra nepastovi?
- Atominė prieiga: ar saugu skaityti kelių baitų bendrinamą kintamąjį?
- Registracija: ar adresai ir bitų kaukės suderinami su duomenų lapu?
- Atmintis: eilutė, dideli masyvai, ar rekursija sukuria KB lygio perpildymą?
- Klaidų tvarkymas: ar tvarkomos jutiklio skaitymo klaidos, ryšio laikas?
- Saugus paleidimas: ar paleidimo metu pavaros išėjimai yra saugioje (pasyvioje) būsenoje?
Mini dėklas
Įterptųjų sistemų inžinierius Baranas leidžia dirbtiniam intelektui parašyti kodą, kuris nuskaito drono IMU. Kodas kompiliuojamas ir, atrodo, veikia, tačiau kampo reikšmės yra beprasmės. Baranas taiko kontrolinį sąrašą: palygina registrų adresus su duomenų lapu ir nustato, kad AI neteisingai išveda giroskopo konfigūracijos registrą (0x1A vietoj 0x1B), todėl jautrumo skalė neteisinga. Ištaisius, vertės nusistovi. Tada delsos(10) pranešimai pagrindinėje kilpoje; paverčiant tai į milis pagrįstą struktūrą, nes skrydžio valdymo kilpos blokavimas yra nepriimtinas. Galiausiai jis mato, kad bendras skaitiklio kintamasis nėra nepastovus, ir jį prideda. AI greitai davė skeletą; Tačiau peržiūros sąraše buvo trys atskiros klaidos: registravimo, blokavimo ir nepastovios klaidos, o aparatūrai iš viso nekilo pavojus.
Dažnos klaidos
- Realaus laiko atsako sunaikinimas naudojant delay() pagrindinėje valdymo kilpoje.
- Stenkitės, kad su ISR bendrinamas kintamasis nebūtų nepastovus ir nepatirtų tylių duomenų sugadinimo.
- Kelių baitų bendrinamo kintamojo skaitymas ne atomiškai ir lenktynių sąlygos generavimas.
- Nepatvirtinama AI pateiktų registrų / bitų kaukių su duomenų lapu.
- Atminties perpildymo kūrimas naudojant eilutes ir didelius masyvus ribotoje RAM.
- Pamirštama iš pradžių apsaugoti pavaros išėjimus.
Apibendrinant
- Įdėtas kodas; Jis veikia su ribota atmintimi, trumpu laiku ir tiesiogine prieiga prie registro.
- Pagrindinėje kilpoje vietoj delsos naudojamas milis pagrįstas neblokuojantis modelis.
- ISR yra trumpas; bendrinami kintamieji turi būti nepastovūs ir pasiekiami atomiškai.
- Registrų adresai ir bitų kaukės visada tikrinami pagal duomenų lapą; AI gali klysti.
- Visada tikrinama atmintis, klaidų apdorojimas ir saugaus paleidimo būsena.
- Galingas raginimas; Tai apima lustą, sistemą, jutiklį, protokolą, kaištį ir apribojimus.
Taikymo užduotis
Pasirinkite jutiklį (pvz., DS18B20, MPU6050 arba HC-SR04) ir mikrovaldiklį (Arduino / ESP32 / STM32). Leiskite AI sugeneruoti neblokuojantį skaitymo kodą naudodami galingą šio įrenginio raginimo šabloną. Tada vadovaukitės septyniais peržiūros kontrolinio sąrašo punktais po vieną: palyginkite bent vieną registro / kaiščio reikšmę su duomenų lapu, patikrinkite, ar nėra kilpos vėlavimų, patikrinkite bendrinamų kintamųjų nepastovumą. Kiek elementų „praėjo“ pirmuoju bandymu ir kiek reikėjo pataisyti? Atkreipkite dėmesį į kiekvieną aptiktą problemą ir jos sprendimą.