واحد 3 / 9

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

سود:

  • امکان تولید کد تعبیه شده رجیستر و زمینه سخت افزاری برای آردوینو/STM32/ESP32 با هوش مصنوعی
  • توانایی تشخیص و تصحیح الگوهای تعبیه شده مانند وقفه ها، تایمرها و حلقه های غیر مسدود کننده در خروجی هوش مصنوعی
  • امکان بررسی کد تولید شده از نظر حافظه، بلادرنگ و امنیت قبل از آپلود روی سخت افزار

در مکاترونیک، میکروکنترلر جایی است که ایده ها با دنیای فیزیکی برخورد می کنند. کارت هایی مانند آردوینو، STM32، ESP32؛ حسگرها را می‌خواند، محرک‌ها را هدایت می‌کند، ارتباط برقرار می‌کند و همه اینها را تحت حافظه محدود، قدرت پردازش محدود و الزامات زمان‌بندی دقیق انجام می‌دهد. هوش مصنوعی در این زمینه بسیار مفید است: می‌تواند تنظیمات ثبت را بر اساس برگه اطلاعات حسگر استخراج کند، یک پروتکل ارتباطی را کدنویسی کند، یک وقفه تایمر تنظیم کند. اما سیستم‌های تعبیه‌شده یکی از حوزه‌هایی هستند که هوش مصنوعی بیشترین "کاذب‌های متقاعدکننده" را تولید می‌کند. زیرا آدرس‌های ثبت، ماسک‌های بیت و رفتار زمان‌بندی مخصوص برد هستند و یک خطای بیت کل رفتار را مختل می‌کند. در این بخش، نحوه ایجاد کد جاسازی شده با هوش مصنوعی و نحوه بررسی آن را قبل از بارگذاری در سخت افزار توضیح می دهیم.

تفاوت کدهای جاسازی شده با نرم افزار خالص

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

اندازه

دسکتاپ

سیستم تعبیه شده

حافظه

سطح گیگابایت

سطح KB (به عنوان مثال 2 کیلوبایت RAM)

زمان بندی

به طور کلی انعطاف پذیر است

فشرده، زمان واقعی

اشکال زدایی

آسان (اشکال‌زدا، لاگ)

سخت (JTAG، سریال، LED)

نتیجه خطا

برنامه از کار می افتد

محرک/سخت افزار ممکن است آسیب دیده باشد

دسترسی به منابع

چکیده های سیستم عامل

دسترسی مستقیم به ثبت نام

این تفاوت‌ها معیارهای شما را برای ارزیابی خروجی هوش مصنوعی تعیین می‌کنند: میزان استفاده از حافظه، زمان واقعی (بدون مسدود کردن)، و دقت ثبت سخت‌افزار همیشه در بالای فهرست چک شما قرار دارند.

مسدود کننده در مقابل کد غیر مسدود کننده

رایج ترین اشتباهی که مبتدیان مرتکب می شوند (و اغلب توسط هوش مصنوعی مرتکب می شوند) استفاده از delay() است. تاخیر (1000) پردازنده را برای 1 ثانیه قفل می کند. در این مدت، هیچ سنسور دیگری قابل خواندن نیست، هیچ دکمه ای قابل کنترل نیست. این در مکاترونیک غیرقابل قبول است. در عوض، یک الگوی غیر مسدود کننده مبتنی بر millis () استفاده می شود.

// بد: مسدود کننده -- پردازنده نمی تواند کار دیگری را برای 1 ثانیه void loop() انجام دهد { digitalWrite(LED, HIGH); تاخیر (1000); // همه چیز متوقف می شود DigitalWrite (LED، LOW)؛ تاخیر (1000); // یک دکمه اضطراری در حال حاضر قابل خواندن نیست!}// GOOD: non-blocking -- حلقه مسدود نیست، سایر وظایف اجرا می شوند if (nowMs - previousMs >= interval) { previousMs = nowMs; ledStatus = !ledStatus; digitalWrite (LED، ledStatus)؛ } buttonCheck(); // می تواند در هر چرخه ای اجرا شود sensorRead(); //می تواند در هر حلقه اجرا شود}

الگوی غیر انسدادی اساس مکاترونیک تعبیه شده است: حلقه کنترل به طور مداوم جریان دارد، هیچ کار دیگری را قفل نمی کند. گفتن به هوش مصنوعی هنگام نوشتن کد به طور مستقیم کیفیت خروجی را بهبود می بخشد "از تاخیر استفاده نکنید، بدون مسدود کردن مبتنی بر میلیس بنویسید".

نکته: به دنبال تاخیر (در کد تعبیه شده از هوش مصنوعی باشید. اگر تاخیری در حلقه کنترل اصلی مشاهده کردید، اغلب آن کد برای یک سیستم بلادرنگ مناسب نیست و باید بازنویسی شود.

وقفه ها و تایمرها

ما رویدادهای مهم زمان (نبض رمزگذار، دکمه، نمونه برداری دوره ای) را به جای انتظار در حلقه اصلی با وقفه می گیریم. روال وقفه (ISR) باید کوتاه و با دقت نوشته شود: بدون تاخیر، Serial.print یا محاسبات طولانی در آن. متغیرهای به اشتراک گذاشته شده فرار مشخص می شوند.

رمزگذار طولانی فرار Counter = 0; // ISR و حلقه مشترک هستند -> شرط فرار void enkoderISR() { // ISR کوتاه: فقط حساب کنید، کار دیگری انجام ندهید if (digitalRead(ENC_B)) enkoderCounter++; else encoderCounter--;}void setup() { pinMode(ENC_A, INPUT_PULLUP); pinMode (ENC_B، INPUT_PULLUP)؛ attachInterrupt(digitalPinToInterrupt(ENC_A), enkoderISR, RISING);}void loop() { long counter; noInterrupts(); //وقفه های کوتاه برای شمارنده خواندن اتمی = encoderCounter; interrupts(); //تراکنش ایمن با پیشخوان...}

سه نقطه مهم در این مثال مواردی است که AI اغلب از آن غافل می شود: (1) شمارشگر رمزگذار مشترک باید "فرار" باشد یا بهینه سازی کامپایلر به روز رسانی ها را از دست می دهد. (2) ISR باید کوتاه باشد. (3) هنگام خواندن یک متغیر چند بایتی در حلقه اصلی، وقفه های خواندن اتمی باید برای مدت کوتاهی بسته شوند، در غیر این صورت ممکن است ISR در طول خواندن دخالت کند و مقدار نصف/فاسد ممکن است خوانده شود (شرایط مسابقه). حتما بررسی کنید که آیا این سه مورد در کد هوش مصنوعی وجود دارد یا خیر.

ثبت دقت و برگه اطلاعات

هوش مصنوعی می‌تواند آدرس ثبت یک حسگر یا بیت پیکربندی یک MCU را به‌طور قابل‌اعتباری نادرست نشان دهد. برای مثال، رجیستر مدیریت توان یک IMU MPU6050 0x6B است. اگر هوش مصنوعی این را به عنوان 0x6A بدهد، کد کامپایل شده است، به نظر می رسد کار می کند، اما سنسور بیدار نمی شود. چنین خطاهایی تنها زمانی شناسایی می شوند که با دیتاشیت مقایسه شوند.

// MPU6050 wake up: طبق داده برگه PWR_MGMT_1 = 0x6B، مقدار 0x00#define MPU_ADDR 0x68#define PWR_MGMT_1 0x6B // <-- VERIFY from datasheetWire.beginTransmission(MPU_ADDR);Wire.write(PWR_MGMT_1);Wire.write(0x00); // wake up from sleep modeWire.endTransmission(true);

توجه: هر آدرس رجیستر، بیت ماسک و آدرس I2C/SPI داده شده توسط هوش مصنوعی را از دیتاشیت بررسی کنید. این مقادیر مختص کارت و تراشه هستند. مقداری که هوش مصنوعی «به خاطر می‌آورد» ممکن است از یک ویرایش تراشه دیگر باشد. ثبت نادرست بی سر و صدا منجر به رفتار نادرست می شود.

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

ضعیف:"خواندن حسگر دما در ESP32."(کدام سنسور؟ کدام پروتکل؟ کدام پین؟ عمومی، احتمالاً کد اشتباه است.)STRONG:"سنسور دمای DS18B20 را روی ESP32 (فریم ورک آردوینو) از GPIO4 با OneWire بخوانید. بدون مسدود کردن بنویسید، هر 1 ثانیه نمونه برداری کنید (با استفاده از تاخیر مقدار error، مقدار error read، millis- ex). -127 یا 85. لطفاً هر یک از کتابخانه ها و اتصالات پین را که در نظر اول استفاده می کنید، مشخص کنید.

اعلان قدرتمند؛ این به تراشه، چارچوب، حسگر، پروتکل، پین، الگوی نمونه‌برداری، وضعیت خطا و محدودیت حافظه می‌دهد. به این ترتیب خروجی هم قابل تایید و هم واقعی است.

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

قبل از بارگذاری خروجی هوش مصنوعی، آن را از این لیست عبور دهید:

  1. مسدود کردن: آیا در حلقه اصلی تاخیر یا انسداد طولانی وجود دارد؟
  2. فرار: آیا متغیرهای مشترک با ISR فرار هستند؟
  3. دسترسی اتمی: آیا خواندن متغیر مشترک چند بایتی امن است؟
  4. ثبت نام: آیا آدرس ها و ماسک های بیت با دیتاشیت سازگار هستند؟
  5. حافظه: رشته، آرایه های بزرگ، آیا بازگشت سرریز سطح KB ایجاد می کند؟
  6. مدیریت خطا: آیا خطاهای خواندن حسگر، وقفه های ارتباطی کنترل می شود؟
  7. شروع ایمن: آیا خروجی های محرک در هنگام راه اندازی در حالت ایمن (غیرفعال) قرار می گیرند؟

کیف کوچک

مهندس سیستم های جاسازی شده باران، هوش مصنوعی را به نوشتن کدی که IMU را برای پهپاد می خواند، می دهد. کد کامپایل می شود و به نظر می رسد که کار می کند، اما مقادیر زاویه بی معنی هستند. باران چک لیست را اعمال می کند: آدرس های رجیستر را با دیتاشیت مقایسه می کند و متوجه می شود که AI به اشتباه رجیستر پیکربندی ژیروسکوپ (0x1A به جای 0x1B) را خروجی می دهد، بنابراین مقیاس حساسیت اشتباه است. پس از اصلاح، مقادیر ثابت می شوند. سپس delay(10) در حلقه اصلی اعلان می کند. تبدیل آن به یک ساختار مبتنی بر میلیس، زیرا مسدود کردن حلقه کنترل پرواز غیرقابل قبول است. در نهایت می بیند که متغیر مشترک شمارنده فرار نیست و آن را اضافه می کند. هوش مصنوعی سریع به اسکلت داد. اما لیست بررسی سه خطای جداگانه را گرفت: ثبت، مسدود کردن و فرار، و سخت افزار به هیچ وجه در معرض خطر نبود.

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

  • از بین بردن پاسخ بلادرنگ با استفاده از delay() در حلقه کنترل اصلی.
  • از بی ثبات کردن متغیر مشترک با ISR و تجربه خرابی داده های بی صدا خودداری کنید.
  • خواندن یک متغیر مشترک چند بایتی به صورت غیر اتمی و ایجاد شرایط مسابقه.
  • تایید نکردن ماسک های ثبت/بیت ارائه شده توسط هوش مصنوعی با دیتاشیت.
  • ایجاد سرریز حافظه با استفاده از رشته ها و آرایه های بزرگ در RAM محدود.
  • فراموش کردن ایمن سازی اولیه خروجی های محرک.

به طور خلاصه

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

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

یک سنسور (مانند DS18B20، MPU6050 یا HC-SR04) و یک میکروکنترلر (Arduino/ESP32/STM32) انتخاب کنید. از هوش مصنوعی بخواهید یک کد خواندنی غیرمسدود با الگوی اعلان قدرتمند در این واحد ایجاد کند. سپس هفت مورد از چک لیست بازبینی را یکی یکی دنبال کنید: حداقل یک مقدار ثبت/پین را با دیتاشیت مقایسه کنید، تاخیرهای حلقه را بررسی کنید، وضعیت فرار متغیرهای مشترک را بررسی کنید. در اولین تلاش چند مورد "گذرانده شد" و چند مورد نیاز به اصلاح داشت؟ هر مشکلی را که پیدا کردید و رفع آن را یادداشت کنید.