[C++] C ++ المضمنة: لاستخدام ستل أم لا؟


Answers

أعمل في الوقت الحقيقي أنظمة جزءا لا يتجزأ من كل يوم. وبطبيعة الحال، قد يكون تعريفي للنظام جزءا لا يتجزأ من الخاص بك. ولكننا نستفيد استفادة كاملة من المحكمة الخاصة بلبنان والاستثناءات ولا نواجه أي مشاكل لا يمكن السيطرة عليها. نحن أيضا الاستفادة من الذاكرة الديناميكية (بمعدل مرتفع جدا؛ تخصيص الكثير من الحزم في الثانية، وما إلى ذلك) ولم تحتاج بعد إلى اللجوء إلى أي مخصص مخصص أو برك الذاكرة. لقد استخدمنا حتى C ++ في معالجات المقاطعة. نحن لا نستخدم دفعة، ولكن فقط لأن وكالة حكومية معينة لن تسمح لنا.

فمن تجربتنا يمكنك استخدام العديد من الميزات الحديثة C ++ في بيئة مدمجة طالما كنت تستخدم رأسك وإجراء المعايير الخاصة بك. أنا أوصي لك الاستفادة من سكوت ماير ل إفكتيف C ++ 3rd طبعة وكذلك سوتر و الكسندريسكو C ++ الترميز المعايير لمساعدتك في استخدام C ++ مع أسلوب البرمجة عاقل.

تحرير: بعد الحصول على أوبفوت على هذا بعد 2 سنوات، اسمحوا لي أن آخر تحديث. نحن أبعد بكثير على طول في التنمية لدينا، ونحن أخيرا ضرب البقع في التعليمات البرمجية لدينا حيث حاويات المكتبة القياسية بطيئة جدا في ظل ظروف الأداء العالي. نحن هنا في الواقع اللجوء إلى خوارزميات مخصصة، وحمامات الذاكرة، وحاويات مبسطة. هذا هو جمال C ++ على الرغم من ذلك، يمكنك استخدام المكتبة القياسية والحصول على كل الأشياء الجيدة التي توفر 90٪ من حالات الاستخدام الخاص بك. أنت لا رمي كل شيء بها عند مواجهة المشاكل، يمكنك فقط اليد الأمثل البقع المتاعب.

Question

لقد كنت دائما مهندس البرمجيات جزءا لا يتجزأ، ولكن عادة في طبقة 3 أو 2 من كومة أوسي. أنا لست حقا جهاز الأجهزة. لقد فعلت دائما دائما منتجات الاتصالات، وعادة اليد / خلية الهواتف، وهو ما يعني عموما شيئا مثل معالج أرم 7.

الآن أجد نفسي في عالم أكثر عمومية جزءا لا يتجزأ، في بداية صغيرة، حيث يمكن أن تتحرك إلى "ليست قوية جدا" المعالجات (هناك بت ذاتية) - لا أستطيع التنبؤ بما.

لقد قرأت قليلا عن النقاش حول استخدام المحكمة الخاصة بلبنان في C ++ في أنظمة مدمجة وليس هناك جواب واضح واضح. هناك بعض المخاوف الصغيرة حول قابلية، وعدد قليل عن حجم رمز أو وقت التشغيل، ولكن لدي اثنين من المخاوف الرئيسية:
1 - التعامل مع الاستثناءات؛ ما زلت غير متأكد ما إذا كان سيتم استخدامه (انظر C ++ المضمنة: لاستخدام استثناءات أم لا؟ )
2 - أنا لا يكرهون بشدة تخصيص الذاكرة الديناميكية في الأنظمة المدمجة، بسبب المشاكل التي يمكن أن تقدم. لدي عموما تجمع العازلة التي يتم تخصيصها بشكل ثابت في وقت تجميع والذي يخدم فقط المخازن المؤقتة حجم ثابت (إذا لم المخازن المؤقتة، إعادة تعيين النظام). وبطبيعة الحال، فإن المحكمة الخاصة بلبنان تفعل الكثير من التخصيص الديناميكي.

الآن يجب أن أتخذ القرار بشأن استخدام أو التخلي عن المحكمة الخاصة بلبنان - بالنسبة للشركة بأكملها، إلى الأبد (انها تسير في بعض الأساسية جدا ث / ث).

ما هي الطريقة التي أقفز؟ فائقة آمنة وتفقد الكثير مما يشكل C ++ (إيمو، انها أكثر من مجرد تعريف اللغة) وربما تواجه مشاكل في وقت لاحق أو لديك لإضافة الكثير من التعامل مع استثناء وربما بعض التعليمات البرمجية الأخرى الآن؟

أنا أميل إلى الذهاب فقط مع دفعة ، ولكن 1) لست متأكدا ما إذا كان سيتم ميناء إلى كل معالج جزءا لا يتجزأ من قد ترغب في استخدام و 2) على موقعه على الانترنت، ويقولون انهم لا يضمنون / يوصي أجزاء معينة منه (خاصة فسم، التي تبدو غريبة). إذا ذهبت إلى دفعة ونجد مشكلة في وقت لاحق ....




كتب إليكترونيك أرتس أطروحة مطولة حول السبب في أن المحكمة الخاصة بلبنان كانت غير ملائمة لتطوير وحدة التحكم المدمجة ولماذا كان عليهم أن يكتبوا بأنفسهم. انها مقالة مفصلة، ​​ولكن أهم الأسباب كانت:

  1. مخص صات المحكمة الخاصة بلبنان بطيئة، متضخمة، وغير فعالة
  2. المجمعين ليست في الواقع جيدة جدا في تضمين كل تلك المكالمات وظيفة عميقة
  3. لا تدعم مخصصات المحكمة الخاصة بلبنان المحاذاة الصريحة
  4. خوارزميات المحكمة الخاصة بلبنان التي تأتي مع دول مجلس التعاون الخليجي و ستف المحكمة الخاصة بلبنان ليست مؤدية جدا، لأنهم جدا منصة الملحد، وبالتالي تفوت الكثير من ميكروبمتيميزاتيونس التي يمكن أن تحدث فرقا كبيرا.

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

أما بالنسبة للاستثناءات: فهي بطيئة على لوحات المفاتيح، وكل من يقول لك خلاف ذلك لم يحاول توقيت لهم. ببساطة تجميع معهم تمكين سوف تبطئ البرنامج بأكمله بسبب برولوغ / إبيلوغ رمز اللازمة - قياس ذلك بنفسك إذا كنت لا تصدقني. انها أسوأ من ذلك في وحدات المعالجة المركزية في النظام مما هو عليه على x86. لهذا السبب، فإن مترجم نستخدمه لا حتى دعم C ++ استثناءات.

مكاسب الأداء ليست كثيرا من تجنب تكلفة رمي الاستثناء - انها من تعطيل استثناءات تماما.




المشكلة الأكبر مع المحكمة الخاصة بلبنان في الأنظمة المدمجة هي قضية تخصيص الذاكرة (التي، كما قلت، يسبب الكثير من المشاكل).

كنت بحثا بجدية خلق إدارة الذاكرة الخاصة بك، التي بنيت من خلال تجاوز مشغلي جديدة / حذف. أنا متأكد من أنه مع قليل من الوقت، ويمكن القيام به، وأنه من المؤكد تقريبا يستحق كل هذا العناء.

أما بالنسبة لقضية الاستثناءات، فلن أذهب إلى هناك. الاستثناءات هي تباطؤ خطير في التعليمات البرمجية الخاصة بك، لأنها تسبب كل كتلة واحدة ( { } ) الحصول على التعليمات البرمجية قبل وبعد، مما يسمح للقبض على استثناء وتدمير أي كائنات الواردة في. ليس لدي بيانات دقيقة عن هذا الأمر، ولكن في كل مرة رأيت فيها هذه المسألة، رأيت أدلة دامغة على التباطؤ الهائل الناجم عن استخدام الاستثناءات.

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

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

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




بالإضافة إلى كل التعليقات، أود أن أقترح عليك قراءة التقرير الفني عن C ++ الأداء الذي يتناول على وجه التحديد الموضوعات التي كنت مهتما في: استخدام C ++ في جزءا لا يتجزأ (بما في ذلك أنظمة الوقت الحقيقي الثابت). وكيفية التعامل مع الاستثناءات التي تنفذ عادة وما هي النفقات العامة؛ وتخصيص مخزن مجانا النفقات العامة.

التقرير جيد حقا كما هو ديبونكس العديد من ذيول شعبية حول C ++ الأداء.




  1. لإدارة الذاكرة، يمكنك تنفيذ التخصيص الخاص بك، والتي تطلب الذاكرة من تجمع. وجميع حاويات المحكمة الخاصة بلبنان لديها قالب للمخصص.

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

  3. لذلك، أعتقد أنك يمكن استخدام ستل في النظام جزءا لا يتجزأ :)




Links