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:
- Osciloskop/logički analizator: Mjerite PWM frekvenciju, vrijeme signala i valni oblik komunikacije. Ako želite 20 kHz, pogledajte 20 kHz na ekranu.
- Dnevnik serijskog porta (UART): ispišite vrijednosti varijabli, prijelaze stanja i brojače grešaka i usporedite s očekivanim ponašanjem.
- 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.