الحقيقة الكاملة عن RTOS من Colin Walls. المادة رقم 5. تفاعل المهام والمزامنة



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

المقالات السابقة في السلسلة:
المادة رقم 4. المهام وتبديل السياق والمقاطعات
المادة رقم 3. المهام والتخطيط
المادة رقم 2. RTOS: البنية ووضع الوقت الحقيقي
المادة رقم 1. RTOS: مقدمة.

نطاق الوظيفة


هناك ثلاثة نماذج للتفاعل والمزامنة بين المهام:

  • ترتبط الخدمات بالمهام: يوفر RTOS المهام بسمات توفر التفاعل بينها. تأمل الإشارات كمثال.
  • كائنات النواة هي وسائل اتصال أو تزامن مستقلة. أمثلة: علامات الأحداث ، وصناديق البريد ، وقوائم الانتظار / القنوات ، والأشكال والمختارات.
  • المراسلة عبارة عن مخطط انسيابي يتيح لك RTOS إنشاء كائنات الرسالة ونقلها من مهمة إلى أخرى أو عدة مهام. هذا أمر أساسي في بنية النواة ، وبالتالي يسمى هذا النظام "المراسلة RTOS".

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

المتغيرات الشائعة أو مناطق الذاكرة


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

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

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

الإشارات


الإشارات هي واحدة من أبسط آليات التفاعل بين المهام التي تقدمها RTOS التقليدية. تحتوي على مجموعة من إشارات البت (8 أو 16 أو 32 ، حسب التطبيق المحدد) ، والتي ترتبط بمهمة معينة.
يمكن تعيين علامة الإشارة (أو عدة أعلام) بواسطة أي مهمة باستخدام العملية المنطقية "OR". يمكن قراءة العلم / العلامات فقط من خلال مهمة تحتوي على إشارة. عادة ما تكون عملية القراءة مدمرة ، أي يتم أيضًا إعادة تعيين الأعلام.
في بعض الأنظمة ، يتم تنفيذ الإشارات بطريقة أكثر تعقيدًا ، بحيث يتم تنفيذ وظيفة خاصة يعينها مالك المهمة للإشارة تلقائيًا عند تعيين أي إشارات إشارة. هذا يلغي الحاجة للمهمة للسيطرة على الأعلام نفسها. هذا يشبه إلى حد ما معالج المقاطعة.

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


تشبه مجموعات علامات الأحداث إشارات في أنها أداة موجهة قليلاً للتفاعل بين المهام. وبالمثل ، قد تحتوي على 8 أو 16 أو 32 بت. على عكس الإشارات ، فهي كائنات أساسية مستقلة ولا "تنتمي" إلى أي مهمة معينة. يمكن لأي مهمة تعيين علامات الأحداث وإعادة تعيينها باستخدام العمليات المنطقية "OR" و "AND". وبالمثل ، يمكن لأي مهمة التحقق من علامات الأحداث باستخدام نفس العمليات. في العديد من أنظمة RTOS ، يمكنك إجراء مكالمة API للحظر لمجموعة من علامات الأحداث. أي أنه يمكن تعليق المهمة حتى يتم تعيين مجموعة محددة من علامات الأحداث. قد يكون خيار "الاستهلاك" متاحًا أيضًا عند التحقق من إشارات الحدث ، والتي تعيد تعيين جميع العلامات.

الإشارات


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

يمكن لأي مهمة محاولة تعيين إشارة للوصول إلى المورد. إذا كانت القيمة الحالية للإشارة أكبر من 0 (الإشارة مجانية) ، يتم تقليل قيمة العداد بمقدار 1 ، وبالتالي ، سيتم التعيين بنجاح. في العديد من أنظمة التشغيل ، يمكن استخدام آلية قفل لتعيين إشارة. هذا يعني أن المهمة يمكن أن تكون في حالة انتظار حتى يتم تحرير إشارة المرور بمهمة أخرى. يمكن لأي مهمة تحرير الإشارة ، ثم ستزداد قيمة الإشارة.

صناديق البريد


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

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

تدعم بعض أنظمة RTOS وظيفة "البث". يسمح لك هذا بإرسال رسائل إلى جميع المهام التي تم إيقافها مؤقتًا أثناء قراءة صندوق بريد محدد.

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

قوائم الانتظار


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

يمكن لأي مهمة إرسال رسائل إلى قائمة الانتظار ، ويمكن تكرار ذلك حتى امتلاء قائمة الانتظار ، وبعد ذلك ستؤدي أي محاولة للإرسال إلى حدوث خطأ. عادةً ما يتم تحديد طول قائمة الانتظار من قبل المستخدم عند إنشاء أو تكوين النظام. في العديد من أنظمة RTOS ، يمكنك تطبيق آلية حظر على قائمة الانتظار. بمعنى ، إذا كانت قائمة الانتظار ممتلئة ، يمكن تعليق المهمة حتى تتم قراءة الرسالة في قائمة الانتظار بمهمة أخرى. يمكن لأي مهمة قراءة الرسائل من قائمة الانتظار. تتم قراءة الرسائل بنفس الترتيب الذي تم إرسالها به (First in - First out، FIFO). إذا حاولت مهمة القراءة من قائمة انتظار فارغة ، فستتلقى استجابة خطأ. في العديد من أنظمة RTOS ، يمكن استخدام آلية الحظر للقراءة من قائمة انتظار فارغة. بمعنى ، إذا كانت قائمة الانتظار فارغة ، يمكن تعليق المهمة حتى يتم إرسال الرسالة إلى قائمة الانتظار بواسطة مهمة أخرى.

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

بالإضافة إلى ذلك ، يمكن لـ RTOS دعم إرسال وقراءة الرسائل ذات الطول المتغير. وهذا يمنح المزيد من المرونة ، ولكنه يتطلب المزيد من النفقات العامة.

تدعم العديد من أنظمة RTOS نوعًا آخر من عناصر kernel ، وهو "الأنابيب". في جوهرها ، تشبه القناة قائمة الانتظار ، ولكنها تعالج البيانات الموجهة بالبايت.

وظيفة قوائم الانتظار ليست ذات أهمية ، ولكن يجب أن يكون مفهوما أن لديهم زيادة في الذاكرة ووقت التشغيل من صناديق البريد ، وذلك في المقام الأول لأنه من الضروري حفظ مؤشرين: بداية ونهاية قائمة الانتظار.

المزج


Mutexes (الإشارات الحصرية المتبادلة) هي كائنات نواة مستقلة تتصرف إلى حد كبير مثل الإشارات الثنائية العادية. إنها أكثر تعقيدًا قليلاً من الإشارات وتتضمن مفهوم الملكية المؤقتة (مورد يتم التحكم في الوصول إليه). إذا قامت إحدى المهام بتعيين كائن مزامنة ، فلن تتمكن سوى نفس المهمة من تحريرها مرة أخرى: ينتمي كائن المزامنة (وبالتالي المورد) إلى المهمة مؤقتًا.

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

عندما عملنا على نظام التشغيل OSRV MAX الخاص بنا (المقالات المنشورة سابقًا حوله) ، "وصل فريقنا" إلى مدونة Colin Walls ، الخبيرة في الإلكترونيات الدقيقة والبرامج الثابتة في Mentor Graphics. بدت المقالات مثيرة للاهتمام ، وترجمتها لأنفسهم ، لكن لكي لا "يكتبوا على الطاولة" قرروا نشرها. آمل أن تكون مفيدة لك أيضًا. إذا كان الأمر كذلك ، فنحن نخطط لنشر جميع المقالات المترجمة في السلسلة.

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

قراءة المقالات الأولى والثانية والثالثة والرابعة التي نشرت في وقت سابق.

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


All Articles