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



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

خدمات دعم القناة


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

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

المادة رقم 25. قنوات البيانات: مقدمة والخدمات الأساسية
المادة رقم 24. قوائم الانتظار: الخدمات المساعدة وهياكل البيانات
المادة رقم 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_PIPE_WAS_RESET .

إعادة تعيين قناة الدعوة في نواة RTOS

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

STATUS NU_Reset_Pipe (NU_PIPE * pipe) ؛

المعلمات:

توجيه الإخراج - مؤشر إلى كتلة تحكم قناة المعرفة من قبل المستخدم.

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

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

إعادة تعيين قناة التحدي في نواة SE

تدعم مكالمة خدمة API هذه الوظيفة الأساسية لـ Nucleus RTOS API.

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

STATUS NUSE_Pipe_Reset (NUSE_PIPE توجيه الإخراج) ؛

المعلمات:

توجيه الإخراج هو مؤشر (معرف) للأنابيب التي يتم إسقاطها.

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

NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_PIPE - فهرس قناة غير صالح.

إعادة ضبط القناة في تطبيق Nucleus SE

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

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

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

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

معلومات القناة


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

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

STATUS NU_Pipe_Information (NU_PIPE * توجيه الإخراج ، اسم CHAR * ، VOID ** start_address ، UNSIGNED * pipe_size ، UNSIGNED * المتاحة ، الرسائل غير الموقعة * ، OPTION * message_type ، UNSIGNED * message_size ، OPTION * suspend_type ، مهام *

المعلمات:

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

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

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

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

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

STATUS NUSE_Pipe_Information (ماسورة NUSE_PIPE ، ADDR * start_address ، U8 * pipe_size ، U8 * المتاحة ، رسائل U8 * ، U8 * message_size ، U8 * task_waiting ، NUSE_TASK * first_task) ؛

المعلمات:

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

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

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

تطبيق معلومات القناة في Nucleus SE

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

 *start_address = NUSE_Pipe_Data[pipe]; *pipe_size = NUSE_Pipe_Size[pipe]; *available = NUSE_Pipe_Size[pipe] - NUSE_Pipe_Items[pipe]; *messages = NUSE_Pipe_Items[pipe]; *message_size = NUSE_Pipe_Message_Size[pipe]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Pipe_Blocking_Count[pipe]; if (NUSE_Pipe_Blocking_Count[pipe] != 0) { U8 index; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_PIPE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == pipe)) { *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_Pipes (VOID)؛

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

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

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

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

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

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

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

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


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

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

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


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

NUSE_Pipe_Head [] عبارة عن صفيف من مؤشرات النوع U8 ، به إدخال واحد لكل قناة مكونة ويشير إلى بداية قناة الرسالة. يستخدم ك فهرس فهرس في NUSE_Pipe_Data [] (انظر أدناه).
NUSE_Pipe_Tail [] عبارة عن صفيف U8 يحتوي على إدخال واحد لكل قناة مكونة ويشير إلى نهاية قناة الرسالة. يستخدم ك فهرس فهرس في NUSE_Pipe_Data [] (انظر أدناه).
NUSE_Pipe_Items [] عبارة عن صفيف من النوع U8 ، يحتوي على إدخال واحد لكل قناة مكونة وهو عداد لعدد الرسائل الحالي في القناة. هذه البيانات ضرورية ، حيث يمكن الحصول على هذه القيمة من خلال مؤشرات بداية ونهاية القناة ، لكن وجود عداد يبسط الشفرة.
NUSE_Pipe_Blocking_Count [] - تحتوي هذه المجموعة من النوع U8 على عدادات لعدد المهام المحظورة في كل قناة. يتم إنشاء هذا الصفيف فقط في حالة تنشيط دعم قفل المهام.

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

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

 RAM U8 NUSE_Pipe_Head[NUSE_PIPE_NUMBER]; RAM U8 NUSE_Pipe_Tail[NUSE_PIPE_NUMBER]; RAM U8 NUSE_Pipe_Items[NUSE_PIPE_NUMBER]; #if NUSE_BLOCKING_ENABLE RAM U8 NUSE_Pipe_Blocking_Count[NUSE_PIPE_NUMBER]; #endif 

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


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

بيانات ROM


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

NUSE_Pipe_Data [] عبارة عن صفيف من نوع ADDR له سجل واحد لكل قناة مكونة ويشير إلى منطقة البيانات لكل قناة (راجع قسم "بيانات المستخدم في RAM" أعلاه).
NUSE_Pipe_Size [] عبارة عن صفيف من النوع U8 ، يحتوي على إدخال واحد لكل قناة مكونة ويظهر عدد الرسائل التي يمكن وضعها في كل قناة.
NUSE_Pipe_Message_Size [] عبارة عن صفيف من النوع U8 يحتوي على سجل واحد لكل قناة مكونة ويظهر حجم الرسائل (بالبايت) التي يمكن وضعها على كل قناة.

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

 ROM ADDR *NUSE_Pipe_Data[NUSE_PIPE_NUMBER] = { /* addresses of pipe data areas ------ */ }; ROM U8 NUSE_Pipe_Size[NUSE_PIPE_NUMBER] = { /* pipe sizes ------ */ }; ROM U8 NUSE_Pipe_Message_Size[NUSE_PIPE_NUMBER] = { /* pipe message sizes ------ */ }; 

ذاكرة القناة


مثل كل الكائنات الأساسية الأخرى لـ Nucleus SE ، فإن مقدار الذاكرة اللازم للقنوات يمكن التنبؤ به.

يمكن حساب مقدار البيانات في ROM (بالبايت) لجميع القنوات في التطبيق على النحو التالي:

NUSE_PIPE_NUMBER * (sizeof (ADDR) + 2)

يمكن حساب كمية بيانات kernel في RAM (بالبايت) لجميع قنوات التطبيق عند تنشيط المهام على النحو التالي:

NUSE_PIPE_NUMBER * 4

خلاف ذلك:

NUSE_PIPE_NUMBER * 3

مقدار بيانات المستخدم في ذاكرة الوصول العشوائي (بالبايت) للقناة التي بها مؤشر توجيه الإخراج:

NUSE_Pipe_Size [pipe] * NUSE_Pipe_Message_Size [pipe]

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


لم يتم تنفيذ أربعة نداءات خدمة API Nucleus RTOS في Nucleus SE.

إنشاء القناة


مكالمة واجهة برمجة التطبيقات هذه تنشئ قناة. Nucleus SE لا يحتاج إلى هذا لأنه يتم إنشاء القنوات بشكل ثابت.

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

STATUS NU_Create_Pipe (NU_PIPE * pipe ، CHAR * name ، VOID * start_address ، UNSIGNED pipe_size ، OPTION message_type ، message_SIGNED message_size ، OPTION suspend_type) ؛

المعلمات:

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

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

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

حذف القناة


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

نموذج استدعاء الخدمة:
STATUS NU_Delete_Pipe (NU_PIPE * pipe) ؛

المعلمات:
توجيه الإخراج - مؤشر إلى كتلة التحكم قناة.

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

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


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

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

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

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

البث إلى قناة


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

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

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

قيمة الإرجاع:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_PIPE - مؤشر غير صالح للقناة ؛
NU_INVALID_POINTER - مؤشر فارغ إلى رسالة ( NULL ) ؛
NU_INVALID_SIZE - حجم الرسالة المحدد غير متوافق مع حجم الرسالة المحدد عند إنشاء القناة ؛
NU_INVALID_SUSPEND - محاولة التعليق من سلسلة رسائل غير مرتبطة بالمهمة ؛
NU_PIPE_FULL - لا توجد مساحة كافية في القناة للرسالة ؛
NU_TIMEOUT - لا تزال القناة ممتلئة ، حتى بعد انتهاء فترة المهلة المحددة ؛
NU_PIPE_DELETED - تم حذف القناة أثناء تعليق المهمة ؛
NU_PIPE_RESET - تمت إعادة تعيين القناة أثناء تعليق المهمة.

نواة RTOS متوافق


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

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


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

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

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


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

حجم القناة


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

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


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

في المقالة التالية سننظر في وقت النظام.

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

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


All Articles