الحقيقة الكاملة عن RTOS. المادة رقم 12. خدمات للعمل مع المهام



نواصل مراجعة خدمات RTOS التي توفر معلومات إضافية حول المهام والعمليات معها.

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

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

الحصول على معرف المهمة الحالية


يقوم استدعاء الأداة هذا بإرجاع معرف المهمة المطلوبة. بالنسبة إلى Nucleus RTOS ، يعد هذا مؤشرًا لوحدة التحكم في المهمة الحالية. بالنسبة إلى Nucleus SE ، مؤشر (0-15) للمهمة الحالية.

استدعاء المهمة الحالية في Nucleus RTOS
النموذج الأولي لمكالمة الخدمة:
NU_TASK * NU_Current_Task_Pointer (VOID) ،

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

القيمة المعادة:
المؤشر إلى وحدة التحكم في المهمة الحالية ؛
NU_NULL - لم يتم تنفيذ أي مهمة.

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

النموذج الأولي لمكالمة الخدمة:
NUSE_TASK NUSE_Task_Current (باطل) ؛

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

القيمة المعادة:
فهرس المهمة الحالية (تسمى).

أكمل مهمة مستمرة في Nucleus SE
تنفيذ استدعاء API في هذه الحالة بسيط للغاية: يتم إرجاع قيمة المتغير العام NUSE_Task_Active .

التحقق من حجم المكدس المتاح


يُرجع استدعاء الأداة المساعدة حجم المكدس المتاح (بالبايت) للمهمة الحالية. يُنصح بهذا فقط للمخططين ، حيث يكون لكل مهمة مجموعتها الخاصة ؛ أي غير مناسب لجدولة Run To Complete (RTC) في Nucleus SE.

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

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

القيمة المعادة:
حجم حجم المكدس المتاح للمهمة الحالية بالبايت.

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

النموذج الأولي لمكالمة الخدمة:
U16 NUSE_Task_Check_Stack (دمية U8) ؛

معلمات:
دمية - أي قيمة ، لأنه في الواقع لا يتم استخدامها.

القيمة المعادة:
حجم حجم المكدس المتاح للمهمة الحالية بالبايت.

التنفيذ
لمثل هذه المكالمة ، يجب أن يكون الرمز محمولًا:



إذا تم استخدام جدولة RTC ، فإن القيمة المرتجعة هي 0 لأنه ليس من الممكن (باستخدام التعليمات البرمجية المحمولة) تحديد مساحة المكدس المتاحة للمهمة.

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

إعادة مهمة


تقوم استدعاء API ، في هذه الحالة ، بإعادة المهمة إلى حالتها الأصلية غير المستخدمة. تختلف وظيفة واجهة برمجة التطبيقات هذه عن وظائف إعادة تعيين واجهة برمجة التطبيقات المعتادة لكائنات kernel الأخرى ، على الرغم من أنها فقط بسبب إعادة تعيينها ، وليس فقط تعيين المهمة إلى حالتها الأولية (بالنسبة إلى Nucleus SE فهي إما NUSE_READY أو الإدخال NUSE_Task_Initial_State [] (انظر هياكل البيانات في المقال التالي)) ؛ تم تعليق المهمة ( NUSE_PURE_SUSPEND ) ويجب استئنافها ليتم جدولتها مرة أخرى. هذا المنطق مشابه لوظيفة استدعاء API المقابل في Nucleus RTOS.

إعادة تعيين المهام في Nucleus RTOS
النموذج الأولي لمكالمة الخدمة:
STATUS NU_Reset_Task (مهمة NU_TASK * ، إشارة غير موقعة ، VOID * argv) ؛

معلمات:
مهمة - مؤشر إلى كتلة تحكم مهمة ؛
argc - عنصر بيانات يمكن استخدامه لنقل المعلومات إلى المهمة ؛
argv هو مؤشر يمكن استخدامه لتمرير المعلومات إلى المهمة.

القيمة المعادة:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_TASK - مؤشر غير صالح للمهمة ؛
NU_NOT_TERMINATED - المهمة الموصوفة ليست في حالة تعليق كامل (تم إنهاؤها) أو إتمامها (منتهية) ؛ يمكن إعادة تعيين المهام في حالة الإيقاف المؤقت أو الكامل فقط.

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

النموذج الأولي لمكالمة الخدمة:
STATUS NUSE_Task_Reset (NUSE_TASK مهمة) ؛

معلمات:
مهمة - فهرس (معرف) المهمة المراد إعادة تعيينها.

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

تنفيذ مهام إعادة الضبط في Nucleus SE
الغرض الرئيسي من وظيفة API NUSE_Task_Reset () بعد التحقق من المعلمة هو إعادة تهيئة جميع هياكل بيانات المهمة:



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

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

الحصول على معلومات المهمة


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

اتصل بمعلومات المهمة في Nucleus RTOS
النموذج الأولي لمكالمة الخدمة:
STATUS NU_Task_Information (NU_TASK * مهمة ، CHAR * اسم ، DATA_ELEMENT * task_status ، UNSIGNED * Sched_count ، OPTION * أولوية ، OPTION * preippt ، UNSIGNED * time_slice ، VOID ** stack_base ، UNSIGNED * stack_size ، غير موقَّع ؛

معلمات:
مهمة - مؤشر للمهمة التي يتم طلب المعلومات عنها ؛
name - مؤشر إلى سلسلة مكونة من 8 أحرف لاسم المهمة ؛ يتضمن مساحة للأحرف الخالية ؛
task_status - المؤشر إلى متغير يتلقى قيمة حالة المهمة الحالية ؛
Sched_count - المؤشر إلى متغير يتلقى قيمة العداد ، وعدد المرات التي تمت فيها إضافة المهمة إلى المجدول ؛
أولوية - مؤشر إلى متغير للحصول على أولوية المهمة ؛
وقائي - مؤشر لمتغير لخيارات مزاحمة مهمة ذات أولوية أقل ؛ يشير NU_PREEMPT إلى أن المهمة يمكن أن تكون مزدحمة ، ويشير NU_NO_PREEMPT إلى أنه لا يمكن ازدحام المهمة ؛
time_slice - المؤشر إلى متغير للحصول على قيمة الكم وقت المهمة ؛ تشير القيمة 0 إلى أن تقدير الوقت غير ممكن لهذه المهمة ؛
stack_base - المؤشر إلى متغير للحصول على عنوان مكدس المهام ؛
stack_size - المؤشر إلى متغير للحصول على حجم مكدس المهام ؛
Minest_stack - مؤشر إلى متغير للحصول على الحد الأدنى لعدد وحدات البايت المتبقية على المكدس.

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

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

النموذج الأولي لمكالمة الخدمة:
STATUS NUSE_Task_Information (NUSE_TASK مهمة ، U8 * task_status ، U16 * Sched_count ، ADDR * stack_base ، U16 * stack_size) ؛

معلمات:
مهمة - فهرس للمهمة التي يتم طلب المعلومات عنها ؛
task_status - مؤشر إلى متغير U8 يتلقى القيمة الحالية لحالة المهمة (إذا كانت حالة الانتظار للمهمة غير متاحة ، فلن يتم إرجاع أي شيء) ؛
Sched_count - المؤشر إلى المتغير U16 ، الذي يتلقى قيمة العداد لعدد المهام المضافة إلى المجدول (إذا تم تعطيل عداد المهام المجدولة ، فلن يتم إرجاع أي شيء) ؛
stack_base - مؤشر إلى متغير ADDR يتلقى عنوان حزمة المهام (إذا تم استخدام برنامج جدولة RTC ، فلن يتم إرجاع أي شيء) ؛
stack_size هو مؤشر إلى متغير U16 يحصل على حجم مكدس المهام (إذا تم استخدام جدولة RTC ، فلن يتم إرجاع أي شيء).

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

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



تُرجع الوظيفة حالة المهمة ، مع مراعاة خيارات التكوين المختلفة.

الحصول على عدد المهام


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

التحدي المتمثل في الحصول على عدد المهام في Nucleus RTOS
النموذج الأولي لمكالمة الخدمة:
غير موقعة NU_Established_Tasks (VOID) ،

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

القيمة المعادة:
عدد المهام المثبتة (التي تم إنشاؤها وغير المحذوفة) في التطبيق.

التحدي المتمثل في الحصول على عدد المهام في Nucleus SE
يدعم اتصال API هذا الوظائف الأساسية لـ Nucleus PLUS API.

النموذج الأولي لمكالمة الخدمة:
U8 NUSE_Task_Count (باطل) ؛

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

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

التنفيذ
إن تنفيذ استدعاء API هذا بسيط للغاية: يتم إرجاع قيمة #define NUSE_TASK_NUMBER التوجيه.

ستناقش المقالة التالية هياكل البيانات في Nucleus SE المتعلقة بالمهام وبعض مكالمات API القياسية التي لا تدعمها Nucleus SE.

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

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

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


All Articles