единица 3 / 9

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

Печалби:

  • Възможност за дефиниране на изисквания за регистър, прекъсване и време за микроконтролера с ясна подкана
  • Възможност за проверка на C/Arduino кода, произведен от AI по отношение на настройките на регистъра, препълването на буфера и ограниченията в реално време
  • Възможност за прилагане на навика за проверка на генерирания код чрез измерване на хардуер (осцилоскоп, сериен порт)

Разработката на вградена система е мястото, където софтуерът и хардуерът се пресичат: неправилното настройване на регистрационен бит, задържането на прекъсване твърде дълго или препълването на буфер ще доведе до странни, трудни за възпроизвеждане повреди в полето, въпреки че кодът се „компилира“ и изпълнява. AI наистина е ускорител в тази област; Той може да създаде първоначални скелети, функции за хардуерна абстракция, държавни машини и комуникационни процедури. Но AI не вижда листа с данни на вашата карта, не знае вашата тактова честота и не усеща ограниченията ви в реално време. В този раздел ще разгледаме как да дефинираме ясно работата на микроконтролера с AI, как да проверим генерирания C/Arduino код и защо трябва да измервате всичко в хардуера.

Ясно дефиниране на изискването: регистриране, рязане, време

Казването на AI да "светне светодиод" няма да работи; Коя карта, кой щифт, коя тактова честота, кое време? Когато възлагате вградена задача на AI, използвайте тази рамка: хардуер (семейство MCU, часовник, щифт), функция (какво ще се случи), ограничение (време, захранване, памет) и интерфейс (регистр, HAL, библиотека Arduino).

Слаба подкана / Силна подкана

СЛАБ: „Произвеждане на ШИМ със STM32.“ (Резултат: кой таймер, коя честота, кой щифт е неясен; общо, вероятно грешен код с име на регистър.) СИЛЕН: „Произвеждане на 20 kHz, 0-100% регулируема PWM на TIM3 CH1 (PA6) за STM32F103 (72 MHz системен часовник). Записвайте на ниво регистър (не HAL). - Стойности на Prescaler и ARR за 20 kHz ИЗЧИСЛЯВАЙТЕ и покажете изчисление в реда за коментар. Задайте функцията между 0-100 - Коментирайте всеки бит, който използвате, ако предположението ви за часовник е грешно.

Разликата е, че мощната подкана кара модела да показва изчислението и да разкрива предположението за часовника. Така че можете да проверите стойностите на prescaler/ARR независимо:

За 20 kHz PWM (72 MHz такт): Timer_clock = 72 MHz Ако искаме prescaler = 72-1 → брояч = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49 Проверка: 1e6 / (49+1) = 20 000 Hz ✓

Одитиране на AI код: Какво да търсите?

Това, че генерираният код се компилира, не означава, че работи правилно. Следвайте този контролен списък:

контролна зона

Какво да търсите

Настройки на регистър/битове

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

Прекъсване (ISR)

Кратък ли е? Няма забавяне на блокера? Използва ли се летлив?

буфер/масив

Има ли граничен контрол? Риск от преливане?

синхронизация

Със закъснение или таймер? Спазено ли е действителното времево ограничение?

Тип и ширина

8/16/32-битово препълване, объркване със знак/без знак

мощност/пазач

Страж за захранване с безкраен цикъл?

Процедурите за обслужване на прекъсвания (ISR) са най-честият източник на грешки. AI понякога поставя delay() или дълъг цикъл вътре в ISR. Това води до пропускане на други прекъсвания и нулиране на watchdog. Правило: ISR трябва да е възможно най-кратък; Основната работа трябва да бъде да настроите флаг и да го преместите в главния цикъл.

// СЛАБО (AI понякога произвежда това): Блокираща функция в ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // може да отнеме много време - ЛОШ CASE_Delay(10); // забавяне на ISR - МНОГО ЛОШО }}// СИЛНО: ISR кратко; заданието се премества в главния цикълvolatile uint8_t tick_flag = 0; // променлив CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; тик_флаг = 1; //просто задайте флаг }}// в главния цикъл:if (tick_flag) { tick_flag = 0; read_sensor(); }

Внимание: Всяка променлива, споделена между прекъсването и основния цикъл, трябва да бъде непостоянна. В противен случай компилаторът може да кешира променливата в регистъра и да пропусне актуализацията. AI често забравя тази ключова дума; Потърсете го специално, когато четете кода.

Препълване на буфера и тип грешки

AI може да копира данни от серийния порт в масив с фиксиран размер без проверка на границите. В една вградена система това означава смачкване на непрекъсната памет и необясними сривове. Уверете се, че ограничението е проверено при всеки strcpy, индекс на масив и DMA буфер. По подобен начин 8-битов брояч се нулира след 255; AI може да игнорира това и да разчита на препълнен акаунт.

Проверка в хардуера: „Работа“ се измерва, а не се предполага

В една вградена система най-надеждното доказателство е измервателният уред, а не компилаторът. Проверете генерирания код по тези три начина:

  1. Осцилоскоп/логически анализатор: Измерва честотата на ШИМ, времето на сигнала и формата на комуникационната вълна. Ако искате 20 kHz, вижте 20 kHz на екрана.
  2. Журнал на сериен порт (UART): Отпечатайте стойности на променливи, преходи на състояния и броячи на грешки и ги сравнете с очакваното поведение.
  3. Обвързано и стрес тестване: Тествайте дали системата издържа при най-голямо натоварване, най-бързи данни и най-лошо време.

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

Мини калъф

Екип от студенти накара AI да отпечата код за измерване на разстояние с ултразвуков сензор HC-SR04. Кодът се компилира, но разстоянието винаги дава абсурдни стойности. Когато го свържат с осцилоскопа, те виждат, че кракът на ехото изчислява времето си в милисекунди вместо в микросекунди; AI използва millis() вместо micros(). Тази грешка от една дума обърка цялото измерване с коефициент 1000. Когато отпечатат необработеното ехо време в серийния дневник и го сравнят с истинска линийка, те откриват грешката и я поправят. Урок: компилираният код не е правилен код; Измерването в хардуера веднага разкрива грешката.

Често срещани грешки

  • Приемане на имена на регистри и битови маски, без да ги сравнява с листа с данни.
  • Позволява забавяне на блокиране или дълга обработка в ISR.
  • Забравяйки нестабилността на споделените променливи.
  • Проверка на границите на буфера и масива; не вижда преливането.
  • Разчитане на тактова честота и предположения за времето, без да ги проверявате.
  • Като се има предвид, че кодът „работи“, без да се измерва с осцилоскоп/сериен дневник.

В обобщение

  • Ясно дефинирайте вградената задача по отношение на хардуер, функция, ограничения и интерфейс.
  • Накарайте изкуствения интелект да изчисли стойности на времето, като прескалер/ARR, и ги проверете независимо.
  • Поддържайте ISR кратки, използвайте volatile за споделени променливи.
  • По-специално потърсете грешки в регистъра, лимита на буфера и ширината на типа.
  • „Работи“ се доказва с осцилоскоп, логически анализатор и сериен дневник, а не с компилатора.
  • Ако измерената стойност не съвпада с изчислението, преследвайте предположенията.

Задача за приложение

С микроконтролер, който имате (Arduino, STM32, ESP32), поискайте от AI ШИМ или периодична задача на определена честота. Преди да заредите кода: (1) проверете стойностите на честотата/времето независимо от акаунта в реда за коментар, (2) проверете за непостоянни и блокиращи в ISR и споделените променливи. След качване измерете действителната честота с осцилоскоп или логически анализатор и я сравнете с целта. Ако има отклонение, намерете източника и го коригирайте и отбележете какво е прието за грешно.