ماكرو يشير إلى دبابيس الإدخال/الإخراج المستخدمة

StackOverflow https://stackoverflow.com/questions/1622937

  •  06-07-2019
  •  | 
  •  

سؤال

أقوم بكتابة برنامج ثابت لـ PIC32MX، باستخدام HiTech PICC32.إحدى المشاكل التي أريد تجنبها هي أنه نظرًا لأن معظم الدبابيس لها أسماء متعددة (على سبيل المثال.AN0 = RB0 ​​= CN2 = PGED1)، قد أستخدم أنا أو أي شخص آخر RB0 عن طريق الخطأ دون أن أدرك أن AN0 مستخدم بالفعل.(قد يكون هذا كارثيًا في الواقع، نظرًا لأن التكوين غير الصحيح للمنفذ التناظري/الرقمي يمكن أن يؤدي إلى سحب تيار مفرط وإطلاق دخان أساسي.)

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

(لا أريد هذا بأي ثمن، إذا كان الحل الوحيد الممكن مروعًا للغاية أو غير قابل للاستمرار، فسوف أنساه وأكتسب سمعة بأنني انفجر في البكاء أو أشعل النار في نفسي أو شيء من هذا القبيل.رأيت أيضًا هذا السؤال حول إنتاج وحدات الماكرو, ، وهو ما يستبعد ذلك).

ينبغي أن أوضح:الكود مكتوب في وحدات تجميع متعددة (على الأقل أعتقد أن هذا هو ما تعنيه العبارة).لدي ملف .h/.c لرمز A2D الخاص بي، وبالمثل بالنسبة لـ SPI، وبالمثل بالنسبة للأجهزة الطرفية المختلفة التي تستخدم فقط منافذ إدخال/إخراج معينة.الفضاء ليس كذلك حقًا مشكلة، الكود الخاص بي يترك مساحة كبيرة على PIC32MX؛يمكنني أيضًا استخدام علامة __DEBUG أخرى لإزالة رمز التحقق من الرقم السري للاستخدام النهائي.

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

المحلول

طيب هنا.لا توجد تكلفة وقت التشغيل.

#define CLAIM(n) struct busy##n {}

CLAIM(58);
CLAIM(58);

إذا تم تشغيله مرتين فسوف يحدث خطأ:

z.c:4: error: redefinition of ‘struct busy58’

لتوسيع نطاق الفحص ليشمل وحدات ترجمة متعددة، ستحتاج إلى تضمين الماكرو فيه #if DEBUG لأننا سنستخدم الرابط لاكتشاف التعارض ومن ثم سيكون له أثر وقت التشغيل.

#define CLAIM(n) char busy##n = 1;
#define CLAIM(n) void busy##n() {} // bdonlan

نصائح أخرى

#define CLAIM_PIN(n) char claimed_pin_##n;

الآن عندما تحاول قطعتان من التعليمات البرمجية المطالبة بدبوس، سيتم تعريف الرمز بشكل مضاعف وسيقوم المترجم أو الرابط بإنشاء خطأ.

يحرر: بناءً على التعليقات، قد يصبح هذا أفضل:

#define CLAIM_PIN(n) void claimed_pin_#nn(void) {}

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

على الجانب الآخر، إجابة مارك رانسوم المحدثة كان يستحق +1.

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