Единица 3 / 9

Вградени системи и код на микроконтролер

Добивки:

  • Способност да се дефинираат барањата за регистер, прекин и тајминг за микроконтролерот со јасна порака
  • Способност да се провери кодот C/Arduino произведен од AI во однос на поставките на регистарот, прелевањето на баферот и ограничувањата во реално време
  • Способност да се примени навиката за проверка на генерираниот код со мерење на хардвер (осцилоскоп, сериски приклучок)

Развојот на вградениот систем е местото каде што се вкрстуваат софтверот и хардверот: погрешно поставување на бит за регистар, предолго задржување на прекин или прелевање на баферот ќе предизвика чудни, тешко репродуцирани неуспеси на теренот, иако кодот се „компајлира“ и работи. ВИ е навистина акцелератор во оваа област; Може да произведе почетни скелети, функции за апстракција на хардверот, државни машини и комуникациски рутини. Но, вештачката интелигенција не го гледа листот со податоци на вашата картичка, не ја знае вашата фреквенција на часовникот и не ги чувствува вашите ограничувања во реално време. Во оваа единица, ќе опфатиме како јасно да ја дефинирате работата на микроконтролерот за AI, како да го проверите генерираниот C/Arduino код и зошто треба да измерите сè во хардверот.

Јасно дефинирање на барањето: Регистрирај се, сечење, тајминг

Кажувањето на вештачката интелигенција да „запали LED“ нема да работи; Која картичка, кој пин, која фреквенција на часовникот, кој тајминг? Кога доделувате вградена задача на AI, користете ја оваа рамка: хардвер (семејство MCU, часовник, пин), функција (што ќе се случи), ограничување (тајминг, моќ, меморија) и интерфејс (регистар, HAL, библиотека Arduino).

Слаба навестување / Силен навестување

СЛАБО: „Произведувајте PWM со STM32“. (Резултат: кој тајмер, која фреквенција, кој пин е нејасен; општ, веројатно погрешен регистар со име код.) СИЛНО: "Произведете 20 kHz, 0-100% прилагодливи должности PWM на TIM3 CH1 (PA6) за STM32F103 (72 MHz системски часовник). Напишете на ниво на регистарот -РРСскалар (не. ПРЕСМЕТАЈТЕ и прикажете ја пресметката во линијата за коментари - Поставете ја должноста со параметар од 0 до 100 - Коментирајте го секој бит на регистарот што го користите.

Разликата е во тоа што моќната порака го прави моделот да ја покаже пресметката и да ја открие претпоставката за часовникот. Така, можете независно да ги проверите вредностите за премерување/АРР:

За 20 kHz PWM (72 MHz часовник):Timer_clock = 72 MHzАко сакаме prescaler = 72-1 → counter clock = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Verification: 1e+10) = 4

Ревизија на код за вештачка интелигенција: што да барате?

Само затоа што генерираниот код се компајлира не значи дека работи правилно. Следете ја оваа листа за проверка:

контролна област

Што да барате

Регистрирајте/битни поставки

Точно компатибилен со лист со податоци, правилна бит маска

Прекин (ISR)

Дали е кратко? Нема одложување на блокаторот? Дали се користи испарливи?

тампон/низа

Дали има гранична контрола? Ризик од прелевање?

тајмингот

Со задоцнување или тајмер? Дали е исполнето вистинското временско ограничување?

Вид и ширина

8/16/32-битен прелевање, потпишана/непотпишана конфузија

моќ/чувар

Чувар за хранење со бесконечна јамка?

Рутините за прекин на услугата (ISR) се најчестиот извор на грешки. AI понекогаш става delay() или долга јамка во ISR. Ова води до пропуштање на други прекини и ресетирање на чуварот. Правило: ISR треба да биде што е можно пократок; Главната работа треба да биде да поставите знаменце и да го преместите во главната јамка.

// СЛАБ (ВИ понекогаш го произведува ова): Функција на блокирање во ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // може да потрае долго - BAD CASE_Delay(10); // доцнење во ISR - МНОГУ ЛОШО }}// СИЛНО: краток ISR; работата се префрла во главната јамка испарливи uint8_t tick_flag = 0; // испарливи CONDITION void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; штиклирајте_знаме = 1; //само поставете знаменце }}// во главната јамка: ако (штиклирајте_знаме) { tick_flag = 0; read_sensor(); }

Внимание: секоја променлива споделена помеѓу прекинот и главната јамка мора да биде испарлива. Во спротивно, компајлерот може да ја кешира променливата во регистарот и да го пропушти ажурирањето. ВИ често го заборава овој клучен збор; Побарајте го конкретно кога го читате кодот.

Прелевање на баферот и грешки во типот

ВИ може да копира податоци од сериската порта во низа со фиксна големина без проверка на границите. Во вграден систем, ова значи уништување на соседната меморија и необјаснети падови. Осигурајте се дека ограничувањето е проверено на секој strcpy, индекс на низа и DMA бафер. Слично на тоа, 8-битен бројач се ресетира по 255; ВИ може да го игнорира ова и да се потпре на преплавена сметка.

Верификација во хардвер: „Работата“ се мери, не се претпоставува

Во вграден систем, најсигурен доказ е мерачот, а не компајлерот. Потврдете го генерираниот код на овие три начини:

  1. Осцилоскоп/логички анализатор: Мери PWM фреквенција, тајминг на сигналот и комуникациска бранова форма. Ако сакавте 20 kHz, видете 20 kHz на екранот.
  2. Дневник за сериска порта (UART): отпечатете ги вредностите на променливите, транзициите на состојбите и бројачите на грешки и споредете со очекуваното однесување.
  3. Тестирање врзани и стрес: тестирајте дали системот се држи под најголемото оптоварување, најбрзите податоци и најлошото време.

Ако измерената вредност не се согласува со пресметката, претпоставката на часовникот, вредноста на прескалерот или поставувањето на регистарот е неточна; потера.

Мини случај

Тим студенти има ВИ печати код за мерење на растојание со ултразвучен сензор HC-SR04. Кодот се компајлира, но растојанието секогаш дава смешни вредности. Кога ќе го поврзат со осцилоскопот, гледаат дека ехо ногата го пресметува своето време во милисекунди наместо во микросекунди; AI користеше millis() наместо micros(). Оваа грешка од еден збор го помеша целото мерење за фактор 1000. Кога ќе го испечатат необработеното време на ехо во серискиот дневник и ќе го споредат со вистински линијар, тие ја наоѓаат грешката и ја поправаат. Лекција: составениот код не е точен код; Мерењето во хардвер ја открива грешката веднаш.

Вообичаени грешки

  • Прифаќање имиња на регистри и маски на битови без нивно споредување со листот со податоци.
  • Дозволување одложување на блокирањето или долга обработка во рамките на ISR.
  • Заборавањето на испарливите на споделените променливи.
  • Заобиколување на баферот и проверката на границите на низата; не гледајќи го прелевањето.
  • Потпирајќи се на фреквенцијата на часовникот и претпоставките за тајминг без да ги потврдите.
  • Сметајќи дека кодот „работи“ без да се мери со осцилоскоп/сериски дневник.

Сумирано

  • Јасно дефинирајте ја вградената задача во однос на хардверот, функцијата, ограничувањата и интерфејсот.
  • Нека вештачката интелигенција ги пресметува вредностите на тајмингот, како што е прескалерот/ARR и потврдете ги независно.
  • Одржувајте ги ISR кратки, користете испарливи на споделени променливи.
  • Конкретно барајте грешки во регистарот, тампонот и ширината на типот.
  • „Работи“ се докажува со осцилоскоп, логички анализатор и сериски дневник, а не со компајлерот.
  • Ако измерената вредност не се согласува со пресметката, следете ги претпоставките.

Задача за апликација

Со микроконтролер што го имате (Arduino, STM32, ESP32), побарајте од AI PWM или периодична задача на одредена фреквенција. Пред да го вчитате кодот: (1) проверете ги вредностите на фреквенцијата/тајмингот независно од сметката во линијата за коментари, (2) проверете дали има испарливи и блокирани во ISR и споделените променливи. По поставувањето, измерете ја вистинската фреквенција со осцилоскоп или логички анализатор и споредете ја со целта. Ако има отстапување, пронајдете го изворот и поправете го и забележете што се претпоставува погрешно.