Vienība 3 / 9

Iegultās sistēmas un mikrokontrolleru kodu ģenerēšana

Ieguvumi:

  • Spēja ģenerēt iegulto kodu, ņemot vērā reģistru un aparatūras kontekstu Arduino/STM32/ESP32 ar AI
  • Spēja atpazīt un labot iegultos modeļus, piemēram, pārtraukumus, taimerus un nebloķējošas cilpas AI izvadē
  • Iespēja pārskatīt ģenerēto kodu atmiņas, reāllaika un drošības ziņā pirms tā augšupielādes aparatūrā

Mehatronikā mikrokontrolleris ir vieta, kur idejas satiekas ar fizisko pasauli. Kartes, piemēram, Arduino, STM32, ESP32; tas nolasa sensorus, vada izpildmehānismus, sazinās un to visu dara ierobežotas atmiņas, ierobežotas apstrādes jaudas un stingru laika prasību apstākļos. Mākslīgais intelekts šajā jomā ir ļoti noderīgs: tas var iegūt reģistra iestatījumus, pamatojoties uz sensora datu lapu, kodēt sakaru protokolu, iestatīt taimera pārtraukumu. Taču iegultās sistēmas ir viena no jomām, kur AI rada “pārliecinošākos nepatiesības”; jo reģistru adreses, bitu maskas un laika darbības ir raksturīgas platei, un viena bita kļūda izjauc visu darbību. Šajā nodaļā ir aprakstīts, kā ar AI ģenerēt iegulto kodu un kā to pārskatīt pirms tā ielādēšanas aparatūrā.

Iegultā koda atšķirība no tīrās programmatūras

Darbvirsmas programmai ir daudz atmiņas, operētājsistēmas un vienkārša atkļūdošana. Iegultajam kodam trūkst lielākās daļas no šiem:

Izmērs

darbvirsma

iegultā sistēma

atmiņa

GB līmenī

KB līmenis (piemēram, 2 KB RAM)

laika noteikšana

Kopumā elastīgs

Stingri, reāllaikā

atkļūdošana

Viegli (atkļūdotājs, žurnāls)

Ciets (JTAG, sērijas, LED)

Kļūdas rezultāts

Programma avarē

Var tikt bojāts izpildmehānisms/aparatūra

piekļuvi resursiem

OS kopsavilkumi

Tieša piekļuve reģistram

Šīs atšķirības nosaka jūsu kritērijus AI izvades novērtēšanai: atmiņas lietojums, reāllaika (nebloķēšanas) un aparatūras reģistra precizitāte vienmēr ir jūsu kontrolsaraksta augšgalā.

Bloķētājs pret nebloķējošo kodu

Visizplatītākā kļūda, ko pieļauj iesācēji (un bieži pieļauj arī mākslīgais intelekts), ir aizkaves (delay) izmantošana. delay(1000) bloķē procesoru uz 1 sekundi; Šajā periodā nevar nolasīt citus sensorus, nevar vadīt nevienu pogu. Mehatronikā tas ir nepieņemami. Tā vietā tiek izmantots nebloķējošs modelis, kura pamatā ir millis ().

// SLIKTI: bloķētājs -- procesors nevar veikt nekādu citu darbu 1 sekundi void loop() { digitalWrite(LED, HIGH); kavēšanās (1000); // viss apstājas digitalWrite(LED, LOW); kavēšanās (1000); // Avārijas pogu pašlaik nevar nolasīt!}// LABI: nebloķēšana -- cilpa nav bloķēta, citi uzdevumi tiek izpildīti if (nowMs - previousMs >= interval) { previousMs = nowMs; ledStatus = !ledStatus; digitalWrite(LED, ledStatus); } pogaCheck(); // var darboties katrā ciklā sensorsRead(); //var darboties jebkurā cilpā}

Nebloķējošais modelis ir iegultās mehatronikas pamatā: vadības cilpa plūst nepārtraukti, neviens uzdevums nebloķē citu. Sakot AI “neizmantojiet aizkavi, rakstiet uz milimetriem balstītu nebloķēšanu”, rakstot kodu, tieši uzlabo izvades kvalitāti.

Padoms: meklējiet aizkavi( iegultajā kodā no AI. Ja redzat aizkavi galvenajā vadības cilpā, visbiežāk šis kods nav piemērots reāllaika sistēmai un ir jāpārraksta.

Pārtraukumi un taimeri

Mēs tveram laika kritiskos notikumus (kodētāja impulsu, pogu, periodisku iztveršanu) ar pārtraukumiem, nevis gaidīšanu galvenajā cilpā. Pārtraukšanas rutīna (ISR) jāraksta īsi un uzmanīgi: tajā nav kavēšanās, Serial.print vai gari aprēķini; Koplietojamie mainīgie ir atzīmēti kā nepastāvīgi.

gaistošs long encoderCounter = 0; // ISR un cilpa ir koplietotas -> nepastāvīgs nosacījums void enkoderISR() { // Īss ISR: vienkārši saskaitiet, neveiciet citus darbus 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() { long counter; noInterrupts(); //īsi pārtraukumi atomu nolasīšanas skaitītājam = encoderCounter; pārtrauc(); // droši veiciet darījumus ar skaitītāju...}

Trīs kritiskie punkti šajā piemērā ir tie, kur AI bieži tiek pietrūkts: (1) koplietotajam kodētāja skaitītājam jābūt nepastāvīgam, pretējā gadījumā kompilatora optimizācija palaidīs garām atjauninājumus; (2) ISR jābūt īsam; (3) Lasot vairāku baitu mainīgo galvenajā cilpā, uz īsu laiku ir jāslēdz pārtraukumi atomu nolasīšanai, pretējā gadījumā lasīšanas laikā var iejaukties ISR un var tikt nolasīta puse/sabojāta vērtība (race nosacījums). Noteikti pārbaudiet, vai šie trīs ir iekļauti AI kodā.

Reģistrācijas precizitāte un datu lapa

AI var ticami nepareizi attēlot sensora reģistra adresi vai MCU konfigurācijas bitu. Piemēram, MPU6050 IMU jaudas pārvaldības reģistrs ir 0x6B; Ja AI piešķir to kā 0x6A, kods tiek apkopots, šķiet, ka tas darbojas, bet sensors nepamostas. Šādas kļūdas tiek atklātas tikai tad, ja tās salīdzina ar datu lapu.

// MPU6050 modināšana: saskaņā ar datu lapu PWR_MGMT_1 = 0x6B, vērtība 0x00#define MPU_ADDR 0x68#define PWR_MGMT_1 0x6B // <-- PĀRBAUDE no datu lapaWire.beginTransmission(MPU_ADDR);Wire.write(PWR_MGMT_1);Wire.write(0x00); // pamosties no miega režīmaWire.endTransmission(true);

Uzmanību: pārbaudiet katru reģistra adresi, bitu masku un I2C/SPI adresi, ko AI norādījis no datu lapas. Šīs vērtības ir atkarīgas no kartes un mikroshēmas; Vērtība, ko AI "atceras", var būt no citas mikroshēmas versijas. Nepareizs reģistrs klusi noved pie nepareizas uzvedības.

Vāja uzvedne / spēcīga uzvedne

VĀJS:"Nolasīt temperatūras sensoru uz ESP32."(Kurš sensors? Kurš protokols? Kurš kontakts? Vispārīgs, iespējams, nepareizs kods.)STRONG:"Lasiet DS18B20 temperatūras sensoru uz ESP32 (Arduino ietvara) no GPIO4, izmantojot OneWire. Rakstiet nebloķējošu, paraugu ik pēc 1 sekundes (izmantojot aizkavi, kļūdas milisekundēs vai karodziņu). Lūdzu, nolasiet 2. kļūdas vērtību. Lūdzu, iestatiet 8. pirmajā komentārā norādiet katru izmantoto bibliotēku un tapas savienojumu. Atmiņas dēļ izmantojiet rakstzīmju buferi, nevis String.

Spēcīga uzvedne; Tas sniedz mikroshēmu, sistēmu, sensoru, protokolu, tapu, paraugu ņemšanas modeli, kļūdas statusu un atmiņas ierobežojumu. Tādā veidā rezultāts ir gan pārbaudāms, gan reālistisks.

Pārskatiet iegultā koda kontrolsarakstu

Pirms AI izvades ielādes izlasiet to šajā sarakstā:

  1. Bloķēšana: vai galvenajā cilpā ir aizkavēšanās vai ilgstoša bloķēšana?
  2. nepastāvīgs: vai mainīgie, kas kopīgoti ar ISR, ir nepastāvīgi?
  3. Atomiskā piekļuve: vai vairāku baitu koplietotais mainīgais ir droši lasāms?
  4. Reģistrēties: vai adreses un bitu maskas ir saderīgas ar datu lapu?
  5. Atmiņa: virkne, lieli masīvi, vai rekursija rada KB līmeņa pārplūdi?
  6. Kļūdu apstrāde: vai tiek apstrādātas sensora nolasīšanas kļūdas, sakaru noildzes?
  7. Droša palaišana: vai palaišanas laikā izpildmehānisma izejas atrodas drošā (pasīvā) stāvoklī?

Mini futrālis

Iegulto sistēmu inženieris Barans licis AI uzrakstīt kodu, kas nolasa drona IMU. Kods tiek apkopots un, šķiet, darbojas, taču leņķa vērtībām nav nozīmes. Barans piemēro kontrolsarakstu: salīdzina reģistru adreses ar datu lapu un konstatē, ka AI nepareizi izvada žiroskopa konfigurācijas reģistru (0x1A, nevis 0x1B), tāpēc jutīguma skala ir nepareiza. Pēc labošanas vērtības tiek nokārtotas. Tad aizkaves(10) paziņojumi galvenajā cilpā; pārveidojot to par struktūru, kas balstīta uz milis, jo lidojuma vadības cilpas bloķēšana ir nepieņemama. Visbeidzot, tas redz, ka koplietotais skaitītāja mainīgais nav nepastāvīgs, un pievieno to. AI deva skeletu ātri; Bet pārskatīšanas sarakstā tika konstatētas trīs atsevišķas kļūdas: reģistrēšanās, bloķēšana un nepastāvība, un aparatūra vispār nebija apdraudēta.

Biežākās kļūdas

  • Reāllaika reakcijas nogalināšana, izmantojot aizkavi () galvenajā vadības cilpā.
  • Izvairieties no mainīgā lieluma, kas kopīgots ar ISR, nepastāvības un klusuma datu sabojāšanas.
  • Vairāku baitu koplietojamā mainīgā lasīšana neatomiski un sacensību nosacījuma ģenerēšana.
  • Nav pārbaudīts reģistrs/bitu maskas, ko AI sniedzis ar datu lapu.
  • Atmiņas pārpildes izveide, izmantojot virknes un lielus masīvus ierobežotā RAM.
  • Aizmirstot sākotnēji nodrošināt izpildmehānisma izejas.

Rezumējot

  • Iegultais kods; Tas darbojas ar ierobežotu atmiņu, saspringtu laiku un tiešu piekļuvi reģistram.
  • Galvenajā cilpā aizkaves vietā tiek izmantots uz milis balstīts nebloķējošs modelis.
  • ISR ir īss; koplietotajiem mainīgajiem ir jābūt nepastāvīgiem un tiem jābūt pieejamiem.
  • Reģistru adreses un bitu maskas vienmēr tiek pārbaudītas saskaņā ar datu lapu; AI var kļūdīties.
  • Vienmēr tiek pārbaudīta atmiņa, kļūdu apstrāde un drošas palaišanas statuss.
  • Spēcīga uzvedne; Tas ietver mikroshēmu, sistēmu, sensoru, protokolu, tapu un ierobežojumus.

Lietojumprogrammas uzdevums

Izvēlieties sensoru (piemēram, DS18B20, MPU6050 vai HC-SR04) un mikrokontrolleri (Arduino/ESP32/STM32). Lieciet AI ģenerēt nebloķējošu lasīšanas kodu, izmantojot jaudīgo uzvednes veidni šajā ierīcē. Pēc tam izpildiet septiņus pārskatīšanas kontrolsaraksta vienumus pa vienam: salīdziniet vismaz vienu reģistra/pin vērtību ar datu lapu, pārbaudiet cilpas aizkavi, pārbaudiet koplietoto mainīgo mainīgo statusu. Cik vienumu "izturēja" pirmajā mēģinājumā un cik bija nepieciešams labojums? Pierakstiet katru atrasto problēmu un tās labojumu.