Üksus 3 / 9

Manussüsteemid ja mikrokontrolleri kood

Kasu:

  • Võimalus määratleda mikrokontrolleri registri-, katkestus- ja ajastusnõuded selge viipaga
  • Võimalus kontrollida AI toodetud C/Arduino koodi registriseadete, puhvri ületäitumise ja reaalajas piirangute osas
  • Võimalus rakendada loodud koodi kontrollimise harjumust, mõõtes seda riistvaras (ostsilloskoop, jadaport)

Manussüsteemide arendus on koht, kus tarkvara ja riistvara ristuvad: registribiti valesti seadistamine, katkestuse liiga pikaks hoidmine või puhvri ületäitumine põhjustab väljas kummalisi, raskesti taasesitavaid tõrkeid, kuigi kood "kompileerib" ja töötab. AI on selles valdkonnas tõeline kiirendaja; See võib toota esialgseid skelette, riistvara abstraktsioonifunktsioone, olekumasinaid ja suhtlusrutiine. Kuid AI ei näe teie kaardi andmelehte, ei tea teie kella sagedust ega taju teie reaalajas piiranguid. Selles tükis käsitleme, kuidas selgelt määratleda mikrokontrolleri tööd tehisintellektile, kuidas kontrollida genereeritud C/Arduino koodi ja miks peaks kõike riistvaras mõõtma.

Nõude selge määratlemine: registreerimine, lõikamine, ajastus

Tehisintellekti käsk "valgustada LED" ei tööta; Milline kaart, milline pin, milline taktsagedus, milline ajastus? Manustatud ülesande määramisel tehisintellektile kasutage seda raamistikku: riistvara (MCU perekond, kell, pin), funktsioon (mis juhtub), piirang (ajastus, võimsus, mälu) ja liides (register, HAL, Arduino teek).

Nõrk viip / Tugev viip

NÕRK: "Tootke PWM-i STM32-ga." (Tulemus: milline taimer, milline sagedus, milline viik on ebaselge; üldine, tõenäoliselt vale registrinimega kood.) TUGEV: "Tootke 20 kHz, 0–100% reguleeritav PWM TIM3 CH1 (PA6) jaoks STM32F103 jaoks (72 MHz süsteemikell). Kirjutage registri tasemel (mitte HAL). Kommentaari real - määrake funktsiooni parameetriga 0–100 - Pange tähele, et väärtused muutuvad, kui teie kella oletus on vale.

Erinevus seisneb selles, et võimas viip paneb mudeli näitama arvutust ja avaldama kellaeeldusi. Nii saate eelskaalaja/ARR väärtusi iseseisvalt kontrollida:

20 kHz PWM (72 MHz kell): Taimer_kell = 72 MHz Kui soovime eelskaalarit = 72-1 → loendurkell = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49 Kontrollimine: 1e6 / (49+1) = 20 0 0 Hz

AI koodi auditeerimine: mida otsida?

See, et loodud kood kompileerub, ei tähenda, et see töötab korralikult. Järgige seda kontrollnimekirja:

kontrollala

Mida otsida

Registri/biti seaded

Täpselt ühilduv andmelehega, õige bitimask

Katkestus (ISR)

Kas see on lühike? Kas blokeerija viivitus puudub? Kas kasutatakse lenduvat?

puhver/massiivi

Kas piirikontroll on olemas? Ülevoolu oht?

ajastus

Viivitusega või taimeriga? Kas tegelik ajaline piirang on täidetud?

Tüüp ja laius

8/16/32-bitine ületäitumine, signeeritud/allkirjata segadus

võim / valvekoer

Lõpmatu ahelaga toitmise valvekoer?

Katkestusteenuse rutiinid (ISR) on kõige levinum vigade allikas. AI paneb mõnikord ISR-i sisse delay() või long loop. See toob kaasa teiste katkestuste vahelejäämise ja valvekoera lähtestamise. Reegel: ISR peaks olema võimalikult lühike; Peamine töö peaks olema lipu seadistamine ja selle liigutamine põhiahelasse.

// NÕRK (AI tekitab seda mõnikord): Blokeerija funktsioon ISR-is void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // võib võtta kaua aega - BAD CASE_Delay(10); // viivitus ISR-is - VÄGA HALB }}// TUGEV: ISR lühike; töö liigub põhiloopvolatile uint8_t tick_flag = 0; // volatile CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; linnuke_lipp = 1; //lipp määramine }}// põhitsüklis:if (lipp) { linnuke_lipp = 0; read_sensor(); }

Ettevaatust: kõik katkestuse ja põhiahela vahel jagatud muutujad peavad olema muutlikud. Vastasel juhul võib kompilaator muutuja registris vahemällu salvestada ja värskendusest ilma jääda. AI sageli unustab selle märksõna; Otsige seda konkreetselt koodi lugemisel.

Puhvri ületäitumine ja tüübivead

AI saab kopeerida andmeid jadapordist fikseeritud suurusega massiivi ilma piire kontrollimata. Manussüsteemis tähendab see külgneva mälu purustamist ja seletamatuid krahhe. Veenduge, et limiit oleks kontrollitud igas strcpy, massiiviindeksi ja DMA puhvris. Samamoodi lähtestub 8-bitine loendur pärast 255; AI võib seda ignoreerida ja tugineda ülevoolavale kontole.

Kinnitamine riistvaras: "Töötab" on mõõdetud, mitte eeldatud

Manussüsteemis on kõige usaldusväärsem tõend mõõtja, mitte kompilaator. Kontrollige loodud koodi kolmel viisil:

  1. Ostsilloskoop/loogikaanalüsaator: PWM sageduse, signaali ajastuse ja side lainekuju mõõtmine. Kui tahtsite 20 kHz, vaadake ekraanilt 20 kHz.
  2. Jadapordi (UART) logi: printige välja muutujate väärtused, olekuüleminekud ja vealoendurid ning võrrelge eeldatava käitumisega.
  3. Seotud ja stressitestimine: testige, kas süsteem peab vastu suurima koormuse, kiireimate andmete ja halvima ajastuse korral.

Kui mõõdetud väärtus ei ühti arvutusega, on kellaeeldus, eelskaala väärtus või registri seadistus vale; tagaajamine.

Mini korpus

Õpilaste meeskonnal on AI printida kaugusmõõtmise kood ultrahelianduriga HC-SR04. Kood kompileerib, kuid kaugus annab alati naeruväärseid väärtusi. Kui nad ühendavad selle ostsilloskoobiga, näevad nad, et kajajalg arvutab oma ajastuse mikrosekundite asemel millisekundites; AI kasutas micros() asemel millis(). See ühesõnaline viga segas kogu mõõtmist 1000 korda. Kui nad prindivad töötlemata kajaaja jadalogi ja võrdlevad seda tõelise joonlauaga, leiavad nad vea ja parandavad selle. Õppetund: koostatud kood ei ole õige kood; Riistvaraline mõõtmine paljastab vea kohe.

Levinud vead

  • Registrinimede ja bitimaskide aktsepteerimine ilma neid andmelehega võrdlemata.
  • Blokeerimisviivituse või pika töötlemise lubamine ISR-is.
  • Jagatud muutujate volatiilsuse unustamine.
  • Puhvri ja massiivi piiride kontrollimine; ei näe ülevoolu.
  • Kella sageduse ja ajastuse eeldustele tuginemine ilma neid kontrollimata.
  • Arvestades koodi "töötavaks" ilma ostsilloskoobi/jadalogiga mõõtmata.

Kokkuvõttes

  • Määratlege manustatud ülesanne selgelt riistvara, funktsiooni, piirangute ja liidese osas.
  • Laske tehisintellektil arvutada ajastusväärtused (nt eelskaalaja/ARR) ja kontrollida neid iseseisvalt.
  • Hoidke ISR-id lühikesed, kasutage jagatud muutujate puhul volatiilsust.
  • Otsige konkreetselt registri, puhvri piirangu ja tüübi laiuse vigu.
  • "See töötab" on tõestatud ostsilloskoobi, loogikaanalüsaatori ja jadalogi, mitte kompilaatoriga.
  • Kui mõõdetud väärtus ei ühti arvutusega, järgige eeldusi.

Rakenduse ülesanne

Kui teil on mikrokontroller (Arduino, STM32, ESP32), küsige AI-lt PWM-i või perioodilist ülesannet teatud sagedusel. Enne koodi laadimist: (1) kontrollige kommentaarireal olevast kontost sõltumatult sageduse/ajastuse väärtusi, (2) kontrollige ISR-i ja jagatud muutujate volatiilsust ja blokeerimist. Pärast üleslaadimist mõõtke tegelik sagedus ostsilloskoobi või loogikaanalüsaatoriga ja võrrelge seda sihtmärgiga. Kui esineb kõrvalekalle, leidke allikas ja parandage see ning märkige üles, mis eeldati valesti.