Pelnas:
- Galimybė aiškiai nurodyti mikrovaldiklio registro, pertraukimo ir laiko reikalavimus
- Galimybė patikrinti AI sukurtą C/Arduino kodą pagal registro nustatymus, buferio perpildymą ir realaus laiko apribojimus
- Galimybė pritaikyti įprotį patikrinti sugeneruotą kodą, matuojant jį aparatinėje įrangoje (osciloskopas, nuoseklusis prievadas)
Įterptųjų sistemų kūrimas yra ta vieta, kur susikerta programinė ir aparatinė įranga: neteisingai nustačius registro bitą, per ilgai išlaikius pertrauką ar perpildžius buferį lauke sukels keistų, sunkiai atkuriamų gedimų, nors kodas „kompiliuoja“ ir veikia. Dirbtinis intelektas tikrai yra šios srities greitintuvas; Jis gali sukurti pradinius skeletus, aparatinės įrangos abstrakcijos funkcijas, būsenos mašinas ir ryšio procedūras. Tačiau AI nemato jūsų kortelės duomenų lapo, nežino jūsų laikrodžio dažnio ir nejaučia jūsų realaus laiko apribojimų. Šiame skyriuje apžvelgsime, kaip aiškiai apibrėžti mikrovaldiklio darbą AI, kaip patikrinti sugeneruotą C/Arduino kodą ir kodėl turėtumėte viską išmatuoti aparatinėje įrangoje.
Aiškiai apibrėžti reikalavimą: registracija, pjovimas, laikas
Nurodymas AI „uždegti šviesos diodą“ neveiks; Kuri kortelė, koks kontaktas, koks laikrodžio dažnis, koks laikas? Priskirdami įterptąją užduotį AI, naudokite šią sistemą: aparatinę įrangą (MCU šeima, laikrodis, kaištis), funkciją (kas atsitiks), apribojimą (laiką, galią, atmintį) ir sąsają (registras, HAL, Arduino biblioteka).
Silpnas raginimas / stiprus raginimas
SILPNAS: „Sukurkite PWM naudodami STM32“. (Rezultatas: kuris laikmatis, koks dažnis, kuris kaištis neaiškus; bendras, tikriausiai neteisingas registro pavadinimas.) STIPRUS: „Sukurkite 20 kHz, 0–100 % reguliuojamą PWM TIM3 CH1 (PA6), skirtą STM32F103 (72 MHz sistemos laikrodis). Rašykite registro lygiu (ne HAL). Komentarų eilutėje - Nustatykite funkciją naudodami funkcijos parametrą nuo 0 iki 100 - Komentuokite kiekvieną naudojamą registro bitą, jei jūsų laikrodis bus neteisingas.
Skirtumas tas, kad galingas raginimas priverčia modelį parodyti skaičiavimą ir atskleisti laikrodžio prielaidą. Taigi galite savarankiškai patikrinti prescaler / ARR reikšmes:
20 kHz PWM (72 MHz laikrodis): Laikmačio_laikrodis = 72 MHz Jei norime išankstinio skalavimo = 72-1 → skaitiklio laikrodis = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Patikrinimas: 1e6 / (49+1) = 20 00 Hz
AI kodo auditas: ko ieškoti?
Vien todėl, kad sugeneruotas kodas kompiliuojamas, dar nereiškia, kad jis veikia tinkamai. Vykdykite šį kontrolinį sąrašą:
valdymo zona
Ko ieškoti
Registro/bitų nustatymai
Tiksliai suderinama su duomenų lapu, teisinga bitų kaukė
Pertraukimas (ISR)
Ar jis trumpas? Nėra blokatoriaus vėlavimo? Ar naudojamas nepastovus?
buferis/masyvas
Ar yra sienų kontrolė? Perpildymo pavojus?
laiko nustatymas
Su vėlavimu ar laikmačiu? Ar laikomasi faktinio laiko apribojimo?
Tipas ir plotis
8/16/32 bitų perpildymas, pasirašyta/nepasirašyta painiava
galia / sarginis šuo
Begalinės kilpos maitinimo sarginis šuo?
Paslaugų nutraukimo tvarka (ISR) yra dažniausiai pasitaikantis klaidų šaltinis. AI kartais įdeda delsą () arba ilgą kilpą ISR viduje. Dėl to praleidžiami kiti pertraukimai ir iš naujo nustatomi sarginiai. Taisyklė: ISR turi būti kuo trumpesnė; Pagrindinis darbas turėtų būti vėliavos nustatymas ir perkėlimas į pagrindinę kilpą.
// SILPNAS (AI kartais tai sukuria): Blokavimo funkcija ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // gali užtrukti ilgai - BAD CASE_Delay(10); // ISR delsimas – LABAI BLOGAS }}// STIPRUS: ISR trumpas; darbas perkeliamas į pagrindinę kilpą uint8_t tick_flag = 0; // nepastovi SĄLYGA negalioja TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; varnelė_vėliava = 1; //tiesiog nustatykite vėliavėlę }}// pagrindinėje kilpoje:if (tick_flag) { tick_flag = 0; read_sensor(); }
Atsargiai: bet koks kintamasis, bendras tarp pertraukimo ir pagrindinės kilpos, turi būti nepastovus. Priešingu atveju kompiliatorius gali išsaugoti kintamąjį registre talpykloje ir praleisti atnaujinimą. AI dažnai pamiršta šį raktinį žodį; Skaitydami kodą ieškokite jo konkrečiai.
Buferio perpildymas ir tipo klaidos
AI gali kopijuoti duomenis iš nuosekliojo prievado į fiksuoto dydžio masyvą be ribų tikrinimo. Įterptojoje sistemoje tai reiškia gretimos atminties gniuždymą ir nepaaiškinamus gedimus. Įsitikinkite, kad riba yra patikrinta kiekviename strcpy, masyvo indekse ir DMA buferyje. Panašiai 8 bitų skaitiklis atstatomas po 255; AI gali to nepaisyti ir pasikliauti perpildyta paskyra.
Patvirtinimas aparatinėje įrangoje: „Darbas“ matuojamas, o ne prielaida
Įterptojoje sistemoje patikimiausias įrodymas yra skaitiklis, o ne kompiliatorius. Patvirtinkite sugeneruotą kodą šiais trimis būdais:
- Osciloskopas / loginis analizatorius: išmatuokite PWM dažnį, signalo laiką ir ryšio bangos formą. Jei norėjote 20 kHz, ekrane žiūrėkite 20 kHz.
- Nuosekliojo prievado (UART) žurnalas: išspausdinkite kintamųjų reikšmes, būsenų perėjimus ir klaidų skaitiklius ir palyginkite su laukiamu elgesiu.
- Testavimas nepalankiausiomis sąlygomis: patikrinkite, ar sistema atlaiko didžiausią apkrovą, greičiausius duomenis ir blogiausią laiką.
Jei išmatuota vertė nesutampa su skaičiavimu, neteisinga laikrodžio prielaida, išankstinio skalerio reikšmė arba registro nustatymas; vytis.
Mini dėklas
Studentų komanda AI atspausdina atstumo matavimo kodą su ultragarsiniu jutikliu HC-SR04. Kodas kompiliuoja, bet atstumas visada suteikia juokingas vertes. Kai jie prijungia jį prie osciloskopo, jie mato, kad aido kojelė apskaičiuoja savo laiką milisekundėmis, o ne mikrosekundėmis; AI vietoj micros () naudojo millis (). Ši vieno žodžio klaida supainiojo visą matavimą 1000 kartų. Kai jie atspausdina neapdorotą aido laiką į serijos žurnalą ir palygina jį su tikra liniuote, jie randa klaidą ir ją ištaiso. Pamoka: sudarytas kodas yra neteisingas kodas; Aparatinės įrangos matavimas iš karto atskleidžia klaidą.
Dažnos klaidos
- Registrų pavadinimų ir bitų kaukių priėmimas nelyginant jų su duomenų lapu.
- Leidžiama blokuoti delsą arba ilgą apdorojimą ISR.
- Nepamirškite nepastovių bendrinamų kintamųjų.
- Buferio ir masyvo ribų tikrinimas; nematydamas perpildymo.
- Pasikliauti laikrodžio dažnio ir laiko prielaidomis jų nepatikrinus.
- Laikant kodą "veikiantį" nematuojant jo osciloskopu/serijiniu žurnalu.
Apibendrinant
- Aiškiai apibrėžkite įterptąją užduotį pagal aparatinę įrangą, funkciją, apribojimus ir sąsają.
- Leiskite dirbtiniam intelektui apskaičiuoti laiko vertes, pvz., prescaler / ARR, ir savarankiškai jas patikrinti.
- Laikykite trumpus ISR, bendrinamuose kintamuosiuose naudokite nepastovumą.
- Konkrečiai ieškokite registro, buferio ribos ir tipo pločio klaidų.
- „Tai veikia“ įrodoma naudojant osciloskopą, loginį analizatorių ir nuoseklųjį žurnalą, o ne su kompiliatoriumi.
- Jei išmatuota vertė nesutampa su skaičiavimu, vadovaukitės prielaidomis.
Taikymo užduotis
Naudodami turimą mikrovaldiklį (Arduino, STM32, ESP32), paprašykite dirbtinio intelekto PWM arba periodinės užduoties tam tikru dažniu. Prieš įkeldami kodą: (1) patikrinkite dažnio / laiko reikšmes nepriklausomai nuo paskyros komentaro eilutėje, (2) patikrinkite, ar ISR ir bendrinami kintamieji nėra nepastovūs ir blokuojami. Įkėlę išmatuokite tikrąjį dažnį osciloskopu arba loginiu analizatoriumi ir palyginkite jį su taikiniu. Jei yra nukrypimų, suraskite šaltinį ir pataisykite jį bei pažymėkite, kas buvo klaidinga.