C++ Academy · درس

القيود في الأنظمة المضمّنة: بلا RTTI أو استثناءات

اعمل ضمن المجموعات الشائعة للأنظمة المضمّنة التي تعطل RTTI والاستثناءات.

الدرس 1 من 414 خطوة

القيود في الأنظمة المضمّنة: بلا RTTI أو استثناءات درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

C++ للأنظمة المضمّنة

تفرض الأنظمة المضمّنة قيودًا مثل محدودية RAM، وعدم وجود MMU، والمواعيد النهائية للوقت الحقيقي. وتزيل مجموعة C++ «freestanding» أجزاء اللغة المكلفة أكثر من اللازم.

لماذا لا نستخدم RTTI؟

تدعم RTTI (معلومات النوع في وقت التشغيل) كلًا من dynamic_cast وtypeid. ويحمل كل صنف متعدد الأشكال مؤشرًا إضافيًا، كما تستهلك جداول RTTI جزءًا من حجم الشيفرة. عطّلها باستخدام -fno-rtti.

لماذا لا نستخدم الاستثناءات؟

تحتاج الاستثناءات إلى جداول فك المكدس ودعم وقت التشغيل، مما يزيد حجم الشيفرة ويؤدي إلى توقيت غير متوقع. تستخدم العديد من قواعد شيفرة الأنظمة المضمّنة -fno-exceptions.

g++ -fno-rtti -fno-exceptions main.cpp

معالجة الأخطاء دون استثناءات

استخدم:

  • رموز الإرجاع (std::expected وstd::optional وتعدادات الأخطاء)
  • معاملات الإخراج للنتائج
  • std::error_code لأخطاء النظام

أنواع النتائج

يمثل std::expected<T, E> في C++23 إما قيمة أو خطأ، مثل Result في Rust. وتستخدم العديد من المشروعات المضمّنة نوع Result مخصصًا.

std::expected<int, ErrorCode> parse(const char* s);

if (auto r = parse("42"); r) use(*r);
else                       log_error(r.error());

تجنب التخصيص الديناميكي

يُعد تجزؤ الكومة قاتلًا لأنظمة الوقت الحقيقي. وغالبًا ما تحظر الشيفرة المضمّنة استخدام new خارج مرحلة بدء التشغيل. استخدم:

  • التخصيص على المكدس
  • المصفوفات الساكنة
  • تجمعات الذاكرة
  • مخصّصات مناسبة للأنظمة المضمّنة

أنماط الذاكرة الساكنة

احجز الذاكرة في وقت الترجمة أو عند بدء التشغيل.

template <typename T, size_t N>
class StaticVector {
    alignas(T) char storage_[sizeof(T) * N];
    size_t size_ = 0;
public:
    void push_back(const T& v);
    // ...
};

تعدد الأشكال في وقت الترجمة

استبدل الدوال الافتراضية بالقوالب أو CRTP متى أمكن، فلا توجد vtable ولا استدعاءات غير مباشرة.

template <typename Derived>
class Base {
public:
    void process() { static_cast<Derived*>(this)->process_impl(); }
};

class Concrete : public Base<Concrete> {
public:
    void process_impl() { /* ... */ }
};

مكتبة C++ القياسية المستقلة

تستبعد مجموعة C++ freestanding معظم عناصر <iostream>، وميزات تعدد الخيوط، والتخصيص الديناميكي. ويحدد المعيار صراحةً ما هو متاح.

etl: Embedded Template Library

توفر Embedded Template Library (ETL) حاويات شبيهة بحاويات STL ذات حجم حتمي ودون تخصيص ديناميكي.

مخاوف حجم الشيفرة

استخدم -Os لتحسين الحجم، و-flto للتحسين في وقت الربط، و-ffunction-sections -fdata-sections -Wl,--gc-sections لإزالة الشيفرة غير المستخدمة.

من الواقع: مركبات المريخ والسيارات

تُستخدم C++ على نطاق واسع في الأنظمة المضمّنة الحرجة للسلامة، مثل السيارات (AUTOSAR) والفضاء (MISRA) والأنظمة الطبية (IEC 62304). وتفرض معايير البرمجة قيودًا إضافية على اللغة.

تحقق سريع

أي خيار للمصرّف يعطّل دعم الاستثناءات في C++ لتقليل حجم الملف الثنائي؟

مراجعة

تعطّل C++ للأنظمة المضمّنة RTTI والاستثناءات لتقليل حجم الشيفرة وتحسين القدرة على التنبؤ. استبدل الكومة بذاكرة ساكنة، واستخدم أنواع النتائج للأخطاء، وCRTP لتعدد الأشكال. وتفرض معايير البرمجة مثل MISRA قيودًا إضافية على اللغة.

البدء مجانًا

تعلم C++ مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «القيود في الأنظمة المضمّنة: بلا RTTI أو استثناءات» مجاني؟

نعم — نص درس «القيود في الأنظمة المضمّنة: بلا RTTI أو استثناءات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «القيود في الأنظمة المضمّنة: بلا RTTI أو استثناءات»؟

اعمل ضمن المجموعات الشائعة للأنظمة المضمّنة التي تعطل RTTI والاستثناءات. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «القيود في الأنظمة المضمّنة: بلا RTTI أو استثناءات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. القيود في الأنظمة المضمّنة: بلا RTTI أو استثناءات
  2. الإدخال والإخراج المعتمدان على خرائط الذاكرة وvolatile
  3. اعتبارات الزمن الحقيقي ووقت الاستجابة
  4. الترجمة المتقاطعة لأهداف ARM
← العودة إلى C++ Academy