одиниця 3 / 9

Код вбудованих систем і мікроконтролерів

Прибуток:

  • Можливість визначати вимоги до регістру, переривання та часу для мікроконтролера за допомогою чіткої підказки
  • Можливість перевірити код C/Arduino, створений штучним інтелектом, щодо налаштувань регістру, переповнення буфера та обмежень реального часу
  • Можливість застосовувати звичку перевіряти згенерований код шляхом вимірювання його апаратним забезпеченням (осцилограф, послідовний порт)

Розробка вбудованих систем є місцем, де перетинаються програмне та апаратне забезпечення: неправильне встановлення біта регістра, надто довге утримання переривання або переповнення буфера призведе до дивних, важковідтворюваних збоїв у полі, навіть якщо код «компілюється» та виконується. AI справді є прискорювачем у цій галузі; Він може створювати початкові скелети, апаратні функції абстракції, кінцеві автомати та підпрограми зв’язку. Але штучний інтелект не бачить таблиці даних вашої картки, не знає вашої тактової частоти та не відчуває ваших обмежень у реальному часі. У цьому розділі ми розповімо, як чітко визначити роботу мікроконтролера для ШІ, як перевірити згенерований код C/Arduino та чому вам слід вимірювати все в апаратному забезпеченні.

Чітке визначення вимоги: реєстрація, скорочення, час

Сказати ШІ «засвітити світлодіод» не спрацює; Яка карта, який контакт, яка тактова частота, який час? Призначаючи вбудоване завдання штучному інтелекту, використовуйте цю структуру: апаратне забезпечення (сімейство MCU, годинник, контакт), функція (що станеться), обмеження (час, живлення, пам’ять) та інтерфейс (реєстр, HAL, бібліотека Arduino).

Слабка підказка / Сильна підказка

СЛАБКО: «Виробляти ШІМ за допомогою STM32». (Результат: який таймер, яка частота, який контакт незрозумілий; загальне, ймовірно, неправильний код імені регістра.) СИЛЬНИЙ: "Створення 20 кГц, 0-100% регульованого навантаження ШІМ на TIM3 CH1 (PA6) для STM32F103 (72 МГц системний годинник). Запис на рівні регістра (не HAL). - Значення попереднього делікатора та ARR для 20 кГц ОБЧИСЛИТИ та показати обчислення в рядку коментаря. Встановіть параметр функції між 0-100. Зауважте, що значення будуть змінені, якщо ваше припущення буде неправильним.

Різниця полягає в тому, що потужна підказка змушує модель показувати обчислення та розкривати припущення про годинник. Таким чином, ви можете перевірити значення попереднього делителя/ARR незалежно:

Для 20 кГц ШІМ (тактова частота 72 МГц): Timer_clock = 72 МГц, якщо ми хочемо попередній дільник = 72-1 → тактова частота лічильника = 1 MHzARR = (1 МГц / 20 кГц) - 1 = 50 - 1 = 49 Перевірка: 1e6 / (49+1) = 20 000 Гц ✓

Аудит коду ШІ: на що звернути увагу?

Те, що згенерований код компілюється, не означає, що він працює правильно. Дотримуйтеся цього контрольного списку:

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

На що звернути увагу

Параметри регістру/біту

Повна сумісність із таблицею даних, правильна бітова маска

Переривання (ISR)

Це коротко? Немає затримки блокувальника? Чи використовується летючий?

буфер/масив

Чи є прикордонний контроль? Ризик переповнення?

терміни

Із затримкою чи таймером? Чи дотримані фактичні часові обмеження?

Тип і ширина

8/16/32-бітове переповнення, плутанина зі знаком/без знаку

влада/сторожовий пес

Сторожовий таймер подачі нескінченного циклу?

Програми обслуговування переривань (ISR) є найпоширенішим джерелом помилок. ШІ іноді поміщає delay() або довгий цикл у ISR. Це призводить до пропуску інших переривань і скидання сторожового таймера. Правило: ISR має бути якомога коротшим; Основна робота повинна полягати в тому, щоб встановити прапорець і перемістити його в основний цикл.

// СЛАБКО (штучний інтелект інколи створює це): функція блокування в 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; tick_flag = 1; //просто встановити прапорець }}// у головному циклі:if (tick_flag) { tick_flag = 0; read_sensor(); }

Застереження: будь-яка змінна, яка використовується між перериванням і основним циклом, має бути мінливою. В іншому випадку компілятор може кешувати змінну в реєстрі та пропустити оновлення. ШІ часто забуває це ключове слово; Шукайте його конкретно під час читання коду.

Переповнення буфера та помилки типу

ШІ може копіювати дані з послідовного порту в масив фіксованого розміру без перевірки меж. У вбудованій системі це означає руйнування безперервної пам’яті та непояснені збої. Переконайтеся, що обмеження перевірено для кожного strcpy, індексу масиву та буфера DMA. Так само 8-бітний лічильник скидається після 255; ШІ може ігнорувати це та покладатися на переповнений обліковий запис.

Перевірка апаратного забезпечення: "Робочий" вимірюється, а не припускається

У вбудованій системі найнадійнішим доказом є лічильник, а не компілятор. Перевірте створений код трьома способами:

  1. Осцилограф/логічний аналізатор: Вимірюйте частоту ШІМ, синхронізацію сигналу та форму сигналу зв’язку. Якщо ви хочете 20 кГц, побачите 20 кГц на екрані.
  2. Журнал послідовного порту (UART): роздрукуйте значення змінних, зміни стану та лічильники помилок і порівняйте з очікуваною поведінкою.
  3. Прив’язане та стрес-тестування: перевірте, чи витримує система найвище навантаження, найшвидші дані та найгірший час.

Якщо виміряне значення не узгоджується з розрахунком, припущення годинника, значення попереднього делителя або налаштування регістра неправильні; погоня.

Міні-чохол

Команда студентів має ШІ надрукувати код вимірювання відстані за допомогою ультразвукового датчика HC-SR04. Код компілюється, але відстань завжди дає смішні значення. Коли вони підключають його до осцилографа, вони бачать, що луна-нога обчислює свій час у мілісекундах замість мікросекунд; AI використовував millis() замість micros(). Ця помилка в одному слові спотворила все вимірювання в 1000 разів. Коли вони друкують необроблений час відлуння в послідовний журнал і порівнюють його з реальною лінійкою, вони знаходять помилку та виправляють її. Урок: скомпільований код не є правильним кодом; Апаратне вимірювання відразу виявляє помилку.

Поширені помилки

  • Прийняття імен регістрів і бітових масок без порівняння їх із таблицею даних.
  • Дозволяє затримку блокування або тривалу обробку в ISR.
  • Забувши про мінливість спільних змінних.
  • Обійти буфер і перевірку меж масиву; не бачачи переповнення.
  • Покладання на тактову частоту та припущення про час без їх перевірки.
  • Вважаючи код "робочим", не вимірюючи його за допомогою осцилографа/послідовного журналу.

Підсумовуючи

  • Чітко визначте вбудоване завдання з точки зору апаратного забезпечення, функцій, обмежень та інтерфейсу.
  • Попросіть штучний інтелект обчислити значення часу, такі як попередній дільник/ARR, і перевірити їх незалежно.
  • Зберігайте ISR короткими, використовуйте volatile для спільних змінних.
  • Особливо шукайте помилки регістра, обмеження буфера та ширини типу.
  • «Це працює» підтверджено за допомогою осцилографа, логічного аналізатора та послідовного журналу, а не за допомогою компілятора.
  • Якщо виміряне значення не збігається з розрахунком, дотримуйтесь припущень.

Аплікаційне завдання

Якщо у вас є мікроконтролер (Arduino, STM32, ESP32), попросіть ШІ ШІМ або періодичне завдання на певній частоті. Перед завантаженням коду: (1) перевірте значення частоти/часу незалежно від облікового запису в рядку коментаря, (2) перевірте мінливість і блокування в ISR і спільних змінних. Після завантаження виміряйте фактичну частоту за допомогою осцилографа або логічного аналізатора та порівняйте її з цільовою. Якщо є відхилення, знайдіть джерело та виправте його, а також зауважте, що було припущено неправильно.