Печалби:
- Възможност за дефиниране на изисквания за регистър, прекъсване и време за микроконтролера с ясна подкана
- Възможност за проверка на 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 може да игнорира това и да разчита на препълнен акаунт.
Проверка в хардуера: „Работа“ се измерва, а не се предполага
В една вградена система най-надеждното доказателство е измервателният уред, а не компилаторът. Проверете генерирания код по тези три начина:
- Осцилоскоп/логически анализатор: Измерва честотата на ШИМ, времето на сигнала и формата на комуникационната вълна. Ако искате 20 kHz, вижте 20 kHz на екрана.
- Журнал на сериен порт (UART): Отпечатайте стойности на променливи, преходи на състояния и броячи на грешки и ги сравнете с очакваното поведение.
- Обвързано и стрес тестване: Тествайте дали системата издържа при най-голямо натоварване, най-бързи данни и най-лошо време.
Ако измерената стойност не съвпада с изчислението, предположението за часовник, стойността на предскалера или настройката на регистъра са неправилни; преследвам.
Мини калъф
Екип от студенти накара AI да отпечата код за измерване на разстояние с ултразвуков сензор HC-SR04. Кодът се компилира, но разстоянието винаги дава абсурдни стойности. Когато го свържат с осцилоскопа, те виждат, че кракът на ехото изчислява времето си в милисекунди вместо в микросекунди; AI използва millis() вместо micros(). Тази грешка от една дума обърка цялото измерване с коефициент 1000. Когато отпечатат необработеното ехо време в серийния дневник и го сравнят с истинска линийка, те откриват грешката и я поправят. Урок: компилираният код не е правилен код; Измерването в хардуера веднага разкрива грешката.
Често срещани грешки
- Приемане на имена на регистри и битови маски, без да ги сравнява с листа с данни.
- Позволява забавяне на блокиране или дълга обработка в ISR.
- Забравяйки нестабилността на споделените променливи.
- Проверка на границите на буфера и масива; не вижда преливането.
- Разчитане на тактова честота и предположения за времето, без да ги проверявате.
- Като се има предвид, че кодът „работи“, без да се измерва с осцилоскоп/сериен дневник.
В обобщение
- Ясно дефинирайте вградената задача по отношение на хардуер, функция, ограничения и интерфейс.
- Накарайте изкуствения интелект да изчисли стойности на времето, като прескалер/ARR, и ги проверете независимо.
- Поддържайте ISR кратки, използвайте volatile за споделени променливи.
- По-специално потърсете грешки в регистъра, лимита на буфера и ширината на типа.
- „Работи“ се доказва с осцилоскоп, логически анализатор и сериен дневник, а не с компилатора.
- Ако измерената стойност не съвпада с изчислението, преследвайте предположенията.
Задача за приложение
С микроконтролер, който имате (Arduino, STM32, ESP32), поискайте от AI ШИМ или периодична задача на определена честота. Преди да заредите кода: (1) проверете стойностите на честотата/времето независимо от акаунта в реда за коментар, (2) проверете за непостоянни и блокиращи в ISR и споделените променливи. След качване измерете действителната честота с осцилоскоп или логически анализатор и я сравнете с целта. Ако има отклонение, намерете източника и го коригирайте и отбележете какво е прието за грешно.