Jedinica 3 / 9

Kod ugrađenih sustava i mikrokontrolera

Dobici:

  • Sposobnost definiranja zahtjeva za registar, prekid i vrijeme za mikrokontroler s jasnim upitom
  • Sposobnost provjere C/Arduino koda koji proizvodi AI u smislu postavki registra, prekoračenja međuspremnika i ograničenja u stvarnom vremenu
  • Sposobnost primjene navike provjere generiranog koda mjerenjem na hardveru (osciloskop, serijski port)

Razvoj ugrađenog sustava mjesto je gdje se presijecaju softver i hardver: neispravno postavljanje bita registra, predugo zadržavanje prekida ili prekoračenje međuspremnika uzrokovat će čudne kvarove koje je teško reproducirati na terenu, iako se kod "kompilira" i izvodi. AI je doista akcelerator u ovom području; Može proizvesti početne kosture, funkcije apstrakcije hardvera, automate stanja i komunikacijske rutine. Ali AI ne vidi podatkovnu tablicu vaše kartice, ne zna vašu frekvenciju takta i ne osjeća vaša ograničenja u stvarnom vremenu. U ovoj jedinici ćemo pokriti kako jasno definirati rad mikrokontrolera za AI, kako provjeriti generirani C/Arduino kod i zašto biste trebali mjeriti sve u hardveru.

Jasno definiranje zahtjeva: registracija, rezanje, vrijeme

Reći AI da "upali LED" neće raditi; Koja kartica, koji pin, koja frekvencija sata, koje vrijeme? Kada dodjeljujete ugrađeni zadatak umjetnoj inteligenciji, koristite ovaj okvir: hardver (MCU obitelj, sat, pin), funkcija (što će se dogoditi), ograničenje (vrijeme, napajanje, memorija) i sučelje (registar, HAL, Arduino biblioteka).

Slab upit / Jak upit

SLABO: "Proizvedi PWM sa STM32." (Rezultat: koji mjerač vremena, koja frekvencija, koji pin nije jasan; općenito, vjerojatno pogrešan kod naziva registra.) SNAŽNO: "Proizvedite 20 kHz, 0-100% podesivi PWM na TIM3 CH1 (PA6) za STM32F103 (sistemski takt od 72 MHz). Zapišite na razini registra (ne HAL). - Prescaler i ARR vrijednosti za 20 kHz IZRAČUNAJTE i pokažite izračun u retku za komentare. Postavite dužnost s parametrom funkcije između 0-100. Imajte na umu da će se vrijednosti promijeniti ako je vaša pretpostavka sata.

Razlika je u tome što snažni prompt tjera model da prikaže izračun i otkrije pretpostavku o satu. Dakle, možete neovisno provjeriti vrijednosti prescalera/ARR:

Za 20 kHz PWM (72 MHz takt): Timer_clock = 72 MHz Ako želimo prescaler = 72-1 → takt brojača = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Verifikacija: 1e6 / (49+1) = 20 000 Hz ✓

Revizija AI koda: Što tražiti?

Samo zato što se generirani kod kompajlira ne znači da radi ispravno. Slijedite ovaj kontrolni popis:

kontrolno područje

Što tražiti

Postavke registra/bita

Potpuno kompatibilan s podatkovnom tablicom, ispravna bit maska

Prekid (ISR)

Je li kratak? Nema odgode blokera? Koristi li se hlapljivo?

međuspremnik/niz

Postoji li granična kontrola? Opasnost od prelijevanja?

vrijeme

S odgodom ili timerom? Je li ispunjeno stvarno vremensko ograničenje?

Vrsta i širina

8/16/32-bitno prekoračenje, zabuna s predznakom/nepotpisanim

vlast/pas čuvar

Infinite loop feeding watchdog?

Servisne rutine prekida (ISR) najčešći su izvor pogrešaka. AI ponekad stavlja delay() ili dugu petlju unutar ISR-a. To dovodi do propuštanja drugih prekida i resetiranja psa čuvara. Pravilo: ISR treba biti što kraći; Glavni bi posao trebao biti postaviti zastavu i premjestiti je 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; čitanje_senzora(); // može potrajati dugo - BAD CASE_Delay(10); // kašnjenje u ISR-u - VRLO LOŠE }}// JAKO: ISR kratak; posao se pomiče u glavnu petlju volatile uint8_t tick_flag = 0; // volatile CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; zastavica_kvačice = 1; //samo postavite zastavicu }}// u glavnoj petlji:if (zastavica_kvačice) { zastavica_kvačice = 0; čitanje_senzora(); }

Oprez: Svaka varijabla koju dijele prekid i glavna petlja mora biti nepostojana. U suprotnom, kompajler može spremiti varijablu u predmemoriju u registar i propustiti ažuriranje. AI često zaboravlja ovu ključnu riječ; Posebno ga potražite prilikom čitanja koda.

Prelijevanje međuspremnika i pogreške tipa

AI može kopirati podatke sa serijskog porta u niz fiksne veličine bez provjere granica. U ugrađenom sustavu to znači uništavanje kontinuirane memorije i neobjašnjiva rušenja. Provjerite je li ograničenje provjereno na svakom strcpyju, indeksu polja i DMA međuspremniku. Slično, 8-bitni brojač se resetira nakon 255; AI to može zanemariti i osloniti se na prepuni račun.

Provjera hardvera: "Rad" se mjeri, a ne pretpostavlja

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

  1. Osciloskop/logički analizator: Mjerite PWM frekvenciju, vrijeme signala i valni oblik komunikacije. Ako želite 20 kHz, pogledajte 20 kHz na ekranu.
  2. Dnevnik serijskog porta (UART): ispišite vrijednosti varijabli, prijelaze stanja i brojače grešaka i usporedite s očekivanim ponašanjem.
  3. Vezano i stresno testiranje: Testirajte da li sustav izdržava najveće opterećenje, najbrže podatke i najgore vrijeme.

Ako se izmjerena vrijednost ne slaže s izračunom, pretpostavka sata, vrijednost predskalera ili postavka registra su netočni; potjera.

Mini torbica

Tim studenata ima AI ispisati kod za mjerenje udaljenosti pomoću ultrazvučnog senzora HC-SR04. Kod se kompilira, ali udaljenost uvijek daje smiješne vrijednosti. Kad ga spoje na osciloskop, vide da dionica ehoa računa svoje vrijeme u milisekundama umjesto u mikrosekundama; AI je koristio millis() umjesto micros(). Ova pogreška od jedne riječi zbunila je cijelo mjerenje za faktor 1000. Kada ispišu neobrađeno vrijeme odjeka u serijski dnevnik i usporede ga sa pravim ravnalom, pronađu pogrešku i poprave je. Lekcija: kompilirani kod nije točan kod; Mjerenje u hardveru odmah otkriva grešku.

Uobičajene greške

  • Prihvaćanje naziva registara i bit maski bez njihove usporedbe s podatkovnom tablicom.
  • Dopuštanje odgode blokiranja ili duge obrade unutar ISR-a.
  • Zaboravljamo volatile na dijeljenim varijablama.
  • Zaobići međuspremnik i provjeru granica polja; ne videći preljev.
  • Oslanjanje na frekvenciju sata i pretpostavke o vremenu bez njihove provjere.
  • Uzimajući u obzir da kod "radi" bez mjerenja osciloskopom/serijskim zapisnikom.

Ukratko

  • Jasno definirajte ugrađeni zadatak u smislu hardvera, funkcija, ograničenja i sučelja.
  • Neka AI izračuna vremenske vrijednosti kao što je prescaler/ARR i provjeri ih neovisno.
  • Neka ISR-ovi budu kratki, koristite volatile na zajedničkim varijablama.
  • Posebno potražite greške u registru, ograničenju međuspremnika i širini tipa.
  • "Radi" se dokazuje osciloskopom, logičkim analizatorom i serijskim dnevnikom, a ne kompajlerom.
  • Ako se izmjerena vrijednost ne slaže s izračunom, slijedite pretpostavke.

Zadatak aplikacije

S mikrokontrolerom koji imate (Arduino, STM32, ESP32), zatražite od umjetne inteligencije PWM ili periodični zadatak na određenoj frekvenciji. Prije učitavanja koda: (1) provjerite vrijednosti frekvencije/vremena neovisno o računu u retku za komentare, (2) provjerite postoji li nestabilnost i blokiranje u ISR-u i zajedničkim varijablama. Nakon učitavanja izmjerite stvarnu frekvenciju osciloskopom ili logičkim analizatorom i usporedite je s ciljanom. Ako postoji odstupanje, pronađite izvor i ispravite ga te zabilježite što je pogrešno pretpostavljeno.