سؤال

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

في VxWorks، يبدو أن آلية الخطأ هي طريقة جيدة للقيام بذلك.

هل من الممكن تحديد قيم errno الخاصة بي؟

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

المحلول

في سياق VxWorks، يتم تعريف errno على أنه نوعان من 16 بت:

  • يحدد الجزء العلوي ذو الـ 16 بت "الوحدة النمطية" التي حدث فيها الخطأ.
  • تمثل الـ 16 بت السفلية الخطأ المحدد لتلك الوحدة.

توجد قيم وحدة vxWorks الرسمية (لـ errno) في الملف ../h/vwModNum.h.إنهم يستخدمون حاليًا بضع مئات من الأرقام.تحتوي جميع أرقام الوحدات النمطية هذه على النموذج

#define M_something   (nn <<  16)

إنها بقوة لا يُنصح بتعديل ملف رأس vxWorks هذا (أو أي ملف آخر).

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

/* myModNum.h */
#define M_MyModule     (10000 << 16)
#define M_MyNextModule (10001 << 16)
...

في ملفات رأس الوحدة الفردية، قم بإنشاء قيم errno الفردية.

/* myModule.h */
#define S_MyModule_OutOfResources (M_MyModule | 1)
#define S_MyModule_InvalidHandle  (M_MyModule | 2)
...

في التعليمات البرمجية الخاصة بك، يمكنك بعد ذلك تعيين errno على الماكرو المحدد الخاص بك.

نصائح أخرى

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

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