Jednotka 3 / 9

Vstavané systémy a kód mikrokontroléra

zisky:

  • Schopnosť definovať požiadavky na register, prerušenie a časovanie pre mikrokontrolér s jasnou výzvou
  • Schopnosť kontrolovať kód C/Arduino produkovaný AI z hľadiska nastavení registra, pretečenia vyrovnávacej pamäte a obmedzení v reálnom čase
  • Schopnosť aplikovať zvyk overovať vygenerovaný kód meraním na hardvéri (osciloskop, sériový port)

Vývoj vstavaného systému je miesto, kde sa prelína softvér a hardvér: nesprávne nastavenie bitu registra, príliš dlhé držanie prerušenia alebo preplnenie vyrovnávacej pamäte spôsobí zvláštne, ťažko reprodukovateľné zlyhania v teréne, aj keď sa kód „kompiluje“ a spustí. AI je v tejto oblasti skutočne akcelerátorom; Môže produkovať počiatočné kostry, funkcie hardvérovej abstrakcie, stavové stroje a komunikačné rutiny. Ale AI nevidí datasheet vašej karty, nepozná vašu taktovaciu frekvenciu a nevníma vaše obmedzenia v reálnom čase. V tejto časti sa budeme zaoberať tým, ako jasne definovať prácu mikrokontroléra pre AI, ako skontrolovať vygenerovaný kód C/Arduino a prečo by ste mali všetko merať hardvérovo.

Jasné definovanie požiadavky: Registrácia, rezanie, načasovanie

Povedať AI, aby „rozsvietila LED“, nebude fungovať; Ktorá karta, aký pin, akú frekvenciu hodín, aké časovanie? Pri priraďovaní vstavanej úlohy AI použite tento rámec: hardvér (rodina MCU, hodiny, pin), funkcia (čo sa stane), obmedzenie (časovanie, napájanie, pamäť) a rozhranie (register, HAL, knižnica Arduino).

Slabá výzva / silná výzva

SLABÉ: "Vyrobte PWM pomocou STM32." (Výsledok: ktorý časovač, ktorá frekvencia, ktorý kolík je nejasný; všeobecný, pravdepodobne nesprávny kód s názvom registra.) STRONG: "Vyrobte 20 kHz, 0-100 % nastaviteľné pracovné PWM na TIM3 CH1 (PA6) pre STM32F103 (72 MHz systémové hodiny). Zapíšte na úrovni registra (nie HAL). - Preddeličku a hodnotu komentára ARRULATE nastavte na hodnotu 20 kHz. clo s parametrom funkcie medzi 0-100 - Komentujte každý bit registra, ktorý používate, všimnite si, že hodnoty sa zmenia, ak je váš predpoklad hodín nesprávny.

Rozdiel je v tom, že výkonná výzva spôsobí, že model ukáže výpočet a odhalí predpoklad hodín. Hodnoty preddeličky/ARR tak môžete kontrolovať nezávisle:

Pre 20 kHz PWM (72 MHz hodiny): Časovač = 72 MHz Ak chceme preddeličku = 72-1 → takt počítadla = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49 Overenie: 1e6 / (49+1) = 20 000 Hz

Kód auditu AI: Čo hľadať?

To, že sa vygenerovaný kód skompiluje, neznamená, že funguje správne. Postupujte podľa tohto kontrolného zoznamu:

oblasť kontroly

Čo hľadať

Nastavenia registrácie/bitu

Presne kompatibilné s údajovým listom, správna bitová maska

Prerušenie (ISR)

je to krátke? Žiadne oneskorenie blokovania? Používa sa prchavá látka?

vyrovnávacia pamäť/pole

Existuje hraničná kontrola? Riziko pretečenia?

načasovanie

S oneskorením alebo časovačom? Sú splnené skutočné časové obmedzenia?

Typ a šírka

8/16/32-bitové pretečenie, zmätok podpísaný/nepodpísaný

moc/strážny pes

Strážca kŕmenia v nekonečnej slučke?

Obslužné rutiny prerušenia (ISR) sú najbežnejším zdrojom chýb. AI niekedy vloží delay() alebo dlhú slučku do ISR. To vedie k vynechaniu ďalších prerušení a resetovaniu watchdogu. Pravidlo: ISR by malo byť čo najkratšie; Hlavnou úlohou by malo byť nastavenie vlajky a jej presun do hlavnej slučky.

// SLABÝ (AI to niekedy produkuje): Blokovacia funkcia v ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // môže trvať dlho - BAD CASE_Delay(10); // oneskorenie ISR - VEĽMI ZLÉ }}// SILNÉ: ISR krátke; úloha sa presunie do hlavnej slučkyvolatile uint8_t tick_flag = 0; // volatile CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; tick_flag = 1; //stačí nastaviť príznak }}// v hlavnej slučke:if (príznak_zaškrtnutia) { príznak_zaškrtnutia = 0; read_sensor(); }

Upozornenie: Akákoľvek premenná zdieľaná medzi prerušením a hlavnou slučkou musí byť volatilná. V opačnom prípade môže kompilátor uložiť premennú do vyrovnávacej pamäte v registri a zmeškať aktualizáciu. AI často zabúda na toto kľúčové slovo; Hľadajte to konkrétne pri čítaní kódu.

Pretečenie vyrovnávacej pamäte a chyby typu

AI môže kopírovať dáta zo sériového portu do poľa s pevnou veľkosťou bez kontroly hraníc. Vo vstavanom systéme to znamená rozdrvenie súvislej pamäte a nevysvetliteľné zlyhania. Skontrolujte, či je limit skontrolovaný pri každom strcpy, indexe poľa a vyrovnávacej pamäti DMA. Podobne sa 8-bitové počítadlo vynuluje po 255; AI to môže ignorovať a spoľahnúť sa na preplnený účet.

Overenie v hardvéri: „Funguje“ sa meria, nie sa predpokladá

Vo vstavanom systéme je najspoľahlivejším dôkazom merač, nie kompilátor. Overte vygenerovaný kód týmito tromi spôsobmi:

  1. Osciloskop/logický analyzátor: Merajte frekvenciu PWM, časovanie signálu a priebeh komunikácie. Ak ste chceli 20 kHz, pozri 20 kHz na obrazovke.
  2. Protokol sériového portu (UART): Vytlačte hodnoty premenných, prechody stavov a počítadlá chýb a porovnajte ich s očakávaným správaním.
  3. Viazané a záťažové testovanie: Otestujte, či systém vydrží pri najvyššom zaťažení, najrýchlejších dátach a najhoršom načasovaní.

Ak nameraná hodnota nesúhlasí s výpočtom, je nesprávny predpoklad hodín, hodnota preddeličky alebo nastavenie registra; prenasledovať.

Mini puzdro

Tím študentov má pomocou AI vytlačiť kód merania vzdialenosti s ultrazvukovým snímačom HC-SR04. Kód sa skompiluje, ale vzdialenosť vždy dáva smiešne hodnoty. Keď ho pripoja k osciloskopu, uvidia, že echo počíta svoje načasovanie v milisekundách namiesto mikrosekúnd; AI použila millis() namiesto micros(). Táto jednoslovná chyba zmiatla celé meranie o faktor 1000. Keď vytlačia nespracovaný čas odozvy do sériového denníka a porovnajú ho so skutočným pravítkom, chybu nájdu a opravia. Lekcia: skompilovaný kód nie je správny kód; Meranie v hardvéri odhalí chybu okamžite.

Časté chyby

  • Prijímanie názvov registrov a bitových masiek bez ich porovnávania s údajovým listom.
  • Umožnenie oneskorenia blokovania alebo dlhého spracovania v rámci ISR.
  • Zabudnutie na nestálosť zdieľaných premenných.
  • Obísť vyrovnávaciu pamäť a kontrolu hraníc poľa; nevidieť prepad.
  • Spoliehanie sa na frekvenciu hodín a predpoklady časovania bez ich overenia.
  • Vzhľadom na to, že kód "funguje" bez toho, aby sme ho merali osciloskopom/sériovým protokolom.

V súhrne

  • Jasne definujte vstavanú úlohu z hľadiska hardvéru, funkcie, obmedzení a rozhrania.
  • Nechajte AI vypočítať hodnoty časovania, ako je preddelička/ARR, a nezávisle ich overte.
  • Udržujte ISR krátke, použite nestále na zdieľané premenné.
  • Konkrétne hľadajte chyby registra, limitu vyrovnávacej pamäte a šírky typu.
  • "Funguje" je dokázané osciloskopom, logickým analyzátorom a sériovým protokolom, nie kompilátorom.
  • Ak nameraná hodnota nesúhlasí s výpočtom, riaďte sa predpokladmi.

Aplikačná úloha

S mikrokontrolérom, ktorý máte (Arduino, STM32, ESP32), požiadajte AI o PWM alebo periodickú úlohu pri určitej frekvencii. Pred načítaním kódu: (1) overte hodnoty frekvencie/časovania nezávisle od účtu v riadku komentára, (2) skontrolujte nestálosť a blokovanie v ISR a zdieľaných premenných. Po nahraní zmerajte skutočnú frekvenciu osciloskopom alebo logickým analyzátorom a porovnajte ju s cieľovou frekvenciou. Ak existuje odchýlka, nájdite zdroj a opravte ho a všimnite si, čo sa považovalo za nesprávne.