الحقيقة الكاملة عن RTOS. المادة رقم 18. مجموعات علامات الأحداث: خدمات المساعدة وهياكل البيانات



تستمر هذه المقالة في وصف مجموعات علامات الأحداث.

المقالات السابقة في السلسلة:

المادة رقم 17. مجموعات علامة الحدث: المقدمة والخدمات الأساسية
المادة رقم 16. الإشارات
المادة رقم 15. أقسام الذاكرة: الخدمات وهياكل البيانات
المادة رقم 14. أقسام الذاكرة: المقدمة والخدمات الأساسية
المادة رقم 13. هياكل بيانات المهام ومكالمات API غير مدعومة
المادة رقم 12. خدمات للعمل مع المهام
المادة رقم 11. المهام: التكوين والمقدمة لواجهة برمجة التطبيقات
المادة رقم 10. المجدول: الميزات المتقدمة والحفاظ على السياق
المادة رقم 9. المجدول: التنفيذ
المادة رقم 8. Nucleus SE: التصميم الداخلي والنشر
المادة رقم 7. Nucleus SE: مقدمة
المادة رقم 6. خدمات RTOS الأخرى
المادة رقم 5. تفاعل المهام والمزامنة
المادة رقم 4. المهام وتبديل السياق والمقاطعات
المادة رقم 3. المهام والتخطيط
المادة رقم 2. RTOS: البنية ووضع الوقت الحقيقي
المادة رقم 1. RTOS: مقدمة.


خدمات مساعد مجموعة علم الحدث


يحتوي Nucleus RTOS على ثلاث مكالمات API توفر وظائف مساعدة لمجموعات علامات الأحداث: استرداد معلومات المجموعة ، واسترداد المعلومات حول عدد مجموعات علامات الأحداث في تطبيق ، واسترداد المؤشرات إلى جميع مجموعات علامات الأحداث. يتم تنفيذ أول تحديين في Nucleus SE.

استرجاع معلومات مجموعة علامة الحدث


تقوم استدعاء الأداة المساعدة هذه بإرجاع معلومات حول مجموعة علامات الأحداث. يختلف تنفيذ هذه المكالمة في Nucleus SE عن التنفيذ في Nucleus RTOS في أنه يتم إرجاع معلومات أقل ، حيث لا يتم دعم تسمية الكائن وترتيب الإيقاف المؤقت للمهمة ، ويمكن إلغاء تنشيط إيقاف المهمة نفسه.

استدعاء لاسترداد معلومات مجموعة الأحداث في Nucleus RTOS
النموذج الأولي لمكالمة الخدمة:
STATUS NU_Event_Group_Information (NU_EVENT_GROUP * group، CHAR * name، UNSIGNED * event_flags، UNSIGNED * task_waiting، NU_TASK ** first_task)؛

معلمات:
مجموعة - مؤشر إلى كتلة تحكم مقدمة من قبل المستخدم لمجموعة من علامات الأحداث ؛
name - مؤشر إلى منطقة مكونة من 8 أحرف لاسم مجموعة علامات الأحداث ، وهذا يشمل أيضًا النهاية النهائية ؛
event_flags - المؤشر إلى متغير يأخذ القيمة الحالية لمجموعة علامات الحدث المحددة ؛
task_waiting - مؤشر إلى متغير يأخذ عدد المهام المعلقة في هذه المجموعة من علامات الأحداث ؛
first_task - مؤشر إلى متغير من النوع NU_TASK ، والذي سينقل المؤشر إلى أول مهمة معلقة.

القيمة المعادة:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_GROUP - مؤشر غير صالح لمجموعة من علامات الأحداث.

استدعاء لاسترداد معلومات مجموعة الأحداث في Nucleus SE
تدعم هذه المكالمة الوظائف الأساسية لـ Nucleus RTOS API.

النموذج الأولي لمكالمة الخدمة:
STATUS NUSE_Event_Group_Information (NUSE_EVENT_GROUP group، U8 * event_flags، U8 * task_waiting، NUSE_TASK * first_task)؛

معلمات:
مجموعة - فهرس مجموعة علامات الأحداث التي يتم طلب المعلومات عنها ؛
event_flags - المؤشر إلى متغير يأخذ القيمة الحالية لمجموعة علامات الحدث المحددة ؛
task_waiting - مؤشر إلى متغير يأخذ عدد المهام المعلقة في هذه المجموعة من علامات الأحداث (لا يتم إرجاع أي شيء إذا تم تعطيل تعليق المهمة) ؛
first_task - مؤشر لمتغير من النوع NUSE_TASK ، والذي سيأخذ فهرس المهمة الأولى المعلقة (لا يتم إرجاع أي شيء إذا تم تعطيل تعليق المهام).

القيمة المعادة:
NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_GROUP - فهرس مجموعة علامة حدث غير صالح.

تنفيذ معلومات مجموعة الأحداث في Nucleus SE
تنفيذ استدعاء API هذا بسيط جدًا:

*event_flags = NUSE_Event_Group_Data[group]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Event_Group_Blocking_Count[group]; if (NUSE_Event_Group_Blocking_Count[group] != 0) { U8 index; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_EVENT_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == group)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif return NUSE_SUCCESS; 

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

الحصول على عدد مجموعات علامات الأحداث


تقوم استدعاء الأداة المساعدة هذه بإرجاع عدد مجموعات علامات الأحداث في التطبيق. في Nucleus RTOS ، تتغير هذه القيمة بمرور الوقت ، وتظهر القيمة المرتجعة العدد الحالي للمجموعات ، بينما في Nucleus SE يتم تحديد هذه القيمة أثناء التجميع ولا تتغير بمرور الوقت.

استدعاء عداد مجموعات علامة الحدث في Nucleus RTOS
النموذج الأولي لمكالمة الخدمة:
NU_Establised_Event_Groups (VOID) غير موقعة ؛

معلمات:
غائبون.

القيمة المعادة:
العدد الحالي لمجموعات علامات الأحداث التي تم إنشاؤها.

استدعاء عداد مجموعات علامة الحدث في Nucleus SE
النموذج الأولي لمكالمة الخدمة:
U8 NUSE_Event_Group_Count (باطل) ؛

معلمات:
غائبون.

القيمة المعادة:
عدد مجموعات علامات الأحداث التي تم تكوينها.

تنفيذ عداد مجموعة علم الحدث في Nucleus SE
يعد تنفيذ استدعاء API هذا أمرًا تافهًا جدًا: يتم إرجاع قيمة #define NUSE_EVENT_GROUP_NUMBER .

هياكل البيانات


مثل جميع كائنات Nucleus SE الأخرى ، تستخدم مجموعات علامات الأحداث صف واحد أو اثنين من هياكل البيانات (كلاهما موجود في ذاكرة الوصول العشوائي) ، يعتمد حجم الصفائف على عدد المجموعات المحددة في الإعدادات.

أوصي بشدة ألا يستخدم رمز التطبيق الوصول المباشر إلى هياكل البيانات هذه ، ولكنه يشير إليها من خلال وظائف واجهة برمجة التطبيقات المتوفرة. سيؤدي ذلك إلى تجنب عدم التوافق مع الإصدارات المستقبلية من Nucleus SE والآثار الجانبية غير المرغوب فيها ، فضلاً عن تبسيط نقل التطبيق إلى Nucleus RTOS. لفهم أفضل لرمز استدعاء الخدمة وتصحيح الأخطاء ، يتم توفير نظرة عامة تفصيلية على هياكل البيانات أدناه.

بيانات ذاكرة الوصول العشوائي


تحتوي هذه البيانات على البنية التالية:
NUSE_Event_Group_Data [] - صفيف من البيانات من النوع U8 له سجل واحد لكل مجموعة مكونة من العلامات ؛ يقوم بتخزين بيانات إشارة الحدث.
NUSE_Event_Group_Blocking_Count [] - صفيف من النوع U8 يحتوي على عداد المهام المحظورة في كل مجموعة من علامات الأحداث. هذا الصفيف موجود فقط عندما يتم تنشيط وظيفة القفل في API.

تتم تهيئة هياكل البيانات هذه بالأصفار في دالة NUSE_Init_Event_Group () عند بدء Nucleus SE. ستقدم إحدى المقالات التالية وصفًا كاملاً لإجراءات بدء تشغيل Nucleus SE.

فيما يلي وصف لبنى البيانات هذه في ملف nuse_init.c :

 RAM U8 NUSE_Event_Group_Data[NUSE_EVENT_GROUP_NUMBER]; #if NUSE_BLOCKING_ENABLE RAM U8 NUSE_Event_Group_Blocking_Count[NUSE_EVENT_GROUP_NUMBER]; #endif 

بيانات ROM


لتنفيذ مجموعات من علامات الأحداث ، لا يتم استخدام البيانات في ROM.

حجم الذاكرة لمجموعات علامات الحدث


كما هو الحال مع جميع كائنات Nucleus SE kernel ، يمكن توقع مقدار الذاكرة المطلوبة لمجموعات علامات الحدث.

مقدار البيانات في ROM لجميع مجموعات علامات الأحداث في التطبيق هو 0.

مقدار الذاكرة في ذاكرة الوصول العشوائي لجميع مجموعات علامات الأحداث مع وظيفة قفل API التي تم تنشيطها هو NUSE_EVENT_GROUP_NUMBER * 2 .

خلاف ذلك ، فهو NUSE_EVENT_GROUP_NUMBER .

مكالمات API غير محققة


لم يتم تنفيذ ثلاث مكالمات API لمجموعات علامات الأحداث التي يمكن العثور عليها في Nucleus RTOS في Nucleus SE.

إنشاء مجموعة علامة حدث


ينشئ استدعاء API مجموعة من علامات الأحداث. لا يحتاج Nucleus SE إلى هذه المكالمة لأنه يتم إنشاء مجموعات علامات الأحداث بشكل ثابت.

النموذج الأولي لمكالمة الخدمة:
STATUS NU_Create_Event_Group (NU_EVENT_GROUP * group ، CHAR * name) ،

معلمات:

مجموعة - مؤشر إلى كتلة تحكم مقدمة من قبل المستخدم لمجموعة من علامات الأحداث ؛ يستخدم كموصف لإدارة مجموعات من علامات الأحداث في مكالمات API الأخرى
name - مؤشر إلى اسم مكون من 8 أحرف لمجموعة إشارات الحدث مع إنهاء بايت فارغ مضمّن في هذه المنطقة.

القيمة المعادة:

NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_GROUP - مؤشر فارغ لوحدة التحكم الخاصة بمجموعة إشارة الحدث ( NULL ) أو قيد الاستخدام بالفعل.

حذف مجموعة من علامات الحدث


يزيل استدعاء API هذا مجموعة علامة الحدث التي تم إنشاؤها مسبقًا. لا يحتاج Nucleus SE إلى هذه المكالمة لأنه يتم إنشاء مجموعات علامات الأحداث بشكل ثابت ولا يمكن حذفها.

النموذج الأولي لمكالمة الخدمة:

STATUS NU_Delete_Event_Group (مجموعة NU_EVENT_GROUP *) ؛

معلمات:

مجموعة - مؤشر إلى كتلة التحكم لمجموعة علامات الأحداث.

القيمة المعادة:

NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_GROUP - مؤشر غير صالح لمجموعة من علامات الأحداث.

مؤشرات مجموعة علامة الحدث


تشكل مكالمة API هذه قائمة متسلسلة من المؤشرات لجميع مجموعات علامات الأحداث في النظام. لا يحتاج Nucleus SE إلى هذه المكالمة لأن مجموعات علامات الأحداث لها فهارس بسيطة وليس مؤشرات.

النموذج الأولي لمكالمة الخدمة:

NU_Event_Group_Pointers غير موقعة (NU_EVENT_GROUP * pointer_list ، غير موقعة الحد الأقصى).

معلمات:

pointer_list - مؤشر صفيف من المؤشرات NU_EVENT_GROUP ، هذا الصفيف مليء بمؤشرات إلى مجموعات من علامات الأحداث التي تم إنشاؤها في النظام ؛
max_pointers - الحد الأقصى لعدد المؤشرات في المصفوفة.

القيمة المعادة:

عدد مؤشرات NU_EVENT_GROUP في الصفيف.

متوافق مع Nucleus RTOS


عند تطوير Nucleus SE ، كان هدفي هو ضمان الحد الأقصى من توافق الكود مع Nucleus RTOS. لم تكن مجموعات علامات الأحداث استثناءً ، ومن وجهة نظر المطور ، يتم تنفيذها بنفس الطريقة تقريبًا في Nucleus RTOS. هناك بعض أوجه عدم التوافق التي اعتبرتها صالحة ، نظرًا لأن الرمز النهائي سيصبح أكثر قابلية للفهم وأكثر كفاءة من حيث حجم الذاكرة المطلوبة. خلاف ذلك ، يمكن استخدام مكالمات Nucleus RTOS API مباشرة تقريبًا مثل مكالمات Nucleus SE.

معرفات الكائن


في Nucleus RTOS ، يتم وصف جميع الكائنات من خلال هياكل البيانات (وحدات التحكم) من نوع معين. مؤشر وحدة التحكم هذه هو معرف لمجموعة من علامات الأحداث. قررت أنه في Nucleus SE ، هناك حاجة إلى نهج مختلف للاستخدام الفعال للذاكرة: يتم وصف جميع كائنات kernel بواسطة عدة جداول في ذاكرة الوصول العشوائي و / أو ROM. يتم تحديد حجم هذه الجداول من خلال عدد الكائنات المكونة لكل نوع. معرف كائن معين هو الفهرس في هذا الجدول. لذلك قمت بتعريف NUSE_EVENT_GROUP كمكافئ لـ U8 ، يعمل متغير من هذا النوع (ليس مؤشرًا) كمعرف لمجموعة من علامات الأحداث. من السهل معالجة هذا التعارض البسيط إذا تم نقل الرمز من Nucleus SE إلى Nucleus RTOS والعكس صحيح. عادةً ، لا يتم تنفيذ أي عمليات على معرفات الكائنات بخلاف النقل والتخزين.

يدعم Nucleus RTOS أيضًا تسمية مجموعات علامات الأحداث. يتم استخدام هذه الأسماء فقط لتصحيح الأخطاء. لقد استبعدتهم من Nucleus SE لتوفير الذاكرة.

عدد الأعلام في المجموعة


في Nucleus RTOS ، تحتوي مجموعات علامات الأحداث على 32 علامة لكل منها ، في Nucleus SE I قللت عددهم إلى ثمانية ، لأن هذا يكفي للتطبيقات البسيطة ويوفر ذاكرة الوصول العشوائي. يمكن تعديل Nucleus SE بسهولة إذا كانت هناك حاجة إلى مجموعات أكبر من علامات الأحداث.

وظيفة امتصاص العلم


لدى Nucleus RTOS وظيفة لمسح (استيعاب) إشارات الأحداث بعد قراءتها. قررت استبعاد هذه الوظيفة من Nucleus SE لتبسيط النظام ، حيث يحدث امتصاص (إزالة) الأعلام عندما تتلقى جميع المهام المحظورة إشارات للقراءة ، وسيكون من الصعب تنفيذ ذلك. إذا لزم الأمر ، يمكن لمهمة قراءة الإشارة دائمًا مسحها باستخدام مكالمة API منفصلة.

مكالمات API غير محققة


يدعم Nucleus RTOS سبع مكالمات مفيدة للعمل مع مجموعات علامات الأحداث. لم يتم تنفيذ ثلاثة منها في Nucleus SE. تم وصف تفاصيل هذه التحديات ، بالإضافة إلى قرار استبعادها من Nucleus SE ، أعلاه.
ستبحث المقالة التالية في الإشارات.

نبذة عن الكاتب: يعمل Colin Walls في صناعة الإلكترونيات لأكثر من ثلاثين عامًا ، ويكرس معظم وقته للبرامج الثابتة. وهو الآن مهندس برامج ثابتة في Mentor Embedded (قسم من Mentor Graphics). غالبًا ما يتحدث كولين وولز في المؤتمرات والندوات ، مؤلف العديد من المقالات الفنية وكتابين عن البرامج الثابتة. يعيش في المملكة المتحدة. مدونة كولين المهنية ، البريد الإلكتروني: colin_walls@mentor.com.

Source: https://habr.com/ru/post/ar428890/


All Articles