Yunit 3 / 9

Mga Naka-embed na System at Microcontroller Code

Mga nadagdag:

  • Kakayahang tukuyin ang mga kinakailangan sa pagpaparehistro, pag-abala at timing para sa microcontroller na may malinaw na prompt
  • Kakayahang suriin ang C/Arduino code na ginawa ng AI sa mga tuntunin ng mga setting ng rehistro, buffer overflow at real time constraints
  • Kakayahang ilapat ang ugali ng pag-verify ng nabuong code sa pamamagitan ng pagsukat nito sa hardware (oscilloscope, serial port)

Ang naka-embed na pag-develop ng system ay kung saan ang software at hardware ay nagsalubong: ang pagtatakda ng isang rehistro ay hindi tama, ang paghawak ng isang interrupt na masyadong mahaba, o ang pag-uumapaw sa isang buffer ay magdudulot ng kakaiba, mahirap-reproduce na mga pagkabigo sa field, kahit na ang code ay "nag-compile" at tumatakbo. Ang AI ay tunay na isang accelerator sa lugar na ito; Makakagawa ito ng mga paunang skeleton, mga pag-andar ng abstraction ng hardware, mga makina ng estado at mga gawain sa komunikasyon. Ngunit hindi nakikita ng AI ang datasheet ng iyong card, hindi alam ang dalas ng iyong orasan, at hindi nararamdaman ang iyong mga real time na hadlang. Sa unit na ito, tatalakayin namin kung paano malinaw na tukuyin ang microcontroller work sa AI, kung paano suriin ang nabuong C/Arduino code, at kung bakit dapat mong sukatin ang lahat sa hardware.

Malinaw na Pagtukoy sa Kinakailangan: Magrehistro, Pagputol, Pag-time

Ang pagsasabi sa AI na "ilawan ang isang LED" ay hindi gagana; Aling card, aling pin, aling frequency ng orasan, aling timing? Kapag nagtatalaga ng naka-embed na gawain sa AI, gamitin ang framework na ito: hardware (pamilya ng MCU, orasan, pin), function (ano ang mangyayari), hadlang (timing, power, memory), at interface (magrehistro, HAL, Arduino library).

Mahina Prompt / Malakas na Prompt

MAHINA: "Gumawa ng PWM gamit ang STM32." (Resulta: aling timer, aling frequency, aling pin ang hindi malinaw; pangkalahatan, malamang na maling register na pinangalanang code.) MALAKAS: "Gumawa ng 20 kHz, 0-100% adjustable duty PWM sa TIM3 CH1 (PA6) para sa STM32F103 (72 MHz system clock). Isulat sa antas ng rehistro (hindi HAL ang halaga ng calcULA) para sa CALCTEL at ARR na ipinapakita sa halaga ng CALCCULA at ARR. linya ng komento. - Itakda ang tungkulin gamit ang isang parameter ng function sa pagitan ng 0-100 - Magkomento sa bawat bit ng rehistro na iyong ginagamit.

Ang pagkakaiba ay na ang malakas na prompt ay gumagawa ng modelo na ipakita ang pagkalkula at ibunyag ang pagpapalagay ng orasan. Kaya maaari mong suriin ang mga halaga ng prescaler/ARR nang nakapag-iisa:

Para sa 20 kHz PWM (72 MHz clock):Timer_clock = 72 MHzKung gusto namin prescaler = 72-1 → counter clock = 1 MSARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Verification: 1e6 / (49+1) = 20 Hz

Pag-audit ng AI Code: Ano ang Hahanapin?

Dahil lamang sa ang nabuong code ay nag-compile ay hindi nangangahulugan na ito ay gumagana nang tama. Sundin ang checklist na ito:

control area

Ano ang hahanapin

Mga setting ng pagrehistro/bit

Eksaktong tugma sa datasheet, tamang bit mask

Interrupt (ISR)

Maikli ba ito? Walang pagkaantala ng blocker? Ginagamit ba ang pabagu-bago ng isip?

buffer/array

Mayroon bang kontrol sa hangganan? Panganib ng pag-apaw?

timing

Sa pagkaantala o timer? Natutugunan ba ang aktwal na hadlang sa oras?

Uri at lapad

8/16/32-bit na overflow, nilagdaan/hindi nilagdaan na kalituhan

kapangyarihan / asong tagapagbantay

Infinite loop feeding watchdog?

Ang mga interrupt service routine (ISR) ay ang pinakakaraniwang pinagmumulan ng mga error. Minsan naglalagay ang AI ng delay() o mahabang loop sa loob ng ISR. Ito ay humahantong sa iba pang mga pagkaantala na napalampas at pag-reset ng asong tagapagbantay. Panuntunan: Ang ISR ay dapat na maikli hangga't maaari; Ang pangunahing trabaho ay dapat na mag-set up ng isang bandila at ilipat ito sa pangunahing loop.

// WEAK (minsan gumagawa nito ang AI): Blocker function sa ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // maaaring tumagal ng mahabang panahon - BAD CASE_Delay(10); // delay in ISR - VERY BAD }}// STRONG: ISR short; paglipat ng trabaho sa pangunahing loopvolatile uint8_t tick_flag = 0; // volatile CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; tick_flag = 1; //just set flag }}// in main loop:if (tick_flag) { tick_flag = 0; read_sensor(); }

Babala: Ang anumang variable na ibinahagi sa pagitan ng interrupt at ang pangunahing loop ay dapat na pabagu-bago. Kung hindi, maaaring i-cache ng compiler ang variable sa rehistro at makaligtaan ang update. Madalas na nakakalimutan ng AI ang keyword na ito; Hanapin ito partikular kapag binabasa ang code.

Buffer Overflow at Mga Error sa Uri

Maaaring kopyahin ng AI ang data mula sa serial port sa isang fixed-size na array nang walang bounds checking. Sa isang naka-embed na system, nangangahulugan ito ng pagdurog ng magkadikit na memorya at hindi maipaliwanag na mga pag-crash. Tiyaking naka-check ang limitasyon sa bawat strcpy, array index at DMA buffer. Katulad nito, ang isang 8-bit na counter ay nagre-reset pagkatapos ng 255; Maaaring balewalain ito ng AI at umasa sa umaapaw na account.

Pag-verify sa Hardware: Ang "Gumagana" ay Sinusukat, Hindi Ipinapalagay

Sa isang naka-embed na sistema, ang pinaka-maaasahang ebidensya ay ang metro, hindi ang compiler. I-verify ang nabuong code sa tatlong paraan na ito:

  1. Oscilloscope/logic analyzer: Sukatin ang PWM frequency, signal timing at communication waveform. Kung gusto mo ng 20 kHz, tingnan ang 20 kHz sa screen.
  2. Serial port (UART) log: Mag-print ng mga variable na value, state transition, at error counter at ihambing sa inaasahang gawi.
  3. Bound at stress testing: Subukan kung ang system ay tumatagal sa ilalim ng pinakamataas na load, pinakamabilis na data at pinakamasamang timing.

Kung ang sinusukat na halaga ay hindi sumasang-ayon sa pagkalkula, ang pagpapalagay ng orasan, halaga ng prescaler o setting ng rehistro ay hindi tama; habulin.

Mini Case

Ang isang pangkat ng mga mag-aaral ay may AI ng pag-print ng code ng pagsukat ng distansya na may HC-SR04 ultrasonic sensor. Ang code ay nag-compile ngunit ang distansya ay palaging nagbibigay ng mga nakakatawang halaga. Kapag ikinonekta nila ito sa oscilloscope, makikita nila na kinakalkula ng echo leg ang timing nito sa millisecond sa halip na microseconds; Ginamit ng AI ang millis() sa halip na micros(). Ang isang salita na error na ito ay nalito ang buong pagsukat sa pamamagitan ng isang kadahilanan na 1000. Kapag na-print nila ang raw echo time sa serial log at inihambing ito sa isang tunay na ruler, nakita nila ang error at inaayos ito. Aralin: hindi tamang code ang pinagsama-samang code; Ang pagsukat sa hardware ay nagpapakita ng error kaagad.

Mga Karaniwang Pagkakamali

  • Pagtanggap ng mga pangalan ng rehistro at mga bit mask nang hindi inihahambing ang mga ito sa datasheet.
  • Nagbibigay-daan sa pagkaantala ng pagharang o mahabang pagproseso sa loob ng ISR.
  • Ang paglimot sa pabagu-bago ng isip sa mga nakabahaging variable.
  • Bypass buffer at array bounds checking; hindi nakikita ang pag-apaw.
  • Umaasa sa dalas ng orasan at mga pagpapalagay sa timing nang hindi bini-verify ang mga ito.
  • Isinasaalang-alang ang code na "gumagana" nang hindi sinusukat ito gamit ang isang oscilloscope/serial log.

Sa buod

  • Malinaw na tukuyin ang naka-embed na gawain sa mga tuntunin ng hardware, function, mga hadlang at interface.
  • Hayaang kalkulahin ng AI ang mga halaga ng timing tulad ng prescaler/ARR at i-verify ang mga ito nang nakapag-iisa.
  • Panatilihing maikli ang mga ISR, gumamit ng pabagu-bago ng isip sa mga nakabahaging variable.
  • Sa partikular, hanapin ang mga error sa rehistro, limitasyon ng buffer at lapad ng uri.
  • "Gumagana ito" ay napatunayan sa isang oscilloscope, logic analyzer, at serial log, hindi sa compiler.
  • Kung ang sinusukat na halaga ay hindi sumasang-ayon sa pagkalkula, habulin ang mga pagpapalagay.

Gawain ng aplikasyon

Sa isang microcontroller na mayroon ka (Arduino, STM32, ESP32), tanungin ang AI para sa PWM o isang pana-panahong gawain sa isang tiyak na dalas. Bago i-load ang code: (1) i-verify ang mga halaga ng dalas/timing nang independyente ng account sa linya ng komento, (2) suriin kung may pabagu-bago at pagharang sa ISR at mga nakabahaging variable. Pagkatapos mag-upload, sukatin ang aktwal na dalas gamit ang isang oscilloscope o logic analyzer at ihambing ito sa target. Kung mayroong isang paglihis, hanapin ang pinagmulan at itama ito, at tandaan kung ano ang ipinapalagay na mali.