Birlik 3 / 9

O'rnatilgan tizimlar va mikrokontroller kodi

Daromadlar:

  • Mikrokontroller uchun registr, uzilish va vaqt talablarini aniq taklif bilan aniqlash qobiliyati
  • AI tomonidan ishlab chiqarilgan C/Arduino kodini registr sozlamalari, bufer to'lib ketishi va real vaqt cheklovlari nuqtai nazaridan tekshirish qobiliyati
  • Ishlab chiqarilgan kodni apparatda o'lchash orqali tekshirish odatini qo'llash qobiliyati (ossiloskop, ketma-ket port)

O'rnatilgan tizimni ishlab chiqish dasturiy ta'minot va apparatning kesishgan joyidir: registr bitini noto'g'ri o'rnatish, uzilishni juda uzoq ushlab turish yoki buferni to'ldirish, kod "kompilyatsiya" va ishlayotgan bo'lsa ham, maydonda g'alati, qayta ishlab chiqarish qiyin bo'lgan nosozliklarni keltirib chiqaradi. AI haqiqatan ham bu sohada tezlatuvchidir; U dastlabki skeletlarni, apparatni abstraktsiya qilish funktsiyalarini, davlat mashinalarini va aloqa tartiblarini ishlab chiqishi mumkin. Ammo AI kartangizning ma'lumotlar jadvalini ko'rmaydi, sizning soat chastotangizni bilmaydi va real vaqt cheklovlaringizni sezmaydi. Ushbu bo'limda biz AI uchun mikrokontroller ishini qanday aniq belgilashni, yaratilgan C/Arduino kodini qanday tekshirishni va nima uchun hamma narsani apparatda o'lchash kerakligini ko'rib chiqamiz.

Talabni aniq belgilash: ro'yxatga olish, kesish, vaqtni belgilash

AIga "LEDni yoqish" deyish ishlamaydi; Qaysi karta, qaysi pin, qaysi soat chastotasi, qaysi vaqt? AIga o'rnatilgan vazifani tayinlashda ushbu ramkadan foydalaning: apparat (MCU oilasi, soat, pin), funksiya (nima bo'ladi), cheklash (vaqt, quvvat, xotira) va interfeys (ro'yxatga olish, HAL, Arduino kutubxonasi).

Zaif taklif / Kuchli taklif

ZAF: "STM32 bilan PWM ishlab chiqaring." (Natija: qaysi taymer, qaysi chastota, qaysi pin noaniq; umumiy, ehtimol noto‘g‘ri registr nomidagi kod.) KUCHLI: "STM32F103 (72 MGts tizim soati) uchun TIM3 CH1 (PA6) da 20 kHz, 0-100% sozlanishi vazifa PWM ishlab chiqaring). Registr darajasida yozing (HALCA2 va kHz emas Prescaler va - KHz). Izoh satrida hisobni ko'rsating - 0-100 oralig'idagi funktsiya parametrini o'rnating - Agar soat taxminingiz noto'g'ri bo'lsa, qiymatlar o'zgarishiga e'tibor bering."

Farqi shundaki, kuchli taklif modelni hisoblashni ko'rsatishga va soat taxminini ochishga majbur qiladi. Shunday qilib, siz prescaler/ARR qiymatlarini mustaqil ravishda tekshirishingiz mumkin:

20 kHz PWM (72 MGts soat) uchun: Taymer_soat = 72 MGsAgar biz oldindan o'lchovchini xohlasak = 72-1 → hisoblagich soat = 1 MGtsARR = (1 MGts / 20 kHz) - 1 = 50 - 1 = 49 Tekshiruv: 1e6 / (49+1) = 20

AI kodini tekshirish: nimani izlash kerak?

Yaratilgan kod kompilyatsiya qilinganligi uning to'g'ri ishlashini anglatmaydi. Ushbu nazorat ro'yxatiga rioya qiling:

nazorat maydoni

Nimani izlash kerak

Ro'yxatdan o'tish/bit sozlamalari

Ma'lumotlar jadvali, to'g'ri bit niqobi bilan to'liq mos keladi

Uzilish (ISR)

Qisqami? Bloklashda kechikish yo'qmi? Uchuvchi ishlatiladimi?

bufer/massiv

Chegarada nazorat bormi? To'lib ketish xavfi bormi?

vaqt

Kechikish yoki taymer bilanmi? Haqiqiy vaqt cheklovi bajarildimi?

Turi va kengligi

8/16/32-bit toshib ketish, imzolangan/imzosiz chalkashlik

kuch / qo'riqchi

Cheksiz pastadir oziqlantiruvchi qo'riqchi?

Xizmatni uzish tartiblari (ISR) xatolarning eng keng tarqalgan manbai hisoblanadi. AI ba'zan ISR ichiga delay() yoki uzun tsiklni qo'yadi. Bu boshqa uzilishlarning o'tkazib yuborilishiga va kuzatuvchining qayta o'rnatilishiga olib keladi. Qoida: ISR imkon qadar qisqa bo'lishi kerak; Asosiy ish bayroqni o'rnatish va uni asosiy tsiklga o'tkazish bo'lishi kerak.

// ZAFIZ (AI ba'zan buni ishlab chiqaradi): ISRda blokirovka qiluvchi funksiya bekor TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // uzoq vaqt talab qilishi mumkin - BAD CASE_Delay(10); // ISR da kechikish - JUDA YOMON }}// KUCHLI: ISR qisqa; ish asosiy loopvolatile ga o'tadi uint8_t tick_flag = 0; // uchuvchi CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; belgi_bayrog'i = 1; //faqat bayroqni o'rnating }}// asosiy tsiklda:if (tick_flag) { tick_flag = 0; read_sensor(); }

Diqqat: uzilish va asosiy tsikl o'rtasida taqsimlangan har qanday o'zgaruvchi o'zgaruvchan bo'lishi kerak. Aks holda, kompilyator registrdagi o'zgaruvchini keshlashi va yangilanishni o'tkazib yuborishi mumkin. AI ko'pincha bu kalit so'zni unutadi; Kodni o'qiyotganda uni maxsus qidiring.

Buferni to'ldirish va tur xatolari

AI ketma-ket portdan ma'lumotlarni chegaralarni tekshirmasdan qat'iy o'lchamli massivga nusxalashi mumkin. O'rnatilgan tizimda bu qo'shni xotirani va tushunarsiz buzilishlarni maydalashni anglatadi. Har bir strcpy, massiv indeksi va DMA buferida chegara tekshirilganligiga ishonch hosil qiling. Xuddi shunday, 8 bitli hisoblagich 255 dan keyin qayta tiklanadi; AI buni e'tiborsiz qoldirishi va to'lib-toshgan hisobga tayanishi mumkin.

Uskunada tekshirish: "Ishlash" o'lchanadi, taxmin qilinmaydi

O'rnatilgan tizimda eng ishonchli dalil kompilyator emas, balki hisoblagichdir. Yaratilgan kodni uchta usulda tasdiqlang:

  1. Osiloskop/mantiqiy analizator: PWM chastotasini, signal vaqtini va aloqa to'lqin shaklini o'lchash. Agar siz 20 kHz ni xohlasangiz, ekranda 20 kHz ga qarang.
  2. Seriya port (UART) jurnali: o'zgaruvchan qiymatlarni, holat o'tishlarini va xato hisoblagichlarini chop eting va kutilgan xatti-harakatlar bilan solishtiring.
  3. Bog'langan va stress testi: Tizim eng yuqori yuk, eng tez ma'lumotlar va eng yomon vaqtga to'g'ri kelishini tekshiring.

Agar o'lchangan qiymat hisoblash bilan mos kelmasa, soat taxmini, oldindan o'lchov qiymati yoki registr sozlamalari noto'g'ri; ta'qib qilish.

Mini sumka

Talabalar jamoasi AI HC-SR04 ultratovush sensori bilan masofani o'lchash kodini chop etadi. Kod kompilyatsiya qiladi, lekin masofa har doim kulgili qiymatlarni beradi. Ular uni osiloskopga ulaganlarida, ular aks-sado oyog'i o'z vaqtini mikrosekundlar o'rniga millisekundlarda hisoblashini ko'radilar; AI micros() o'rniga millis() dan foydalangan. Bu bir so'zdan iborat xatolik butun o'lchovni 1000 marta chalkashtirib yubordi. Ular ketma-ket jurnalga xom aks-sado vaqtini chop etganda va uni haqiqiy o'lchagich bilan solishtirganda, ular xatoni topib, tuzatadilar. Dars: tuzilgan kod to'g'ri emas; Uskunada o'lchash xatoni darhol aniqlaydi.

Umumiy xatolar

  • Registr nomlari va bit maskalarini ma'lumotlar varag'i bilan solishtirmasdan qabul qilish.
  • ISR ichida blokirovka kechikishi yoki uzoq vaqt ishlov berishga ruxsat berish.
  • Umumiy o'zgaruvchilarda o'zgaruvchanlikni unutish.
  • Bufer va massiv chegaralarini tekshirishni chetlab o'tish; toshib ketishini ko'rmaslik.
  • Ularni tekshirmasdan soat chastotasi va vaqt taxminlariga tayanish.
  • Kodni osiloskop/seriyali jurnal bilan o'lchamasdan "ishlash" ni hisobga olgan holda.

Xulosa

  • O'rnatilgan vazifani apparat, funksiya, cheklovlar va interfeys nuqtai nazaridan aniq belgilang.
  • AI oldindan skaner/ARR kabi vaqt qiymatlarini hisoblab chiqsin va ularni mustaqil ravishda tekshiring.
  • ISR'larni qisqa tuting, umumiy o'zgaruvchilarda o'zgaruvchanlikdan foydalaning.
  • Xususan, registr, bufer chegarasi va tur kengligi xatolarini qidiring.
  • "Ishlaydi" kompilyator bilan emas, balki osiloskop, mantiqiy analizator va ketma-ket jurnal bilan isbotlangan.
  • Agar o'lchangan qiymat hisoblash bilan mos kelmasa, taxminlarni ta'qib qiling.

Ilova vazifasi

Sizda (Arduino, STM32, ESP32) mikrokontroller yordamida AIdan PWM yoki ma'lum bir chastotada davriy topshiriqni so'rang. Kodni yuklashdan oldin: (1) sharh satrida hisobdan mustaqil ravishda chastota/vaqt qiymatlarini tekshiring, (2) ISR va umumiy o'zgaruvchilarda o'zgaruvchanlik va blokirovkalarni tekshiring. Yuklagandan so'ng, haqiqiy chastotani osiloskop yoki mantiqiy analizator bilan o'lchang va uni maqsad bilan solishtiring. Agar og'ish bo'lsa, manbani toping va uni to'g'rilang va nima noto'g'ri deb hisoblanganiga e'tibor bering.