Vienība 3 / 9

Iegultās sistēmas un mikrokontrollera kods

Ieguvumi:

  • Spēja definēt reģistra, pārtraukuma un laika prasības mikrokontrolleram ar skaidru uzvedni
  • Iespēja pārbaudīt AI radīto C/Arduino kodu reģistra iestatījumu, bufera pārpildes un reāllaika ierobežojumu ziņā
  • Spēja pielietot ieradumu pārbaudīt ģenerēto kodu, mērot to uz aparatūras (osciloskops, seriālais ports)

Iegultās sistēmas izstrāde ir vieta, kur saskaras programmatūra un aparatūra: nepareizi iestatot reģistra bitu, turot pārāk ilgu pārtraukumu vai pārpildot buferi, laukā radīsies dīvainas, grūti reproducējamas kļūmes, lai gan kods "kompilējas" un darbojas. AI patiešām ir paātrinātājs šajā jomā; Tas var radīt sākotnējos skeletus, aparatūras abstrakcijas funkcijas, stāvokļa mašīnas un komunikācijas rutīnas. Taču mākslīgais intelekts neredz jūsu kartes datu lapu, nezina jūsu pulksteņa frekvenci un nejūt jūsu reāllaika ierobežojumus. Šajā nodaļā mēs apskatīsim, kā skaidri definēt mikrokontrollera darbu AI, kā pārbaudīt ģenerēto C/Arduino kodu un kāpēc viss ir jāmēra aparatūrā.

Skaidra prasības definēšana: reģistrēšana, griešana, laiks

Paziņojums AI "iedegties LED" nedarbosies; Kura karte, kura tapa, kura pulksteņa frekvence, kāds laiks? Piešķirot AI iegulto uzdevumu, izmantojiet šo sistēmu: aparatūra (MCU saime, pulkstenis, tapa), funkcija (kas notiks), ierobežojums (laiks, jauda, ​​atmiņa) un interfeiss (reģistrs, HAL, Arduino bibliotēka).

Vāja uzvedne / spēcīga uzvedne

VĀJS: "Izveidojiet PWM ar STM32." (Rezultāts: kurš taimeris, kura frekvence, kura tapa ir neskaidra; vispārīgs, iespējams, nepareizs reģistra nosaukts kods.) STRONG: "Izveidojiet 20 kHz, 0–100% regulējamu darba PWM uz TIM3 CH1 (PA6) STM32F103 (72 MHz sistēmas pulkstenis). Rakstiet reģistra līmenī (nevis HAL). Komentāru rindā - Iestatiet pienākumu ar funkcijas parametru no 0 līdz 100. Ņemiet vērā, ka vērtības mainīsies, ja pieņēmums ir nepareizs.

Atšķirība ir tāda, ka jaudīgā uzvedne liek modelim parādīt aprēķinu un atklāt pulksteņa pieņēmumu. Tātad jūs varat pārbaudīt prescaler/ARR vērtības neatkarīgi:

20 kHz PWM (72 MHz pulkstenis): taimeris_pulkstenis = 72 MHz, ja vēlamies priekšskalotāju = 72-1 → skaitītāja pulkstenis = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49 Verifikācija: 1e6 / (49+1) = 20 00 Hz.

AI koda audits: ko meklēt?

Tas, ka ģenerētais kods tiek apkopots, nenozīmē, ka tas darbojas pareizi. Izpildiet šo kontrolsarakstu:

kontroles zona

Ko meklēt

Reģistrācijas/bitu iestatījumi

Precīzi saderīgs ar datu lapu, pareiza bitu maska

Pārtraukums (ISR)

Vai tas ir īss? Nav bloķētāja kavēšanās? Vai izmanto gaistošus?

buferis/masīvs

Vai ir robežkontrole? Pārplūdes risks?

laika noteikšana

Ar aizkavi vai taimeri? Vai tiek ievērots faktiskais laika ierobežojums?

Veids un platums

8/16/32 bitu pārpilde, parakstīts/neparakstīts apjukums

spēks/sargsuns

Bezgalīgas cilpas barošanas sargsuns?

Pārtraukšanas pakalpojumu rutīnas (ISR) ir visizplatītākais kļūdu avots. AI dažreiz ievieto aizkavi () vai garo cilpu ISR. Tas noved pie tā, ka citi pārtraukumi tiek palaisti garām un sargsuņa tiek atiestatīti. Noteikums: ISR jābūt pēc iespējas īsākam; Galvenais uzdevums ir izveidot karogu un pārvietot to uz galveno cilpu.

// VĀJS (AI dažreiz to rada): Bloķētāja funkcija ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; lasīt_sensors(); // var aizņemt ilgu laiku - BAD CASE_Delay(10); // ISR aizkave - ĻOTI SLIKI }}// STRONG: ISR short; darbs tiek pārvietots uz galveno cilpas nepastāvīgo uint8_t tick_flag = 0; // nepastāvīgs CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; atzīmes_karogs = 1; //tikai iestatiet karogu }}// galvenajā cilpā:if (tick_flag) { ķeksītis_karogs = 0; lasīt_sensors(); }

Uzmanību: jebkuram mainīgajam, kas tiek koplietots starp pārtraukumu un galveno cilpu, jābūt nepastāvīgam. Pretējā gadījumā kompilators var saglabāt mainīgo lielumu reģistrā un palaist garām atjauninājumu. AI bieži aizmirst šo atslēgvārdu; Meklējiet to īpaši, lasot kodu.

Bufera pārpilde un tipa kļūdas

AI var kopēt datus no seriālā porta fiksēta izmēra masīvā bez robežu pārbaudes. Iegultā sistēmā tas nozīmē blakus esošās atmiņas sagraušanu un neizskaidrojamas avārijas. Pārliecinieties, vai ierobežojums ir pārbaudīts katrā strcpy, masīva indeksā un DMA buferī. Līdzīgi 8 bitu skaitītājs tiek atiestatīts pēc 255; AI var to ignorēt un paļauties uz pārpildītu kontu.

Verifikācija aparatūrā: “Darbs” tiek mērīts, nevis pieņemts

Iegultā sistēmā visdrošākais pierādījums ir skaitītājs, nevis kompilators. Pārbaudiet ģenerēto kodu šādos trīs veidos:

  1. Osciloskops/loģiskais analizators: mēra PWM frekvenci, signāla laiku un sakaru viļņu formu. Ja vēlaties 20 kHz, skatiet ekrānā 20 kHz.
  2. Serial port (UART) žurnāls: izdrukājiet mainīgās vērtības, stāvokļa pārejas un kļūdu skaitītājus un salīdziniet ar paredzamo darbību.
  3. Saistības un stresa testēšana: pārbaudiet, vai sistēma iztur visaugstāko slodzi, ātrākos datus un sliktāko laiku.

Ja izmērītā vērtība nesakrīt ar aprēķinu, pulksteņa pieņēmums, priekšskalera vērtība vai reģistra iestatījums ir nepareizs; vajāt.

Mini futrālis

Studentu komandai ir AI izdrukāt attāluma mērīšanas kodu ar HC-SR04 ultraskaņas sensoru. Kods tiek apkopots, bet attālums vienmēr dod smieklīgas vērtības. Kad viņi to savieno ar osciloskopu, viņi redz, ka atbalss kājiņa laiku aprēķina milisekundēs, nevis mikrosekundēs; AI izmantoja millis (), nevis micros (). Šī viena vārda kļūda sajauca visu mērījumu par koeficientu 1000. Kad viņi izdrukā neapstrādāto atbalss laiku sērijas žurnālā un salīdzina to ar īstu lineālu, viņi atrod kļūdu un to izlabo. Nodarbība: apkopotais kods nav pareizs; Mērīšana aparatūrā nekavējoties atklāj kļūdu.

Biežākās kļūdas

  • Reģistru nosaukumu un bitu masku pieņemšana, nesalīdzinot tos ar datu lapu.
  • Atļauja bloķēšanas aizkavi vai ilgu apstrādi ISR ​​ietvaros.
  • Aizmirstot par nepastāvību koplietotajiem mainīgajiem.
  • apiet bufera un masīva robežu pārbaudi; neredzot pārplūdi.
  • Paļaušanās uz pulksteņa frekvences un laika pieņēmumiem, tos nepārbaudot.
  • Uzskatot, ka kods "strādā" bez mērīšanas ar osciloskopu/sērijas žurnālu.

Rezumējot

  • Skaidri definējiet iegulto uzdevumu aparatūras, funkciju, ierobežojumu un interfeisa izteiksmē.
  • Lieciet AI aprēķināt laika vērtības, piemēram, prescaler/ARR, un pārbaudīt tās neatkarīgi.
  • Saglabājiet ISR īsus, koplietojamiem mainīgajiem izmantojiet nepastāvīgus.
  • Īpaši meklējiet reģistra, bufera ierobežojumu un tipa platuma kļūdas.
  • "Tas darbojas" ir pierādīts ar osciloskopu, loģisko analizatoru un sērijas žurnālu, nevis ar kompilatoru.
  • Ja izmērītā vērtība nesakrīt ar aprēķinu, ievērojiet pieņēmumus.

Lietojumprogrammas uzdevums

Izmantojot jūsu mikrokontrolleri (Arduino, STM32, ESP32), pieprasiet AI PWM vai periodisku uzdevumu noteiktā frekvencē. Pirms koda ielādes: (1) pārbaudiet frekvences/laika vērtības neatkarīgi no konta komentāru rindā, (2) pārbaudiet, vai ISR ​​un koplietotajos mainīgajos nav nepastāvības un bloķēšanas. Pēc augšupielādes izmēra faktisko frekvenci ar osciloskopu vai loģisko analizatoru un salīdziniet to ar mērķi. Ja ir novirze, atrodiet avotu un izlabojiet to un atzīmējiet, kas tika pieņemts nepareizi.