الحقيقة كاملة حول RTOS. المادة رقم 24. قوائم الانتظار: الخدمات المساعدة وهياكل البيانات



في هذه المقالة ، سوف نستمر في النظر في قوائم الانتظار.

خدمات قائمة الانتظار الثانوية


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

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

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

قائمة انتظار إعادة تعيين


استدعاء API هذا يعيد تعيين قائمة الانتظار إلى حالته الأصلية غير المستخدمة. سيتم فقد أي رسائل يتم تخزينها في قائمة الانتظار. سيتم استئناف أي مهام متوقفة مؤقتًا في قائمة الانتظار برمز الإرجاع NUSE_QUEUE_WAS_RESET .

قائمة انتظار إعادة الاتصال في نواة RTOS
نموذج استدعاء الخدمة:
STATUS NU_Reset_Queue (قائمة انتظار NU_QUEUE *) ؛

المعلمات:
قائمة الانتظار - مؤشر إلى كتلة التحكم قائمة الانتظار المقدمة من قبل المستخدم.

قيمة الإرجاع:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_QUEUE - مؤشر قائمة انتظار غير صالح.

قائمة انتظار إعادة الاتصال في Nucleus SE
تدعم مكالمة الأداة المساعدة هذه الوظيفة الأساسية لـ Nucleus RTOS API.

نموذج استدعاء الخدمة:
STATUS NUSE_Queue_Reset (قائمة انتظار NUSE_QUEUE) ؛

المعلمات:
قائمة الانتظار - فهرس (ID) قائمة الانتظار تفريغها.

قيمة الإرجاع:
NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_QUEUE - فهرس قائمة الانتظار غير صالح.

تطبيق إعادة ضبط قائمة الانتظار في Nucleus SE
رمز الدالة NUSE_Queue_Reset (بعد التحقق من المعلمات) بسيط للغاية. يتم تعيين فهارس الرأس والذيل قائمة الانتظار ، وكذلك عداد الرسائل في قائمة الانتظار ، إلى صفر.

في حالة تنشيط تأمين المهام ، تكون التعليمات البرمجية الإضافية مسؤولة عن استعادة المهام المعلقة:

while (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; /* check whether any tasks are blocked */ /* on this queue */ for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { NUSE_Task_Blocking_Return[index] = NUSE_QUEUE_WAS_RESET; NUSE_Task_Status[index] = NUSE_READY; break; } } NUSE_Queue_Blocking_Count[queue]--; } #if NUSE_SCHEDULER_TYPE == NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif 

يتم تعيين حالة "جاهزة" لكل مهمة متوقفة مؤقتًا في قائمة الانتظار برمز إرجاع NUSE_QUEUE_WAS_RESET . بعد اكتمال هذه العملية ، إذا تم استخدام جدولة الأولوية ، فسيتم استدعاء الدالة NUSE_Reschedule () ، نظرًا لأن مهمة أو أكثر ذات أولوية عالية يمكن أن تكون جاهزة للتنفيذ.

الحصول على معلومات قائمة الانتظار


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

دعوة للحصول على معلومات قائمة الانتظار في نواة RTOS
نموذج استدعاء الخدمة:

الحالة NU_Queue_Information (NU_QUEUE * قائمة الانتظار ، CHAR * الاسم ، VOID ** start_address ، UNSIGNED * queue_size ، UNSIGNED * المتاحة ، * رسائل غير موقعة * ، OPTION * message_type ، UNSIGNED * message_size ، OPTION_ask

المعلمات:

قائمة الانتظار - مؤشر إلى كتلة التحكم قائمة الانتظار المقدمة من قبل المستخدم؛
اسم - مؤشر إلى منطقة 8 أحرف لاسم الرسالة في قائمة الانتظار؛
start_address - مؤشر إلى مؤشر يتم كتابة عنوان بداية منطقة بيانات قائمة الانتظار فيه
queue_size - مؤشر إلى متغير لتخزين العدد الإجمالي للعناصر غير الموقعة في قائمة الانتظار ؛
متوفر - مؤشر لمتغير لتخزين عدد العناصر غير الموقعة المتاحة في قائمة الانتظار ؛
الرسائل - مؤشر إلى متغير لتخزين العدد الحالي للرسائل في قائمة الانتظار ؛
message_type - مؤشر إلى متغير لتخزين نوع الرسائل التي تدعمها قائمة الانتظار. القيم الصالحة هي NU_FIXED_SIZE و NU_VARIABLE ؛
message_size - مؤشر إلى متغير لتخزين عدد عناصر البيانات غير الموقعة في كل رسالة من قائمة الانتظار. إذا كانت قائمة الانتظار تدعم رسائل ذات طول متغير ، فإن هذا الرقم يشير إلى الحد الأقصى لطول الرسالة ؛
suspend_type - مؤشر إلى متغير لتخزين نوع تعليق المهام. القيم الصالحة هي NU_FIFO و NU_PRIORITY ؛
asks_waiting - مؤشر إلى متغير لتخزين عدد المهام المعلقة في قائمة الانتظار هذه ؛
first_task - مؤشر إلى مؤشر المهمة ، حيث يتم وضع مؤشر المهمة المعلقة الأولى.

قيمة الإرجاع:

NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_QUEUE - مؤشر قائمة انتظار غير صالح.

اتصل للحصول على معلومات قائمة الانتظار في Nucleus SE
تدعم مكالمة API هذه الوظيفة الأساسية لـ Nucleus RTOS API.

نموذج استدعاء الخدمة:

STATUS NUSE_Queue_Information (قائمة انتظار NUSE_QUEUE و ADDR * start_address و U8 * queue_size و U8 * المتاحة ورسائل U8 * و U8 * task_waiting و NUSE_TASK * first_task) ؛

المعلمات:

قائمة الانتظار - فهرس قائمة الانتظار حول المعلومات المطلوبة؛
start_address - مؤشر إلى متغير من النوع ADDR ، حيث سيتم تخزين عنوان بداية منطقة البيانات في قائمة الانتظار ؛
queue_size - مؤشر إلى متغير من النوع U8 ، والذي سيخزن إجمالي عدد الرسائل التي يمكن احتواؤها في قائمة الانتظار ؛
متوفر - مؤشر إلى متغير من النوع U8 ، والذي سيخزن عدد الأماكن المجانية في قائمة الانتظار ؛
الرسائل - مؤشر إلى متغير من النوع U8 ، والذي سيخزن العدد الحالي للرسائل في قائمة الانتظار ؛
task_waiting - مؤشر إلى متغير يتم فيه تخزين عدد المهام المعلقة في قائمة الانتظار هذه (لا يتم إرجاع أي شيء إذا تم تعطيل تأمين المهام) ؛
first_task - مؤشر إلى متغير من النوع NUSE_TASK يتم تخزين فهرس المهمة الموقوفة فيه (لن يتم إرجاع أي شيء إذا تم تعطيل قفل المهمة).

قيمة الإرجاع:

NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_QUEUE - فهرس قائمة الانتظار غير صالح ؛
NUSE_INVALID_POINTER - معلمة مؤشر واحد أو أكثر غير صحيحة.

تطبيق عرض معلومات قائمة الانتظار في Nucleus SE

تنفيذ مكالمة واجهة برمجة التطبيقات هذه بسيط جدًا:

 *start_address = NUSE_Queue_Data[queue]; *queue_size = NUSE_Queue_Size[queue]; *available = NUSE_Queue_Size[queue] - NUSE_Queue_Items[queue]; *messages = NUSE_Queue_Items[queue]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Queue_Blocking_Count[queue]; if (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif 

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

الحصول على عدد من قوائم الانتظار


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

استدعاء عداد قائمة الانتظار في Nucleus RTOS
نموذج استدعاء الخدمة:
UNSIGNED NU_Established_Queues (VOID)؛

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

قيمة الإرجاع:
عدد قوائم الانتظار التي تم إنشاؤها في النظام.

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

نموذج استدعاء الخدمة:
U8 NUSE_Queue_Count (باطل) ؛

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

قيمة الإرجاع:
عدد قوائم الانتظار المكونة في التطبيق.

تطبيق عداد قائمة الانتظار في Nucleus SE
تطبيق استدعاء API هذا بسيط للغاية: يتم إرجاع قيمة رمز #define NUSE_QUEUE_NUMBER .

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


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

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


تحتوي هذه البيانات على البنية التالية:

NUSE_Queue_Head [] عبارة عن صفيف من مؤشرات النوع U8 ، وله إدخال واحد لكل قائمة انتظار مكونة ، ويشير إلى رأس قائمة انتظار الرسائل. يستخدم ك فهرس فهرس في NUSE_Queue_Data [] (انظر أدناه) ؛
NUSE_Queue_Tail [] عبارة عن صفيف من النوع U8 ، وله إدخال واحد لكل قائمة انتظار تم تكوينها في التطبيق ، ويشير إلى نهاية قائمة انتظار الرسائل. يستخدم ك فهرس فهرس في NUSE_Queue_Data [] (انظر أدناه) ؛
NUSE_Queue_Items [] عبارة عن صفيف من النوع U8 ، وله إدخال واحد لكل قائمة انتظار مكونة ، وهو عداد للرسائل في قائمة الانتظار. يمكن اعتبار هذه البيانات زائدة عن الحاجة ، حيث يمكن الحصول على هذه القيم من خلال فهارس بداية ونهاية قائمة الانتظار ، ومع ذلك ، فإن تخزين العداد يبسط الكود ؛
NUSE_Queue_Blocking_Count [] - تحتوي هذه المجموعة من النوع U8 على عدادات لعدد المهام المعلقة في كل قائمة انتظار. يتم إنشاء هذا الصفيف فقط في حالة تنشيط دعم قفل المهام.

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

فيما يلي تعريفات هذه الهياكل في ملف nuse_init.c :

 RAM U8 NUSE_Queue_Head[NUSE_QUEUE_NUMBER]; RAM U8 NUSE_Queue_Tail[NUSE_QUEUE_NUMBER]; RAM U8 NUSE_Queue_Items[NUSE_QUEUE_NUMBER]; #if NUSE_BLOCKING_ENABLE RAM U8 NUSE_Queue_Blocking_Count[NUSE_QUEUE_NUMBER]; #endif 

ذاكرة الوصول العشوائي بيانات المستخدم


المستخدم مسؤول عن توفير مساحة RAM لتخزين كل قائمة انتظار. يجب أن يحتوي حجم هذه المنطقة على مصفوفة من النوع ADDR ، يتطابق فيها كل سجل مع رسالة واحدة في قائمة الانتظار

بيانات ROM


تحتوي هذه البيانات على البنية التالية:

NUSE_Queue_Data [] - مصفوفة من النوع ADDR ، لها إدخال واحد لكل قائمة انتظار مكونة وتشير إلى منطقة البيانات في قائمة الانتظار (انظر بيانات ذاكرة الوصول العشوائي للمستخدم) ؛
NUSE_Queue_Size [] - يحتوي صفيف من النوع U8 ، على إدخال واحد لكل قائمة انتظار مكونة ويظهر الحد الأقصى لعدد الرسائل التي يمكن أن تتلقاها كل قائمة انتظار.

يتم تعريف هياكل البيانات هذه وتهيئتها (بشكل ثابت) في ملف nuse_config.c :

 ROM ADDR *NUSE_Queue_Data[NUSE_QUEUE_NUMBER] = { /* addresses of queue data areas ------ */ }; ROM U8 NUSE_Queue_Size[NUSE_QUEUE_NUMBER] = { /* queue sizes ------ */ }; 

مقدار الذاكرة لقوائم الانتظار


مثل كل كائنات Kernel Nucleus SE ، يمكن بسهولة التنبؤ بحجم الذاكرة اللازمة لقوائم الانتظار.

يمكن حساب مقدار البيانات في ROM (بالبايت) لجميع قوائم الانتظار في التطبيق كما يلي:
NUSE_QUEUE_NUMBER * (sizeof (ADDR) + 1)

يتم حساب مقدار بيانات kernel في RAM (بالبايت) لجميع قوائم الانتظار في التطبيق مع تأمين المهام المنشّط كما يلي:
NUSE_QUEUE_NUMBER * 3

إذا تم تعطيل القفل:
NUSE_QUEUE_NUMBER * 4

مقدار بيانات المستخدم في RAM (بالبايت) لقائمة الانتظار مع فهرس قائمة الانتظار :
NUSE_Queue_Size [قائمة انتظار] * sizeof (ADDR)

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


لم يتم تنفيذ أربعة مكالمات API يمكن العثور عليها في Nucleus RTOS في Nucleus SE:

إنشاء قائمة الانتظار


استدعاء API هذا ينشئ قائمة انتظار ؛ في Nucleus SE ، هذا ليس ضروريًا ، حيث يتم إنشاء قوائم الانتظار بشكل ثابت.

نموذج استدعاء الخدمة:
STATUS NU_Create_Queue (NU_QUEUE * قائمة انتظار ، اسم char * ، VOID * start_address ، قائمة انتظار غير موقعة ، OPTION message_type ، message_speed ، message_size ، OPTION suspend_type) ؛

المعلمات:

قائمة الانتظار - مؤشر إلى وحدة التحكم التي يوفرها المستخدم ؛ يتم استخدامه لإدارة قوائم الانتظار في مكالمات API الأخرى ؛
اسم - مؤشر إلى اسم قائمة انتظار 7 أحرف مع بايت إنهاء فارغة؛
start_address - عنوان بداية قائمة الانتظار ؛
message_type - نوع الرسالة المدعومة من قائمة الانتظار. يمكن أن يأخذ القيم NU_FIXED_SIZE أو NU_VARIABLE_SIZE ؛
message_size - إذا كانت قائمة الانتظار تدعم رسائل ذات طول ثابت ، فإن هذه المعلمة تحدد الطول الدقيق لكل رسالة ، وإلا ، إذا كانت قائمة الانتظار تدعم رسائل ذات طول متغير ، فهذه القيمة هي الحد الأقصى لطول الرسالة ؛
suspend_type - لتحديد نوع مهام التوقف المرحلي في قائمة الانتظار. يمكن أن يأخذ القيم NU_FIFO و NU_PRIORITY ، مما يعني مبدأ FIFO (الأول في المغادرة الأول) أو مبدأ أولوية تعليق المهام ، على التوالي.

قيمة الإرجاع:

NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_QUEUE - مؤشر فارغ إلى كتلة التحكم قائمة الانتظار ( NULL ) أو المؤشر قيد الاستخدام بالفعل؛
NU_INVALID_MEMORY - منطقة ذاكرة غير صالحة محددة في start_address ؛
NU_INVALID_MESSAGE - معلمة message_type غير صالحة ؛
NU_INVALID_SIZE - قائمة الانتظار لا تدعم الرسائل من هذا الطول ، أو حجم قائمة الانتظار و / أو طول الرسالة هو 0 ؛
NU_INVALID_SUSPEND - معلمة suspend_type غير صالحة.

حذف قائمة الانتظار


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

نموذج استدعاء الخدمة:
STATUS NU_Delete_Queue (NU_QUEUE * queue)؛

المعلمات:
قائمة الانتظار - مؤشر إلى كتلة التحكم قائمة الانتظار.

قيمة الإرجاع:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_QUEUE - مؤشر قائمة انتظار غير صالح.

قائمة انتظار المؤشرات


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

نموذج استدعاء الخدمة:
UNSIGNED NU_Queue_Pointers (NU_QUEUE ** pointer_list ، UNSIGNED maximum_pointers) ؛

المعلمات:
pointer_list - مؤشر إلى مجموعة من المؤشرات NU_QUEUE . سيتم ملء هذه المجموعة مع مؤشرات إلى قوائم الانتظار التي تم إنشاؤها في النظام ؛
maximum_pointers - الحد الأقصى لعدد المؤشرات في الصفيف.

قيمة الإرجاع:
عدد مؤشرات NU_QUEUE في الصفيف.

طابور (البث إلى قائمة الانتظار)


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

نموذج استدعاء الخدمة:
STATUS NU_Broadcast_To_Queue (NU_QUEUE * قائمة انتظار ، رسالة VOID * ، حجم غير موقَّع ، معلق معلق) ؛

المعلمات:

قائمة الانتظار - مؤشر إلى كتلة التحكم قائمة الانتظار؛
رسالة - مؤشر على الرسالة المرسلة ؛
الحجم - عدد العناصر غير الموقعة في الرسالة. إذا كانت قائمة الانتظار تدعم الرسائل ذات الطول المتغير ، فيجب أن تكون هذه المعلمة مساوية أو أقل من طول الرسالة التي تدعمها قائمة الانتظار. إذا كانت قائمة الانتظار تدعم رسائل ذات طول ثابت ، يجب أن تكون هذه المعلمة مساوية لطول الرسالة التي تدعمها قائمة الانتظار ؛
تعليق - يشير إلى ما إذا كان سيتم تعليق مهمة الاستدعاء إذا كانت قائمة الانتظار ممتلئة بالفعل. يمكن أن يكون NU_NO_SUSPEND أو NU_SUSPEND أو قيمة مهلة.

قيمة الإرجاع:

NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_QUEUE - مؤشر قائمة انتظار غير صالح ؛
NU_INVALID_POINTER - مؤشر فارغ إلى رسالة ( NULL ) ؛
NU_INVALID_SIZE - طول الرسالة المحدد غير متوافق مع الطول المحدد عند إنشاء قائمة الانتظار ؛
NU_INVALID_SUSPEND - محاولة إيقاف مهمة مؤقتًا من سلسلة رسائل غير مرتبطة بالمهمة ؛
NU_QUEUE_FULL - لا توجد مساحة كافية في قائمة الانتظار للرسالة ؛
NU_TIMEOUT - قائمة الانتظار لا تزال ممتلئة بعد انتهاء المهلة ؛
NU_QUEUE_DELETED - تم حذف قائمة الانتظار أثناء تعليق المهمة ؛
NU_QUEUE_RESET - تمت إعادة تعيين قائمة الانتظار أثناء تعليق المهمة.

نواة RTOS متوافق


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

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


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

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

حجم الرسالة ونوعها


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

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

حجم قائمة الانتظار


في Nucleus SE ، يبلغ الحد الأقصى لعدد الرسائل في قائمة انتظار 256 ، نظرًا لأن جميع المتغيرات والثوابت من النوع U8 . Nucleus RTOS لا يوجد لديه مثل هذه القيود.

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


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

سوف يناقش المقال التالي قنوات نقل البيانات.

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

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


All Articles