Enota 3 / 9

Vgrajeni sistemi in koda mikrokontrolerjev

Dobički:

  • Sposobnost definiranja registra, prekinitev in časovnih zahtev za mikrokrmilnik z jasnim pozivom
  • Zmožnost preverjanja kode C/Arduino, ki jo je ustvaril AI glede nastavitev registra, prelivanja medpomnilnika in omejitev realnega časa
  • Sposobnost uporabe navade preverjanja ustvarjene kode z merjenjem na strojni opremi (osciloskop, serijska vrata)

Razvoj vgrajenega sistema je kraj, kjer se križata programska in strojna oprema: napačna nastavitev bita registra, predolgo zadrževanje prekinitve ali prekoračitev vmesnega pomnilnika bo povzročilo nenavadne napake, ki jih je težko ponoviti na terenu, čeprav se koda "prevede" in zažene. AI je resnično pospeševalnik na tem področju; Izdela lahko začetne skelete, funkcije abstrakcije strojne opreme, državne stroje in komunikacijske rutine. Vendar AI ne vidi podatkovnega lista vaše kartice, ne pozna vaše taktne frekvence in ne zaznava vaših realnih časovnih omejitev. V tej enoti bomo obravnavali, kako jasno definirati delo mikrokrmilnika za AI, kako preveriti generirano kodo C/Arduino in zakaj bi morali meriti vse v strojni opremi.

Jasna opredelitev zahteve: registracija, rezanje, čas

Naročiti AI, naj "prižge LED", ne bo delovalo; Katera kartica, kateri pin, katera frekvenca ure, kateri čas? Ko umetni inteligenci dodelite vdelano nalogo, uporabite to ogrodje: strojna oprema (družina MCU, ura, pin), funkcija (kaj se bo zgodilo), omejitev (čas, moč, pomnilnik) in vmesnik (register, HAL, knjižnica Arduino).

Šibek poziv / močan poziv

WEAK: "Izdelaj PWM s STM32." (Rezultat: kateri časovnik, katera frekvenca, kateri pin je nejasen; splošno, verjetno napačna koda z imenom registra.) MOČNO: "Izdelajte 20 kHz, 0-100 % nastavljivo PWM na TIM3 CH1 (PA6) za STM32F103 (sistemska ura 72 MHz). Zapišite na ravni registra (ne HAL). - Vrednosti preddelilnika in ARR za 20 kHz IZRAČUNAJTE in pokažite izračun v vrstici za komentar. Nastavite dolžnost med 0-100 - Komentirajte vsak bit registra, ki ga uporabljate, če je vaša predpostavka ure napačna.

Razlika je v tem, da z močnim pozivom model prikaže izračun in razkrije predpostavko o uri. Tako lahko neodvisno preverite vrednosti preddelilnika/ARR:

Za 20 kHz PWM (72 MHz ura): Timer_clock = 72 MHz Če želimo preddelilnik = 72-1 → števec ura = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49 Preverjanje: 1e6 / (49+1) = 20 000 Hz ✓

Revizija kode AI: kaj iskati?

Samo zato, ker se ustvarjena koda prevaja, še ne pomeni, da deluje pravilno. Upoštevajte ta kontrolni seznam:

nadzorno območje

Kaj iskati

Nastavitve registra/bita

Popolnoma združljiv s podatkovnim listom, pravilna bitna maska

Prekinitev (ISR)

Je kratek? Brez zakasnitve blokatorja? Ali se uporablja volatile?

medpomnilnik/matrika

Ali obstaja mejna kontrola? Nevarnost prelivanja?

čas

Z zamikom ali časovnikom? Ali je dejanska časovna omejitev izpolnjena?

Vrsta in širina

8/16/32-bitno prelivanje, predznačena/nepodpisana zmeda

moč/pes čuvaj

Varuh za hranjenje v neskončni zanki?

Prekinitvene servisne rutine (ISR) so najpogostejši vir napak. AI včasih postavi delay() ali dolgo zanko znotraj ISR. To povzroči zgrešene druge prekinitve in ponastavitev nadzornega psa. Pravilo: ISR naj bo čim krajši; Glavna naloga bi morala biti nastavitev zastavice in njeno premikanje v glavno zanko.

// ŠIBKO (AI včasih ustvari to): funkcija blokatorja v ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; preberi senzor(); // lahko traja dolgo - BAD CASE_Delay(10); // zamuda pri ISR ​​- ZELO SLABO }}// MOČNO: ISR kratek; opravilo se premakne v glavno zanko volatile uint8_t tick_flag = 0; // volatile CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; zastavica_kljukice = 1; //samo nastavi zastavico }}// v glavni zanki:if (zastavica_kljukice) { zastavica_kljukice = 0; preberi senzor(); }

Pozor: vsaka spremenljivka, ki si jo delita prekinitev in glavna zanka, mora biti nestanovitna. V nasprotnem primeru lahko prevajalnik shrani spremenljivko v register in zamudi posodobitev. AI pogosto pozabi to ključno besedo; Posebej ga poiščite pri branju kode.

Prekoračitev medpomnilnika in napake tipa

AI lahko kopira podatke iz serijskih vrat v niz fiksne velikosti brez preverjanja meja. V vgrajenem sistemu to pomeni drobljenje neprekinjenega pomnilnika in nepojasnjene zrušitve. Prepričajte se, da je omejitev preverjena pri vsakem strcpy, indeksu polja in medpomnilniku DMA. Podobno se 8-bitni števec ponastavi po 255; AI lahko to ignorira in se zanaša na prepoln račun.

Preverjanje v strojni opremi: "deluje" se meri, ne domneva

V vgrajenem sistemu je najbolj zanesljiv dokaz merilnik in ne prevajalnik. Preverite ustvarjeno kodo na te tri načine:

  1. Osciloskop/logični analizator: Izmeri frekvenco PWM, čas signala in komunikacijsko valovno obliko. Če želite 20 kHz, poglejte 20 kHz na zaslonu.
  2. Dnevnik serijskih vrat (UART): Natisnite vrednosti spremenljivk, prehode stanj in števce napak ter jih primerjajte s pričakovanim vedenjem.
  3. Vezano in stresno testiranje: preizkusite, ali sistem vzdrži največjo obremenitev, najhitrejše podatke in najslabši čas.

Če se izmerjena vrednost ne ujema z izračunom, je predpostavka ure, vrednost preddelilnika ali nastavitev registra napačna; loviti.

Mini etui

Skupina študentov ima AI natisniti kodo za merjenje razdalje z ultrazvočnim senzorjem HC-SR04. Koda se prevaja, vendar razdalja vedno daje smešne vrednosti. Ko ga povežejo z osciloskopom, vidijo, da noga odmeva svoj čas izračuna v milisekundah namesto v mikrosekundah; AI je uporabil millis() namesto micros(). Ta napaka v eni besedi je celotno meritev zmešala s faktorjem 1000. Ko natisnejo neobdelani čas odmeva v serijski dnevnik in ga primerjajo s pravim ravnilom, najdejo napako in jo popravijo. Lekcija: prevedena koda ni pravilna koda; Merjenje v strojni opremi takoj razkrije napako.

Pogoste napake

  • Sprejemanje imen registrov in bitnih mask brez primerjave s podatkovnim listom.
  • Omogoča zakasnitev blokiranja ali dolgo obdelavo znotraj ISR.
  • Pozabite na volatile spremenljivk v skupni rabi.
  • Obhod medpomnilnika in preverjanje meja polja; ne vidim preliva.
  • Zanašanje na urno frekvenco in časovne predpostavke, ne da bi jih preverili.
  • Glede na to, da koda "deluje", ne da bi jo izmerili z osciloskopom/serijskim dnevnikom.

Če povzamem

  • Jasno opredelite vgrajeno nalogo v smislu strojne opreme, funkcij, omejitev in vmesnika.
  • Naj AI izračuna časovne vrednosti, kot je preddelilnik/ARR, in jih neodvisno preveri.
  • ISR-ji naj bodo kratki, na spremenljivkah v skupni rabi uporabite volatile.
  • Posebej poiščite napake v registru, meji medpomnilnika in širini tipa.
  • "Deluje" je dokazano z osciloskopom, logičnim analizatorjem in serijskim dnevnikom, ne s prevajalnikom.
  • Če se izmerjena vrednost ne ujema z izračunom, sledite predpostavkam.

Aplikacijska naloga

Z mikrokrmilnikom, ki ga imate (Arduino, STM32, ESP32), prosite AI za PWM ali periodično nalogo pri določeni frekvenci. Preden naložite kodo: (1) preverite vrednosti frekvence/časa neodvisno od računa v vrstici za komentar, (2) preverite nestanovitnost in blokiranje v ISR in spremenljivkah v skupni rabi. Po nalaganju izmerite dejansko frekvenco z osciloskopom ali logičnim analizatorjem in jo primerjajte s ciljno. Če pride do odstopanja, poiščite vir in ga popravite ter zabeležite, kaj je bilo domnevno napačno.