وحدة 3 / 9

الأنظمة المدمجة وتوليد كود المتحكم الدقيق

المكاسب:

  • القدرة على إنشاء كود مضمن مع السجل وسياق الأجهزة لـ Arduino/STM32/ESP32 مع الذكاء الاصطناعي
  • القدرة على التعرف على الأنماط المضمنة وتصحيحها مثل المقاطعات والمؤقتات والحلقات غير المحظورة في مخرجات الذكاء الاصطناعي
  • القدرة على مراجعة الكود الذي تم إنشاؤه من حيث الذاكرة والوقت الحقيقي والأمان قبل تحميله على الجهاز

في الميكاترونكس، المتحكم الدقيق هو المكان الذي تلتقي فيه الأفكار بالعالم المادي. بطاقات مثل Arduino وSTM32 وESP32؛ فهو يقرأ أجهزة الاستشعار، ويشغل المحركات، ويتواصل، ويفعل كل هذا في ظل ذاكرة محدودة، وقدرة معالجة محدودة، ومتطلبات توقيت صارمة. يعد الذكاء الاصطناعي مفيدًا جدًا في هذا المجال: حيث يمكنه استخراج إعدادات التسجيل بناءً على ورقة بيانات المستشعر، وترميز بروتوكول الاتصال، وتعيين مقاطعة مؤقت. لكن الأنظمة المدمجة هي واحدة من المجالات التي ينتج فيها الذكاء الاصطناعي "الأكاذيب الأكثر إقناعا". لأن عناوين التسجيل وأقنعة البت وسلوك التوقيت خاصة باللوحة وخطأ بت واحد يعطل السلوك بأكمله. في هذه الوحدة، نغطي كيفية إنشاء التعليمات البرمجية المضمنة باستخدام الذكاء الاصطناعي وكيفية مراجعتها قبل تحميلها على الأجهزة.

اختلاف الكود المضمن عن البرامج النقية

يحتوي برنامج سطح المكتب على الكثير من الذاكرة ونظام التشغيل وسهولة تصحيح الأخطاء. يفتقر الكود المضمن إلى معظم ما يلي:

الحجم

سطح المكتب

نظام مضمن

الذاكرة

مستوى جيجابايت

مستوى كيلو بايت (على سبيل المثال، 2 كيلو بايت من ذاكرة الوصول العشوائي)

توقيت

مرنة بشكل عام

ضيق، في الوقت الحقيقي

تصحيح الأخطاء

سهل (مصحح الأخطاء، سجل)

الصلب (JTAG، المسلسل، LED)

نتيجة خطأ

يتعطل البرنامج

قد يتعرض المحرك/الجهاز للتلف

الوصول إلى الموارد

ملخصات نظام التشغيل

الوصول المباشر إلى السجل

تحدد هذه الاختلافات معاييرك لتقييم مخرجات الذكاء الاصطناعي: استخدام الذاكرة، والوقت الفعلي (غير المحظور)، ودقة تسجيل الأجهزة تكون دائمًا في أعلى قائمة التحقق الخاصة بك.

حظر مقابل رمز عدم الحظر

الخطأ الأكثر شيوعًا الذي يرتكبه المبتدئون (والذي يرتكبه الذكاء الاصطناعي كثيرًا) هو استخدام التأخير (). تأخير (1000) يقفل المعالج لمدة ثانية واحدة؛ خلال هذه الفترة، لا يمكن قراءة أي أجهزة استشعار أخرى، ولا يمكن التحكم في أي أزرار. وهذا أمر غير مقبول في الميكاترونكس. بدلاً من ذلك، يتم استخدام نمط غير محظور يعتمد على millis().

// BAD: blocker - لا يمكن للمعالج القيام بأي عمل آخر لمدة ثانية واحدة void Loop() { digitalWrite(LED, HIGH); تأخير (1000)؛ // كل شيء يتوقف عن الكتابة الرقمية (LED، LOW)؛ تأخير (1000)؛ // لا يمكن قراءة زر الطوارئ في هذا الوقت!}// جيد: غير محظور - الحلقة غير محظورة، ويتم تشغيل المهام الأخرى if (nowMs - PreviousMs >= Interval) { PreviousMs = nowMs; ledStatus = !ledStatus; الكتابة الرقمية (LED، حالة LED)؛ } ButtonCheck(); // يمكن تشغيله في كل دورة SensorRead(); // يمكن تشغيله في أي حلقة }

إن نمط عدم الحظر هو أساس الميكاترونكس المضمنة: تتدفق حلقة التحكم بشكل مستمر، ولا توجد مهمة تحجب مهمة أخرى. إن إخبار الذكاء الاصطناعي بـ "عدم استخدام التأخير، والكتابة غير المحظورة على أساس الميلي" عند كتابة التعليمات البرمجية يؤدي بشكل مباشر إلى تحسين جودة الإخراج.

نصيحة: ابحث عن التأخير( في التعليمات البرمجية المضمنة من الذكاء الاصطناعي. إذا رأيت تأخيرًا في حلقة التحكم الرئيسية، فغالبًا ما يكون هذا الرمز غير مناسب لنظام الوقت الفعلي ويجب إعادة كتابته.

المقاطعات والموقتات

نحن نلتقط الأحداث الحرجة للوقت (نبض جهاز التشفير، الزر، أخذ العينات الدورية) مع المقاطعات بدلاً من الانتظار في الحلقة الرئيسية. يجب كتابة روتين المقاطعة (ISR) قصيرًا وبعناية: لا يوجد أي تأخير أو طباعة تسلسلية أو حسابات طويلة فيه؛ يتم وضع علامة على المتغيرات المشتركة بأنها متقلبة.

التشفير الطويل المتقلب = 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(); // المقاطعات القصيرة للقراءة الذرية counter = encoderCounter; المقاطعات ()؛ // تعامل بأمان مع العداد...}

ثلاث نقاط حاسمة في هذا المثال هي النقاط التي يفتقدها الذكاء الاصطناعي غالبًا: (1) يجب أن يكون عداد التشفير المشترك "متقلبًا" وإلا فإن تحسين المترجم سيفقد التحديثات؛ (2) يجب أن يكون ISR قصيرًا؛ (3) عند قراءة متغير متعدد البايتات في الحلقة الرئيسية، يجب إغلاق مقاطعات القراءة الذرية لفترة قصيرة، وإلا فقد يتدخل ISR أثناء القراءة وقد تتم قراءة القيمة النصف/الفاسدة (حالة السباق). تأكد من التحقق من وجود هؤلاء الثلاثة في كود الذكاء الاصطناعي.

تسجيل الدقة وورقة البيانات

يمكن للذكاء الاصطناعي أن يحرف بشكل موثوق عنوان التسجيل الخاص بالمستشعر أو بت التكوين لوحدة MCU. على سبيل المثال، سجل إدارة الطاقة لـ MPU6050 IMU هو 0x6B؛ إذا أعطى الذكاء الاصطناعي هذا كـ 0x6A، فسيتم تجميع الكود، ويبدو أنه يعمل، لكن المستشعر لا يستيقظ. يتم اكتشاف مثل هذه الأخطاء فقط عند مقارنتها بورقة البيانات.

// تنبيه MPU6050: وفقًا لورقة البيانات 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); // استيقظ من وضع السكونWire.endTransmission(true);

تنبيه: تحقق من كل عنوان تسجيل وقناع بت وعنوان I2C/SPI المقدم بواسطة الذكاء الاصطناعي من ورقة البيانات. هذه القيم خاصة بالبطاقة والرقاقة؛ قد تكون القيمة التي "يتذكرها" الذكاء الاصطناعي من مراجعة أخرى للرقاقة. التسجيل غير الصحيح يؤدي بصمت إلى سلوك غير صحيح.

موجه ضعيف / موجه قوي

ضعيف: "اقرأ مستشعر درجة الحرارة على ESP32." (أي مستشعر؟ أي بروتوكول؟ أي دبوس؟ عام، رمز خاطئ على الأرجح.) قوي: "اقرأ مستشعر درجة الحرارة DS18B20 على ESP32 (إطار عمل Arduino) من GPIO4 باستخدام OneWire. اكتب بدون حظر، وعينة كل ثانية واحدة (باستخدام التأخير، استنادًا إلى الميلي). قم بتعيين علامة خطأ في حالة خطأ القراءة (قيمة ثابتة -127 أو 85). يرجى تحديد كل مكتبة والاتصال الذي تستخدمه في التعليق الأول لأسباب تتعلق بالذاكرة، استخدم char buffer بدلاً من String."

موجه قوي؛ إنه يعطي الشريحة والإطار والمستشعر والبروتوكول والدبوس ونمط أخذ العينات وحالة الخطأ وقيود الذاكرة. بهذه الطريقة يكون الناتج قابلاً للتحقق وواقعيًا.

مراجعة قائمة التحقق للتعليمات البرمجية المضمنة

قبل تحميل مخرجات الذكاء الاصطناعي، مررها عبر هذه القائمة:

  1. الحظر: هل هناك تأخير أو حظر طويل في الحلقة الرئيسية؟
  2. متقلبة: هل المتغيرات المشتركة مع ISR متقلبة؟
  3. الوصول الذري: هل المتغير المشترك متعدد البايت آمن للقراءة؟
  4. التسجيل: هل العناوين وأقنعة البت متوافقة مع ورقة البيانات؟
  5. الذاكرة: سلسلة، صفائف كبيرة، هل العودية تؤدي إلى تجاوز مستوى كيلو بايت؟
  6. معالجة الأخطاء: هل تتم معالجة أخطاء قراءة المستشعر ومهلات الاتصال؟
  7. البداية الآمنة: هل يتم وضع مخرجات المشغل في حالة آمنة (سلبية) عند بدء التشغيل؟

حالة صغيرة

مهندس الأنظمة المدمجة، باران، يطلب من الذكاء الاصطناعي كتابة الكود الذي يقرأ IMU للطائرة بدون طيار. يتم تجميع الكود ويبدو أنه يعمل، لكن قيم الزوايا لا معنى لها. يطبق Baran قائمة التحقق: يقارن عناوين السجل بورقة البيانات ويكتشف أن الذكاء الاصطناعي يخرج سجل تكوين الجيروسكوب بشكل غير صحيح (0x1A بدلاً من 0x1B)، لذا فإن مقياس الحساسية خاطئ. وبمجرد تصحيحها، تستقر القيم. ثم تأخير (10) إشعارات في الحلقة الرئيسية؛ تحويل هذا إلى هيكل قائم على الميلي، لأن منع حلقة التحكم في الطيران أمر غير مقبول. وأخيرًا، رأى أن متغير العداد المشترك ليس متقلبًا وقام بإضافته. أعطى الذكاء الاصطناعي الهيكل العظمي بسرعة؛ لكن قائمة المراجعة اكتشفت ثلاثة أخطاء منفصلة: التسجيل، والحظر، والتقلب، ولم تكن الأجهزة معرضة للخطر على الإطلاق.

الأخطاء الشائعة

  • قتل الاستجابة في الوقت الحقيقي باستخدام التأخير () في حلقة التحكم الرئيسية.
  • تجنب جعل المتغير المشترك مع ISR متقلبًا ومواجهة تلف البيانات الصامت.
  • قراءة متغير مشترك متعدد البايت بشكل غير ذري وإنشاء حالة سباق.
  • عدم التحقق من أقنعة التسجيل/البت المقدمة بواسطة الذكاء الاصطناعي باستخدام ورقة البيانات.
  • إنشاء تجاوز سعة الذاكرة باستخدام السلاسل والمصفوفات الكبيرة في ذاكرة الوصول العشوائي المحدودة.
  • نسيان تأمين مخرجات المحرك في البداية.

باختصار

  • الكود المضمن؛ إنه يعمل بذاكرة محدودة وتوقيت ضيق ووصول مباشر إلى التسجيل.
  • في الحلقة الرئيسية، يتم استخدام نمط غير مانع قائم على الميلي بدلاً من التأخير.
  • يتم الاحتفاظ بـ ISR قصيرًا. يجب أن تكون المتغيرات المشتركة متقلبة ويمكن الوصول إليها ذريًا.
  • يتم دائمًا التحقق من عناوين التسجيل وأقنعة البت مقابل ورقة البيانات؛ يمكن أن يكون الذكاء الاصطناعي مخطئًا.
  • يتم دائمًا التحقق من الذاكرة ومعالجة الأخطاء وحالة بدء التشغيل الآمن.
  • موجه قوي؛ يتضمن الشريحة والإطار وأجهزة الاستشعار والبروتوكول والدبوس والقيود.

مهمة التطبيق

اختر مستشعرًا (مثل DS18B20 أو MPU6050 أو HC-SR04) ووحدة تحكم دقيقة (Arduino/ESP32/STM32). اطلب من الذكاء الاصطناعي إنشاء رمز قراءة غير محظور باستخدام قالب المطالبة القوي في هذه الوحدة. ثم اتبع العناصر السبعة في قائمة مراجعة المراجعة واحدًا تلو الآخر: قارن قيمة تسجيل/دبوس واحدة على الأقل مع ورقة البيانات، وتحقق من تأخيرات الحلقة، وتحقق من الحالة المتقلبة للمتغيرات المشتركة. كم عدد العناصر التي "نجحت" في المحاولة الأولى وكم عدد التصحيحات المطلوبة؟ قم بتدوين كل مشكلة تجدها وحلها.