Njësia 3 / 9

Sistemet e integruara dhe kodi i mikrokontrolluesit

Fitimet:

  • Aftësia për të përcaktuar kërkesat e regjistrit, ndërprerjes dhe kohës për mikrokontrolluesin me një kërkesë të qartë
  • Aftësia për të kontrolluar kodin C/Arduino të prodhuar nga AI për sa i përket cilësimeve të regjistrit, tejmbushjes së buferit dhe kufizimeve në kohë reale
  • Aftësia për të aplikuar zakonin e verifikimit të kodit të gjeneruar duke e matur atë në harduer (oshiloskop, port serik)

Zhvillimi i sistemit të integruar është vendi ku softueri dhe hardueri kryqëzohen: vendosja e gabuar e një biti regjistri, mbajtja e një ndërprerjeje për një kohë të gjatë ose tejmbushja e një buferi do të shkaktojë dështime të çuditshme, të vështira për t'u riprodhuar në fushë, edhe pse kodi "përpilohet" dhe ekzekutohet. AI është me të vërtetë një përshpejtues në këtë fushë; Mund të prodhojë skelete fillestare, funksione të abstraksionit të harduerit, makineri të gjendjes dhe rutina komunikimi. Por AI nuk e sheh fletën e të dhënave të kartës suaj, nuk e njeh frekuencën e orës tuaj dhe nuk i kupton kufizimet tuaja në kohën reale. Në këtë njësi, ne do të trajtojmë se si të përcaktojmë qartë punën e mikrokontrolluesit në AI, si të kontrolloni kodin e gjeneruar C/Arduino dhe pse duhet të matni gjithçka në harduer.

Përcaktimi i qartë i kërkesës: Regjistrimi, Prerja, Koha

T'i thuash AI të "ndizë një LED" nuk do të funksionojë; Cila kartë, cila pin, cila frekuencë e orës, cila kohë? Kur caktoni një detyrë të integruar në AI, përdorni këtë kornizë: harduer (familja MCU, ora, pin), funksioni (çfarë do të ndodhë), kufizimi (koha, fuqia, memoria) dhe ndërfaqja (regjistri, HAL, biblioteka Arduino).

Prompt i dobët / Prompt i fortë

I DOBËT: "Prodhoni PWM me STM32." (Rezultati: cili kohëmatës, cila frekuencë, cili pin është i paqartë; kodi i përgjithshëm, ndoshta i gabuar me emrin e regjistrit.) FORTË: "Prodhoni 20 kHz, PWM me funksion të rregullueshëm 0-100% në TIM3 CH1 (PA6) për STM32F103 (ora e sistemit 72 MHz). Shkruaj në nivelin e regjistrit -RRHz shkalle (not). Llogaritni dhe tregoni llogaritjen në rreshtin e komenteve - Vendosni detyrën me një parametër funksioni midis 0-100 - Komentoni çdo bit të regjistrit që përdorni.

Dallimi është se kërkesa e fuqishme e bën modelin të tregojë llogaritjen dhe të zbulojë supozimin e orës. Kështu që ju mund të kontrolloni vlerat e parashkallëzuesit/ARR në mënyrë të pavarur:

Për 20 kHz PWM (ora 72 MHz):Timer_clock = 72 MHzNëse duam parashkallëzues = 72-1 → kundër orës = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Verifikimi: 1e+10) = 4

Auditimi i kodit të AI: Çfarë të kërkoni?

Vetëm për shkak se kodi i gjeneruar përpilohet nuk do të thotë se funksionon si duhet. Ndiqni këtë listë kontrolli:

zona e kontrollit

Çfarë duhet kërkuar

Cilësimet e regjistrimit/bit

Saktësisht i pajtueshëm me fletën e të dhënave, maskë e saktë e bitit

Ndërprerje (ISR)

A është e shkurtër? Nuk ka vonesë bllokuesi? A përdoret volatile?

buffer/array

A ka kontroll kufitar? Rrezik përmbytjeje?

koha

Me vonesë apo kohëmatës? A plotësohet kufizimi aktual i kohës?

Lloji dhe gjerësia

8/16/32-bit tejmbushje, konfuzion i nënshkruar/i panënshkruar

fuqi / qen roje

Mbrojtësi i ushqyerjes me lak të pafund?

Rutinat e shërbimit të ndërprerjes (ISR) janë burimi më i zakonshëm i gabimeve. AI ndonjëherë vendos vonesë () ose lak të gjatë brenda ISR. Kjo çon në mungesën e ndërprerjeve të tjera dhe rivendosjen e "watchdog". Rregulli: ISR duhet të jetë sa më e shkurtër që të jetë e mundur; Detyra kryesore duhet të jetë vendosja e një flamuri dhe zhvendosja e tij në ciklin kryesor.

// I DOBËT (AI ndonjëherë e prodhon këtë): Funksioni i bllokuesit në ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; sensori_lexo(); // mund të marrë një kohë të gjatë - RASTI I KEQ_Vonesë (10); // vonesë në ISR - SHUMË E KEQ }}// E FORTË: ISR e shkurtër; puna kalon në loopvolatile kryesore uint8_t tick_flag = 0; // i paqëndrueshëm CONDITIONi pavlefshëm TIM3_IRQHandler(void) { nëse (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; shenjë_flamuri = 1; / sensori_lexo(); }

Kujdes: Çdo variabël i ndarë midis ndërprerjes dhe ciklit kryesor duhet të jetë i paqëndrueshëm. Përndryshe, përpiluesi mund të ruajë memorien e ndryshores në regjistër dhe të humbasë përditësimin. AI shpesh e harron këtë fjalë kyçe; Kërkoni atë veçanërisht kur lexoni kodin.

Mbimbushja e bufferit dhe gabimet e tipit

AI mund të kopjojë të dhënat nga porti serik në një grup me madhësi fikse pa kontrolluar kufijtë. Në një sistem të integruar, kjo do të thotë shtypje e kujtesës së afërt dhe përplasje të pashpjegueshme. Sigurohuni që kufiri të kontrollohet në çdo strcpy, indeks të grupit dhe bufer DMA. Në mënyrë të ngjashme, një numërues 8-bit rivendoset pas 255; AI mund ta injorojë këtë dhe të mbështetet në një llogari të tejmbushur.

Verifikimi në harduer: "Punimi" matet, nuk supozohet

Në një sistem të integruar, prova më e besueshme është njehsori, jo përpiluesi. Verifikoni kodin e krijuar në këto tre mënyra:

  1. Osciloskop/analizator logjik: Mat frekuencën PWM, kohën e sinjalit dhe formën e valës së komunikimit. Nëse dëshironi 20 kHz, shihni 20 kHz në ekran.
  2. Regjistri i portës serike (UART): Shtypni vlerat e variablave, tranzicionet e gjendjeve dhe numëruesit e gabimeve dhe krahasojeni me sjelljen e pritur.
  3. Testimi i kufizuar dhe i stresit: Testoni nëse sistemi qëndron nën ngarkesën më të lartë, të dhënat më të shpejta dhe kohën më të keqe.

Nëse vlera e matur nuk përputhet me llogaritjen, supozimi i orës, vlera e parashkallëzuesit ose vendosja e regjistrit është e pasaktë; ndjekje.

Mini Case

Një ekip studentësh ka AI të printuar një kod të matjes së distancës me një sensor tejzanor HC-SR04. Kodi përpilohet por distanca jep gjithmonë vlera qesharake. Kur e lidhin me oshiloskopin, shohin se këmba e jehonës llogarit kohën e saj në milisekonda në vend të mikrosekondave; AI përdori millis() në vend të mikros(). Ky gabim me një fjalë ngatërroi të gjithë matjen me një faktor prej 1000. Kur shtypin kohën e papërpunuar të jehonës në regjistrin serial dhe e krahasojnë atë me një vizore të vërtetë, ata e gjejnë gabimin dhe e rregullojnë atë. Mësimi: kodi i përpiluar nuk është kod i saktë; Matja në harduer zbulon gabimin menjëherë.

Gabimet e zakonshme

  • Pranimi i emrave të regjistrave dhe maskave të bitave pa i krahasuar ato me fletën e të dhënave.
  • Lejimi i vonesës së bllokimit ose përpunimit të gjatë brenda ISR.
  • Harrimi i paqëndrueshmërisë në variablat e përbashkët.
  • Anashkaloni kontrollin e kufijve të tamponit dhe grupit; duke mos parë tejmbushjen.
  • Duke u mbështetur në supozimet e frekuencës së orës dhe kohës pa i verifikuar ato.
  • Duke e konsideruar kodin "funksionues" pa e matur atë me një oshiloskop/log serial.

Në përmbledhje

  • Përcaktoni qartë detyrën e integruar për sa i përket harduerit, funksionit, kufizimeve dhe ndërfaqes.
  • Llogaritni AI-t vlerat e kohës, si p.sh. prescaler/ARR dhe verifikoni ato në mënyrë të pavarur.
  • Mbani ISR-të të shkurtra, përdorni të paqëndrueshme në variablat e përbashkëta.
  • Kërkoni në mënyrë specifike për gabimet e regjistrit, kufirit të tamponit dhe gjerësisë së llojit.
  • "Funksionon" vërtetohet me oshiloskop, analizues logjik dhe regjistër serial, jo me përpilues.
  • Nëse vlera e matur nuk pajtohet me llogaritjen, ndiqni supozimet.

Detyra e aplikimit

Me një mikrokontrollues që keni (Arduino, STM32, ESP32), kërkoni nga AI PWM ose një detyrë periodike në një frekuencë të caktuar. Përpara se të ngarkoni kodin: (1) verifikoni vlerat e frekuencës/kohës në mënyrë të pavarur nga llogaria në linjën e komenteve, (2) kontrolloni për paqëndrueshmëri dhe bllokim në ISR dhe variablat e përbashkët. Pas ngarkimit, matni frekuencën aktuale me një oshiloskop ose analizues logjik dhe krahasojeni atë me objektivin. Nëse ka një devijim, gjeni burimin dhe korrigjoni atë dhe vini re atë që supozohej se ishte gabim.