واحد 3 / 9

کد سیستم های جاسازی شده و میکروکنترلر

سود:

  • امکان تعریف رجیستر، وقفه و الزامات زمانبندی برای میکروکنترلر با یک اعلان واضح
  • امکان بررسی کد C/Arduino تولید شده توسط هوش مصنوعی از نظر تنظیمات رجیستر، سرریز بافر و محدودیت های زمان واقعی
  • امکان اعمال عادت تایید کد تولید شده با اندازه گیری آن بر روی سخت افزار (اسیلوسکوپ، پورت سریال)

توسعه سیستم جاسازی شده جایی است که نرم‌افزار و سخت‌افزار تلاقی می‌کنند: تنظیم نادرست یک بیت ثبت، نگه داشتن وقفه بیش از حد طولانی، یا سرریز کردن بافر باعث ایجاد خرابی‌های عجیب و غریب در این زمینه می‌شود، حتی اگر کد "کامپایل" و اجرا شود. هوش مصنوعی واقعاً یک شتاب دهنده در این زمینه است. می تواند اسکلت های اولیه، توابع انتزاع سخت افزاری، ماشین های حالت و روال های ارتباطی را تولید کند. اما هوش مصنوعی دیتاشیت کارت شما را نمی‌بیند، فرکانس ساعت شما را نمی‌داند و محدودیت‌های زمان واقعی شما را حس نمی‌کند. در این بخش، نحوه تعریف واضح کار میکروکنترلر برای هوش مصنوعی، نحوه بررسی کد C/Arduino تولید شده و اینکه چرا باید همه چیز را در سخت افزار اندازه گیری کنید، توضیح خواهیم داد.

تعریف نیاز به وضوح: ثبت، برش، زمان بندی

گفتن AI برای "روشن کردن LED" کار نخواهد کرد. کدام کارت، کدام پین، کدام فرکانس ساعت، کدام زمان؟ هنگام اختصاص دادن یک وظیفه تعبیه شده به هوش مصنوعی، از این چارچوب استفاده کنید: سخت افزار (خانواده MCU، ساعت، پین)، عملکرد (چه اتفاقی خواهد افتاد)، محدودیت (زمان، قدرت، حافظه) و رابط (رجیستر، HAL، کتابخانه آردوینو).

اعلان ضعیف / اعلان قوی

ضعیف: "PWM با STM32 تولید کنید." (نتیجه: کدام تایمر، کدام فرکانس، کدام پین نامشخص است؛ کد کلی، احتمالاً اشتباه با نام رجیستر.) قوی: "20 کیلوهرتز، PWM کار قابل تنظیم 0-100٪ روی TIM3 CH1 (PA6) برای STM32F103 (ساعت سیستم 72 مگاهرتز) تولید کنید. در سطح ثبت نام، مقدار ARRH -A2-HHz (not) بنویسید. محاسبه کنید و محاسبه را در خط نظر نشان دهید - وظیفه را با یک پارامتر تابع بین 0-100 تنظیم کنید - توجه داشته باشید که اگر فرض ساعت شما اشتباه باشد.

تفاوت این است که اعلان قدرتمند باعث می شود که مدل محاسبه را نشان دهد و فرض ساعت را آشکار کند. بنابراین می توانید مقادیر prescaler/ARR را به طور مستقل بررسی کنید:

برای PWM 20 کیلوهرتز (کلاک 72 مگاهرتز): تایمر_ساعت = 72 مگاهرتز اگر پیش مقیاس‌کننده = 72-1 بخواهیم ← ساعت شمارنده = 1 مگاهرتز = (1 مگاهرتز / 20 کیلوهرتز) - 1 = 50 - 1 = 49 تأیید: 1e+10 / 0 Hz

حسابرسی کد هوش مصنوعی: به دنبال چه چیزی باشیم؟

فقط به این دلیل که کد تولید شده کامپایل می شود به این معنی نیست که به درستی کار می کند. این چک لیست را دنبال کنید:

منطقه کنترل

چه چیزی را باید جستجو کرد

تنظیمات ثبت/بیت

دقیقاً با دیتاشیت، بیت ماسک صحیح سازگار است

وقفه (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 - VERY BAD }}// STRONG: ISR short; کار به حلقه فرار اصلی حرکت می کند uint8_t tick_flag = 0; // volatile CONDITION void 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. اسیلوسکوپ / تحلیلگر منطقی: فرکانس PWM، زمان بندی سیگنال و شکل موج ارتباطی را اندازه گیری می کند. اگر 20 کیلوهرتز می خواهید، 20 کیلوهرتز را روی صفحه ببینید.
  2. گزارش پورت سریال (UART): مقادیر متغیر، انتقال حالت و شمارنده خطا را چاپ کنید و با رفتار مورد انتظار مقایسه کنید.
  3. تست محدود و تنش: تست کنید که آیا سیستم در بالاترین بار، سریعترین داده و بدترین زمان مقاومت دارد یا خیر.

اگر مقدار اندازه گیری شده با محاسبه مطابقت نداشته باشد، فرض ساعت، مقدار پیش مقیاس کننده یا تنظیم ثبات نادرست است. تعقیب و گریز

کیف کوچک

تیمی از دانش‌آموزان دارای AI کد اندازه‌گیری فاصله را با حسگر اولتراسونیک HC-SR04 چاپ می‌کنند. کد کامپایل می شود اما فاصله همیشه مقادیر مضحکی می دهد. وقتی آن را به اسیلوسکوپ وصل می کنند، می بینند که پایه اکو زمان آن را به جای میکروثانیه در میلی ثانیه محاسبه می کند. هوش مصنوعی از millis() به جای micros() استفاده کرد. این خطای یک کلمه ای کل اندازه گیری را با ضریب 1000 مخدوش کرد. هنگامی که آنها زمان پژواک خام را در فهرست سریال چاپ می کنند و آن را با یک خط کش واقعی مقایسه می کنند، خطا را پیدا کرده و آن را برطرف می کنند. درس: کد کامپایل شده کد صحیحی نیست. اندازه گیری در سخت افزار خطا را بلافاصله آشکار می کند.

اشتباهات رایج

  • پذیرش نام های رجیستر و ماسک های بیت بدون مقایسه آنها با دیتاشیت.
  • اجازه دادن به تاخیر مسدود کردن یا پردازش طولانی در ISR.
  • فراموشی فرار در متغیرهای مشترک
  • دور زدن بافر و مرزهای آرایه بررسی. سرریز را ندیدن
  • تکیه بر فرکانس ساعت و مفروضات زمان بندی بدون تأیید آنها.
  • در نظر گرفتن "کار" کد بدون اندازه گیری آن با اسیلوسکوپ/log سریال.

به طور خلاصه

  • وظیفه تعبیه شده را از نظر سخت افزار، عملکرد، محدودیت ها و رابط به وضوح تعریف کنید.
  • از هوش مصنوعی مقادیر زمان بندی مانند prescaler/ARR را داشته باشید و آنها را به طور مستقل تأیید کنید.
  • ISR ها را کوتاه نگه دارید، در متغیرهای مشترک از فرار استفاده کنید.
  • به طور خاص به دنبال خطاهای ثبت، محدودیت بافر و عرض تایپ باشید.
  • "این کار می کند" با اسیلوسکوپ، تجزیه و تحلیل منطقی و گزارش سریال ثابت می شود، نه با کامپایلر.
  • اگر مقدار اندازه گیری شده با محاسبه مطابقت ندارد، مفروضات را دنبال کنید.

وظیفه کاربردی

با میکروکنترلری که دارید (Arduino، STM32، ESP32)، از هوش مصنوعی PWM یا یک کار دوره ای در فرکانس مشخصی بخواهید. قبل از بارگیری کد: (1) مقادیر فرکانس/زمان بندی را مستقل از حساب در خط نظر بررسی کنید، (2) فرار و مسدود شدن را در ISR و متغیرهای مشترک بررسی کنید. پس از آپلود فرکانس واقعی را با اسیلوسکوپ یا آنالایزر منطقی اندازه گیری کرده و با هدف مقایسه کنید. در صورت وجود انحراف، منبع را بیابید و تصحیح کنید و آنچه را که اشتباه فرض شده است، یادداشت کنید.