Jedinica 3 / 9

Ugrađeni sistemi i kod mikrokontrolera

Dobici:

  • Sposobnost definiranja zahtjeva za registar, prekid i vrijeme za mikrokontroler sa jasnim promptom
  • Mogućnost provjere C/Arduino koda koji je proizvela AI u smislu podešavanja registra, prekoračenja bafera i ograničenja u realnom vremenu
  • Mogućnost primjene navike provjere generiranog koda mjerenjem na hardveru (osciloskop, serijski port)

Razvoj ugrađenog sistema je mjesto gdje se softver i hardver ukrštaju: pogrešno postavljanje bita registra, predugo zadržavanje prekida ili prekoračenje bafera uzrokovaće čudne, teško reproducirane kvarove na terenu, iako se kod "kompilira" i pokreće. AI je zaista akcelerator u ovoj oblasti; Može proizvesti početne kosture, funkcije apstrakcije hardvera, automate stanja i komunikacijske rutine. Ali AI ne vidi podatkovni list vaše kartice, ne zna vašu frekvenciju sata i ne osjeća vaša ograničenja u stvarnom vremenu. U ovoj jedinici ćemo pokriti kako jasno definirati rad mikrokontrolera na AI, kako provjeriti generirani C/Arduino kod i zašto sve treba mjeriti u hardveru.

Jasno definiranje zahtjeva: registracija, rezanje, tajming

Reći AI da "upali LED" neće raditi; Koja kartica, koji pin, koja frekvencija takta, koji tajming? Kada dodjeljujete ugrađeni zadatak AI, koristite ovaj okvir: hardver (porodica MCU, sat, pin), funkcija (šta će se dogoditi), ograničenja (vreme, snaga, memorija) i sučelje (registr, HAL, Arduino biblioteka).

Slaba prompt / jaka prompt

SLABO: "Proizvodi PWM sa STM32." (Rezultat: koji tajmer, koja frekvencija, koji pin je nejasan; generalno, verovatno pogrešan registar sa imenom kod.) SNAŽNO: "Proizvesti 20 kHz, 0-100% podesivi PWM na TIM3 CH1 (PA6) za STM32F103 (72 MHz sistemski takt). Upišite na nivou registra (ne pokazuju vrednosti preskarar2 i ALCULATE kHz). izračunavanje u redu za komentare - Postavite funkciju sa parametrom između 0-100 - Komentirajte svaki bit registra koji koristite.

Razlika je u tome što moćni prompt čini da model pokaže proračun i otkrije pretpostavku sata. Tako možete nezavisno provjeriti vrijednosti prescalera/ARR:

Za 20 kHz PWM (72 MHz sat): Tajmer_clock = 72 MHz Ako želimo preskaler = 72-1 → brojač takta = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49 Provjera: 1e6 / (49+1) = 20 Hz

Revizija AI koda: Šta tražiti?

Samo zato što se generirani kod kompajlira ne znači da radi ispravno. Pratite ovu kontrolnu listu:

kontrolno područje

Šta tražiti

Postavke registracije/bitova

Potpuno kompatibilan sa listom podataka, ispravna bit maska

prekid (ISR)

Je li kratko? Nema kašnjenja blokatora? Da li se koristi volatile?

bafer/niz

Postoji li granična kontrola? Rizik od prelijevanja?

tajming

Sa odgodom ili tajmerom? Da li je stvarno vremensko ograničenje ispunjeno?

Vrsta i širina

8/16/32-bitni overflow, zabuna sa predznakom/neznakom

power/watchdog

Beskonačna petlja hranjenja čuvar?

Interrupt servisne rutine (ISR) su najčešći izvor grešaka. AI ponekad stavlja delay() ili dugu petlju unutar ISR-a. To dovodi do propuštanja drugih prekida i resetiranja nadzornog psa. Pravilo: ISR treba da bude što kraći; Glavni posao bi trebao biti postavljanje zastavice i premještanje u glavnu petlju.

// SLABO (AI ponekad proizvodi ovo): Blocker funkcija u ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // može potrajati dugo - BAD CASE_Delay(10); // kašnjenje u ISR - VRLO LOŠ }}// JAKO: ISR kratak; posao se premješta u glavnu petlju uint8_t tick_flag = 0; // volatile CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; tick_flag = 1; //samo postavi zastavicu }}// u glavnoj petlji:if (tick_flag) { tick_flag = 0; read_sensor(); }

Oprez: Svaka varijabla koja se dijeli između prekida i glavne petlje mora biti promjenjiva. U suprotnom, kompajler može keširati varijablu u registru i propustiti ažuriranje. AI često zaboravlja ovu ključnu riječ; Potražite ga posebno kada čitate kod.

Buffer overflow i tip greške

AI može kopirati podatke sa serijskog porta u niz fiksne veličine bez provjere granica. U ugrađenom sistemu, to znači uništavanje neprekidne memorije i neobjašnjive padove. Provjerite je li ograničenje provjereno za svaki strcpy, indeks niza i DMA bafer. Slično, 8-bitni brojač se resetuje nakon 255; AI može zanemariti ovo i osloniti se na prepun račun.

Verifikacija u hardveru: "Radi" se mjeri, a ne pretpostavlja

U ugrađenom sistemu, najpouzdaniji dokaz je mjerač, a ne kompajler. Potvrdite generirani kod na ova tri načina:

  1. Osciloskop/logički analizator: Mjerite PWM frekvenciju, vrijeme signala i komunikacijski talasni oblik. Ako želite 20 kHz, pogledajte 20 kHz na ekranu.
  2. Dnevnik serijskog porta (UART): Ispišite vrijednosti varijabli, prelaze stanja i brojače grešaka i uporedite s očekivanim ponašanjem.
  3. Vezano i stresno testiranje: Testirajte da li sistem izdržava pod najvećim opterećenjem, najbržim podacima i najgorem vremenu.

Ako se izmjerena vrijednost ne slaže sa proračunom, pretpostavka sata, vrijednost predskalera ili postavka registra je netačna; juriti.

Mini Case

Tim studenata ima AI da ispiše kod za mjerenje udaljenosti pomoću ultrazvučnog senzora HC-SR04. Kod se kompilira, ali udaljenost uvijek daje smiješne vrijednosti. Kada ga povežu sa osciloskopom, vide da eho noga izračunava svoje vreme u milisekundama umesto u mikrosekundama; AI je koristio millis() umjesto micros(). Ova greška u jednoj riječi zbunila je cijelo mjerenje za faktor od 1000. Kada ispisuju sirovo vrijeme eha u serijski dnevnik i uporede ga sa pravim ravnalom, pronalaze grešku i popravljaju je. Lekcija: kompajlirani kod nije ispravan kod; Mjerenje u hardveru odmah otkriva grešku.

Uobičajene greške

  • Prihvatanje imena registara i bitnih maski bez poređenja sa podacima.
  • Dozvoljava kašnjenje blokiranja ili dugu obradu unutar ISR-a.
  • Zaboravljanje volatile na dijeljene varijable.
  • Zaobići međuspremnik i provjeru granica niza; ne videći prelivanje.
  • Oslanjajući se na frekvenciju takta i pretpostavke o vremenu bez njihove provjere.
  • Uzimajući u obzir da kod "radi" bez mjerenja osciloskopom/serijskim dnevnikom.

Ukratko

  • Jasno definirajte ugrađeni zadatak u smislu hardvera, funkcije, ograničenja i sučelja.
  • Neka AI izračuna vrijednosti vremena kao što je predskaler/ARR i provjeri ih nezavisno.
  • Neka ISR budu kratki, koristite volatile na zajedničkim varijablama.
  • Posebno potražite greške registra, ograničenja međuspremnika i širine tipa.
  • "Radi" je dokazano osciloskopom, logičkim analizatorom i serijskim dnevnikom, a ne kompajlerom.
  • Ako se izmjerena vrijednost ne slaže sa proračunom, jurite za pretpostavkama.

Zadatak aplikacije

Uz mikrokontroler koji imate (Arduino, STM32, ESP32), zatražite od AI za PWM ili periodični zadatak na određenoj frekvenciji. Prije učitavanja koda: (1) provjerite frekvencije/vrijeme vremena neovisno o računu u redu za komentare, (2) provjerite da li postoje promjenjivi i blokirani u ISR-u i zajedničkim varijablama. Nakon učitavanja, izmjerite stvarnu frekvenciju osciloskopom ili logičkim analizatorom i uporedite je sa ciljnom. Ako postoji odstupanje, pronađite izvor i ispravite ga, te zabilježite šta je pogrešno pretpostavljeno.