أكثر قليلاً عن تعدد المهام في ميكروكنترولر

في مقال سابق ، تحدثنا عن كيف ، وفقاً للمؤلف ، من الممكن برمجة الإجراءات المعتادة لمراقب متحكم في الوقت الفعلي ، وتقسيمها إلى عدة مهام مستقلة (أو مستقلة تقريبًا) عن بعضها البعض.


تم اختيار متحكم ، مع مجموعة أساسية من عائلة واسعة جدًا من ARM Cortex M.. من بين الخيارات المألوفة لدى الكثيرين ، وليس المؤلف فقط ، الأرقام ذات الأرقام 0،3،4 و 7 ، تم اختيار M4 ، لأنه كان في متناول اليد.


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


تم إعطاء مثال مجمّع لإظهار أنه لا يتم إنفاق أكثر من 80 دورة ساعة على التبديل. وبسرعة 72 ميجا هرتز ، يتضح أنه يزيد قليلاً عن 1 ميكروثانية. لذا ، فإن حجم علامة بحجم 50 ميكروثانية لن يكون باهظ الثمن. فقط 2 في المئة من النفقات العامة. لذلك ، كما قال أحد الشخصيات المفضلة للمؤلف ، "من المستحسن أن تعاني".


لذلك ، لدينا مهام N ، كل واحدة منها مضمونة لتشغيل قطعة (علامة T) من الوقت ومضمونة لتكرار هذا الجزء في موعد لا يتجاوز بعد (N-1) T علامات ، بالإضافة إلى تأخير لا يتجاوز D. هذا التأخير المزعج ، لحسن الحظ ، يقتصر على الحد الأقصى لحجم ممكن في الوقت ، وهو ما يساوي مجموع مدة تشغيل جميع المقاطعات المسموح بها. بمعنى آخر ، المهمة التي تحتوي على معظم الانقطاعات المحتملة لفترة معينة قبل علامة التجزئة التالية ستكون غير محظوظة. لفترة أطول ، لا يمكن تأجيل المهمة. ستحصل حتماً على فتحة وقتها في موعد لا يتجاوز (N-1) T + D microseconds. في رأيي ، وهذا ما يسمى الصعب في الوقت الحقيقي.


يجب أن تكمل المهام مهامها وأن تقدم تقريرا عن التنفيذ. من يجب عليّ الإبلاغ عنه؟ على ما يبدو ، هناك شخص ما مسؤول ، ويحدث ، كقاعدة عامة ، أنه أصغر بكثير من المرؤوسين (في الحقيقة ، استوفى المؤلف أيضًا بعض الاستثناءات عندما كان هناك أربعة رؤساء لثلاثة عمال بكلتا يديه اليسرى ، ولم يعرف منهم سوى كلمة واحدة واحترمها " كفاية ").


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


لكننا لا نستطيع الانتظار! بمعنى ، المهام. هم من الوقت الحقيقي الصعب. افترض أن مهمتين تقرأان القراءات مرة واحدة كل ثانية ، والثالثة يجب أن تقيس شيئًا كل 10 ميلي ثانية ، وتضعهما في كومة ، وترفع تقريرًا إلى الأعلى. ويقولون لها: "أخبرني ، لم ننته من الطهاة".


على ما يبدو ، عليك أن تدور ، بعبارة ملطفة ، ليست في الوقت الحقيقي تمامًا (الوقت الحقيقي الناعم).


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


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


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


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


على سبيل المثال ، دعونا نمتلك واجهة تسلسلية مزدوجة دون إقرار عند 115200 باود. على سبيل المثال ، RS422 في التكوين "الاقتصاد" سلكين - هناك ، اثنان - الظهر. قدرته حوالي 10000 بايت في الثانية. لنأخذ متوسط ​​حجم الرسالة لشخص يساوي 50 بايت. نحصل على 200 رسالة في الثانية أو رسالة واحدة في 5 ميلي ثانية. إذا كانت لدينا ثلاث مهام تريد توصيل شيء ما ، فدعهم يقومون بذلك كل 15 مللي ثانية لكل منهما. في المتوسط ​​، بالطبع. وإذا لم يكن ذلك في المتوسط ​​، فستكون هناك حاجة إلى حسابات إحصائية جادة أو تجربة واسعة النطاق. اختيار آخر واحد. بعد كل شيء ، تعلمنا اكتشاف الرسائل المفقودة وسنرى كل شيء على شاشة المحاكي الطرفي.
لذلك ، دع المهام الثلاث تنشئ رسائل فردية. دع الرسائل تختلف في أهمية المحتوى أو إلحاحه ، ومهامنا تضعها في المخزن المؤقت المناسب. قم بتخصيص هذه المخازن المؤقتة الثلاثة للحلقات لثلاثة مستويات من الإلحاح كما هو موضح في الشكل 1.



المهمة الرابعة تختار من هذه المخازن المؤقتة رسالة وفقًا لخطتنا المعتمدة وتحاول تسليمها. إذا لم يكن الإرسال ممكنًا بعد ، فإن المهمة الرابعة تقدر مقدار ما يمكنها النوم وفعله. بعد النوم ، لديها بالفعل المساحة اللازمة في المخزن المؤقت الحلقي لإرسالها.


المخازن المؤقتة ذات الإلحاحية المختلفة ، بالطبع ، لا تخزن الرسائل نفسها ، ولكن عناوينها (روابط). في الوقت نفسه ، لا تحتاج المهام نفسها إلى الانتظار على الإطلاق. حسنا؟ لا ، ليس حقا. هذا لا يعمل ، وهنا السبب. كل من هذه المخازن المؤقتة الحلقة الثلاثة مورد مشترك. تخيل المهمة 1 كانت على وشك وضع عنوان في مخزن مؤقت الأوسط. تقرأ الكلمة ، وتتحقق من أن المكان فارغ ، أي أن القيمة تساوي صفرًا (وفي هذه اللحظة يتم استبدالها بمهمة أخرى 2 ، والتي تريد أن تفعل الشيء نفسه بالضبط وتنجح) ، المهمة الأولى ، وهي العودة ، تضع الكلمة هناك ، وتكتب فوق كل شيء نجحت الثانية. هنا زميل يسأل عن الكلمات. يبدو أنني أعرف ما سيقوله.
- نعم ، كل شيء بسيط للغاية ، يمكنك حظر الانقطاعات طوال فترة الاختبار ولن يحدث أي شيء سيء ، فهذا ليس لفترة طويلة.
- صحيح ، ليس لفترة طويلة ، ولكن كم مرة؟ كم من الوقت سنأخذ المهمة؟ وأي منهم؟ لقد نسيت أن أحذر ، ولم نمنع أبدًا المقاطعات ، إن طوائفنا القاسية من الزمن الحقيقي تمنعنا من القيام بذلك.
- وإذا لم تحظر الانقطاع ، فيمكنك أن تطلب من مفتاح المهمة وضع عنوان الرسالة هناك. يمكنه أن يفعل ذلك ذريًا.
- نعم ، ربما ، لكن بعد ذلك أريد أن أسأله عن شيء آخر ، ثم عن شيء آخر. ولماذا إذن حققنا 72 درجة ، ثم لتخفيف كل شيء بالماء؟ آسف ، قصدته 72 دورة لتبديل السياق.
دعنا نحاول القيام بذلك أسهل ، كما في الشكل 2.



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


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


أتوقع اقتراح الترشيد: "دع المقاطعة من المنفذ التسلسلي (UART) نفسها تشارك في المهمة 4 التي تقوم بها الآن ، سيكون هناك وفورات". يمكنك القيام بذلك ، لكنني لا أعتقد أنه جيد. سأحاول التوضيح. في الواقع ، يمكن للمهام الموجودة على اليسار تنشيط إجراء مقاطعة UART ، وسيبدأ العمل ولن يتوقف حتى يفعل كل شيء. يجب أن يقوم إجراء المقاطعة الآن بكل ما تستخدمه هذه المهمة 4. سوف ينتفخ الوقت المستغرق في معالجة المقاطعة ، ولن تتمكن مهمة واحدة من تشغيلها حتى ينتهي "التخزين المؤقت" التالي. وماذا نقول لرفاقنا من دائرة الوقت الحقيقي المستمرة؟ ولكن قيل لنا أن الاستجابة لأي مقاطعة خارجية يجب أن تكون قصيرة قدر الإمكان. هذه مجرد نغمة جيدة. أو بعبارة أخرى: من الضروري عمل الخير والسيئة وبدونك ستنجح.


يوضح الشكل 3 ماهية العملية والتحديات الموجودة.



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


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


بالنسبة للذاكرة المخزنة ، ومن الذي وضعه بشكل عام على SPI؟ هل هناك SPI الثاني؟ وليس متوقعا؟ في أي مكان تذهب إليه ، يجب القيام بشيء ما. أعد توجيه الأسهم في الاتجاه المعاكس في الشكل 2 وابدأ التفكير.


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



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



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


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


حسنًا ، يبقى الآن العثور على شيء مناسب من الحديد والتجربة كما ينبغي. هذه ، في اعتقادي ، ستكون القصة التالية.

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


All Articles