سؤال

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

مثال:

stub.h
#ifdef _STUB_HW
#define STUB_HW(name) Stub_##name
#else /*_STUB_HW*/
#define STUB_HW(name) name
#endif /*_STUB_HW*/

my_hw.c
WORD STUB_HW(clear_RX_TX)()
{ /* clear my rx/tx buffer on target HW */ }

test_my_hw.c
#ifdef _STUB_HW
WORD clear_RX_TX()
{ /* simulate clear rx/tx buffer on target HW */ }

مع هذا الرمز يمكنني تشغيل / إيقاف والإستئصال مع المعالج العلامة
_STUB_HW
هل هناك طريقة لacomplish هذا دون الحاجة إلى تغيير شفرة همز بلدي، وتجنب الكثير من ifdefs. وأنا لن مزيج همز ورمز اختبار في نفس الملف ما اذا كان يمكنني تجنب ذلك. لا يهمني كيف يبدو رمز اختبار طويلة كما كنت يمكن أن تبقي أكبر قدر ممكن من رمز الإنتاج.

تحرير:

وسيكون من الرائع إذا كان POSIBLE لتحديد / اعادة تسمية وظائف دون استبدال الملف بأكمله. مثل اتخاذ جميع الوظائف اعتبارا من يوم nRF_## وإعطاء ثم اسم جديد ثم إدخال test_nRF_## إلى nRF_## إذا كان POSIBLE

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

وكما قال جيرهارد، استخدام ملف رأس مشترك "driver.h" وملفات تنفيذ طبقة الأجهزة منفصلة تحتوي الفعلية وفافات الوظائف.

في الكسوف، لدي هدفين وI "استبعاد من بناء" ملف driver.c أن ليس لاستخدامها والتأكد يتم تضمين واحد السليم في الإنشاء. كسوف ثم يولد في makefile في وقت الإنشاء.

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

وأنا أتفق مع ما ورد أعلاه. الحل القياسي لهذا هو لتعريف مجموعة المستخرجة مبهمة من استدعاءات الدوال التي هي "سائق" إلى الأب، ثم نسمي ذلك في البرنامج الرئيسي. ثم تقدم اثنين من تطبيقات سائق مختلفة، واحدة للالأب، واحدة للجنوب غرب. فإن جنوب غرب البديل محاكاة تأثير IO من الأب بطريقة مناسبة.

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

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

وأخيرا، في كثير من الحالات حلا تقنيا الأفضل هو أن يذهب لنظام الهدف محاكاة كاملة، مثل كيمو أو Simics و <لأ href = "http://www.systemc.org" يختلط = "نوفولو noreferrer"> SystemC أو CoWare و <لأ href = "HTTP: // شبكة الاتصالات العالمية. vastsystems.com "يختلط =" نوفولو noreferrer "> العظمى، أو ما شابه ذلك. هذا يتيح لك تشغيل نفس رمز في كل وقت، وبدلا من ذلك يمكنك بناء نموذج من الأجهزة التي تعمل مثل الأجهزة الفعلية من وجهة نظر البرنامج. أنها لا تأخذ أكبر من ذلك بكثير مقدما الاستثمار، ولكن بالنسبة للعديد من المشاريع التي تستحق الجهد. انها اساسا يتخلص من قضية سيئة من وجود مختلف يبني لهدف والمضيف، ويتأكد عليك دائما استخدام الخاص بك عبر مترجم مع خيارات النشر البناء. لاحظ أن العديد من الأجنحة مترجم جزءا لا يتجزأ تأتي مع بعض هذه القدرة محاكاة الأساسية التي بنيت في.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top