Üksus 3 / 9

Manussüsteemid ja mikrokontrolleri koodide genereerimine

Kasu:

  • Võimalus luua AI-ga Arduino/STM32/ESP32 jaoks manustatud koodi antud registri ja riistvarakonteksti jaoks
  • Võimalus tuvastada ja parandada manustatud mustreid, nagu katkestused, taimerid ja mitteblokeerivad ahelad AI väljundis
  • Võimalus genereeritud koodi mälu, reaalajas ja turvalisuse osas enne selle riistvarasse üleslaadimist üle vaadata

Mehhatroonikas on mikrokontroller koht, kus ideed kohtuvad füüsilise maailmaga. Kaardid nagu Arduino, STM32, ESP32; see loeb andureid, juhib täiturmehhanisme, suhtleb ja teeb seda kõike piiratud mälu, piiratud töötlemisvõimsuse ja rangete ajastusnõuetega. Tehisintellekt on selles valdkonnas väga kasulik: see suudab anduri andmelehe alusel välja võtta registri sätteid, kodeerida sideprotokolli, seada taimeri katkestuse. Kuid manussüsteemid on üks valdkondi, kus tehisintellekt toodab kõige veenvamaid valesid; sest registri aadressid, bitimaskid ja ajastuskäitumine on plaadile omased ja ühe bitiviga häirib kogu käitumist. Selles jaotises käsitleme seda, kuidas luua manustatud koodi AI abil ja kuidas seda enne riistvarasse laadimist üle vaadata.

Manustatud koodi erinevus puhtast tarkvarast

Töölauaprogrammil on palju mälu, operatsioonisüsteem ja lihtne silumine. Manustatud koodil puudub enamik neist:

Suurus

töölaud

sisseehitatud süsteem

mälu

GB tase

KB tase (nt 2 KB RAM)

ajastus

Üldiselt paindlik

Tihe, reaalajas

silumine

Lihtne (siluja, logi)

Kõva (JTAG, jada, LED)

Viga tulemus

Programm jookseb kokku

Täiturmehhanism/riistvara võib olla kahjustatud

juurdepääs ressurssidele

OS-i kokkuvõtted

Otsene juurdepääs registrile

Need erinevused määravad teie kriteeriumid AI väljundi hindamiseks: mälukasutus, reaalajas (mitteblokeeriv) ja riistvararegistri täpsus on alati teie kontrollnimekirja tipus.

Blokeerija vs mitteblokeeriv kood

Kõige levinum viga, mida algajad teevad (ja mida sageli teeb ka AI), on viivituse() kasutamine. delay(1000) lukustab protsessori 1 sekundiks; Sel perioodil ei saa lugeda teisi andureid, ei saa juhtida ühtegi nuppu. See on mehhatroonikas vastuvõetamatu. Selle asemel kasutatakse millis()-põhist mitteblokeerivat mustrit.

// HALB: blokeerija -- protsessor ei saa 1 sekundi jooksul teha muud tööd void loop() { digitalWrite(LED, HIGH); viivitus(1000); // kõik peatub digitalWrite(LED, LOW); viivitus(1000); // Hädaabinuppu ei saa praegu lugeda!}// HEA: mitteblokeeriv -- tsükkel ei ole blokeeritud, muud toimingud jooksevad if (nowMs - previousMs >= interval) { previousMs = nowMs; ledStatus = !ledStatus; digitalWrite(LED, ledStatus); } nuppKontrolli(); // võib töötada igas tsüklis sensorRead(); //võib töötada mis tahes tsüklis}

Mitteblokeeriv muster on sisseehitatud mehhatroonika alus: juhtimisahel voolab pidevalt, ükski ülesanne ei lukusta teist. Öelge AI-le koodi kirjutamisel "ärge kasutage viivitust, kirjutage millispõhiselt blokeerimata", parandab otseselt väljundi kvaliteeti.

Näpunäide. Otsige tehisintellekti manustatud koodist viivitust (viivitust). Kui näete peamises juhtahelas viivitust, siis enamasti ei sobi see kood reaalajas süsteemi jaoks ja see tuleks ümber kirjutada.

Katkestused ja taimerid

Ajakriitilisi sündmusi (kooderi impulss, nupp, perioodiline diskreetimine) jäädvustame katkestustega, selle asemel, et põhiahelas oodata. Katkestuste rutiin (ISR) tuleks kirjutada lühidalt ja hoolikalt: selles ei tohi olla viivitusi, Serial.print ega pikki arvutusi; Jagatud muutujad on märgitud muutlikuks.

volatile long encoderCounter = 0; // ISR ja silmus on jagatud -> volatile condition void enkoderISR() { // Lühike ISR: lihtsalt loe, ära muud tööd tee 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() { pikk loendur; noInterrupts(); //lühikesed katkestused aatomi lugemise loenduri jaoks = encoderCounter; katkestab(); //tehing ohutult letiga...}

Selles näites on kolm kriitilist punkti, kus tehisintellekt jätab sageli vahele: (1) jagatud kodeerijaloendur peab olema muutlik või kompilaatori optimeerimine jätab värskendused vahele; (2) ISR peaks olema lühike; (3) Mitmebaidise muutuja lugemisel põhiahelas tuleb aatomi lugemise katkestused lühikeseks ajaks sulgeda, vastasel juhul võib lugemise ajal sekkuda ISR ja lugeda pool/rikutud väärtust (rassitingimus). Kontrollige kindlasti, kas need kolm on AI-koodis olemas.

Registreeri täpsus ja andmeleht

AI võib anduri registriaadressi või MCU konfiguratsioonibitti usaldusväärselt valesti esitada. Näiteks MPU6050 IMU toitehalduse register on 0x6B; Kui AI annab selle väärtuseks 0x6A, kompileeritakse kood, tundub, et see töötab, kuid andur ei ärka. Sellised vead tuvastatakse ainult andmelehega võrreldes.

// MPU6050 äratus: vastavalt andmelehele PWR_MGMT_1 = 0x6B, väärtus 0x00#define MPU_ADDR 0x68#define PWR_MGMT_1 0x6B // <-- KINNITA alates andmelehtWire.beginTransmission(MPU_ADDR);Traat.kirjutamine(PWR_MGMT_1);Traat.kirjutus(0x00); // ärkama puhkerežiimist Wire.endTransmission(true);

Tähelepanu: Kontrollige andmelehel iga AI poolt antud registri aadressi, bitimaski ja I2C/SPI aadressi. Need väärtused on kaardi- ja kiibipõhised; Väärtus, mida AI "mäletab", võib pärineda teisest kiibi versioonist. Vale register viib vaikselt vale käitumiseni.

Nõrk viip / Tugev viip

NÕRK:"EsP32 temperatuurianduri lugemine." (Milline andur? Milline protokoll? Milline viik? Üldine, tõenäoliselt vale kood.) STRONG:"Lugege GPIO4-st OneWire'iga DS18B20 temperatuuriandurit ESP32-l (Arduino raamistik). Kirjutage mitteblokeeriv, näidis iga 1 sekundi järel (kasutades viivitust, millimeetripõhiselt). Määrake vea väärtus 5 või 7. Lugege -2. määrake esimeses kommentaaris kõik kasutatavad teegid ja pin-ühendused.

Võimas viip; See annab kiibi, raamistiku, anduri, protokolli, tihvti, diskreetimismustri, veaoleku ja mälupiirangu. Nii on väljund nii kontrollitav kui ka realistlik.

Vaadake manustatud koodi kontrollnimekiri

Enne AI väljundi laadimist läbige see loend:

  1. Blokeerimine: kas põhiahelas on viivitus või pikk blokeerimine?
  2. volatiilne: kas ISR-iga jagatud muutujad on kõikuvad?
  3. Aatomijuurdepääs: kas mitmebaidise jagatud muutuja lugemine on ohutu?
  4. Registreeru: kas aadressid ja bitimaskid ühilduvad andmelehega?
  5. Mälu: string, suured massiivid, kas rekursioon tekitab KB taseme ülevoolu?
  6. Vigade käsitlemine: kas anduri lugemise vigu ja side ajalõppusid käsitletakse?
  7. Ohutu käivitamine: kas täiturmehhanismi väljundid on käivitamisel asetatud ohutusse (passiivsesse) olekusse?

Mini korpus

Manussüsteemide insener Baran laseb tehisintellektil kirjutada koodi, mis loeb drooni IMU-d. Kood kompileerub ja näib töötavat, kuid nurga väärtused on mõttetud. Baran rakendab kontrollnimekirja: võrdleb registri aadresse andmelehega ja leiab, et AI väljastab güroskoobi konfiguratsiooniregistri valesti (0x1B asemel 0x1A), seega on tundlikkuse skaala vale. Pärast parandamist väärtused settivad. Seejärel teatab viivitus(10) põhitsüklis; teisendades selle millipõhiseks struktuuriks, sest lennujuhtimisahela blokeerimine on vastuvõetamatu. Lõpuks näeb see, et jagatud loenduri muutuja ei ole muutlik ja lisab selle. AI andis skeletile kiiresti; Kuid ülevaatuste loendis tuvastati kolm eraldi viga: registreerimine, blokeerimine ja volatiilne ning riistvara polnud üldse ohus.

Levinud vead

  • Reaalajas vastuse tapmine, kasutades peamises juhtahelas delay()
  • Vältige ISR-iga jagatud muutuja muutmist volatiilseks ja vaikivat andmete riknemist.
  • Mitmebaidise jagatud muutuja lugemine mitteaatomiliselt ja võistlustingimuse genereerimine.
  • Tehisintellekti andmelehega antud registri-/bitimaske ei kontrollita.
  • Mälu ületäitumise loomine stringide ja suurte massiivide abil piiratud RAM-is.
  • Unustades algselt kindlustada täiturmehhanismi väljundeid.

Kokkuvõttes

  • Manustatud kood; See töötab piiratud mälu, tiheda ajastuse ja otsese juurdepääsuga registrile.
  • Põhitsüklis kasutatakse viivituse asemel millispõhist mitteblokeerivat mustrit.
  • ISR on lühike; jagatud muutujad peavad olema muutlikud ja neile peab olema juurdepääs.
  • Registri aadressid ja bitimaskid kontrollitakse alati andmelehe alusel; AI võib eksida.
  • Mälu, veakäsitlust ja ohutut käivitamise olekut kontrollitakse alati.
  • Võimas viip; See sisaldab kiipi, raamistikku, andurit, protokolli, tihvti ja piiranguid.

Rakenduse ülesanne

Valige andur (nt DS18B20, MPU6050 või HC-SR04) ja mikrokontroller (Arduino/ESP32/STM32). Laske tehisintellektil luua selle seadme võimsa viipamalli abil mitteblokeeriv lugemiskood. Seejärel järgige ükshaaval seitset ülevaatuse kontrollnimekirja üksust: võrrelge vähemalt ühte registri/pin väärtust andmelehega, kontrollige tsükli viivitusi, kontrollige jagatud muutujate muutlikku olekut. Mitu elementi "läbis" esimesel katsel ja kui palju vajasid parandust? Pange tähele iga leitud probleem ja selle lahendus.