الحقيقة كاملة حول RTOS. المادة رقم 29. انقطاع في نواة SE

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



المقالات السابقة في السلسلة:
المادة رقم 28. توقيت البرمجيات
المادة رقم 27. وقت النظام
المادة رقم 26. القنوات: الخدمات المساعدة وهياكل البيانات
المادة رقم 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: مقدمة.

المقاطعات العادية والتي تسيطر عليها


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

باستخدام وحدات الماكرو I / O ، يمكن استخدام معالج المقاطعة Nucleus SE في الوضع القياسي أو المدار.

المقاطعات الموظفين


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

لإنشاء معالج مقاطعة منتظم في Nucleus SE ، يكفي كتابة معالج مقاطعة عادي ، بما في ذلك استدعاء الماكرو NUSE_NISR_Enter () في البداية واستدعاء NUSE_NISR_Exit () في النهاية. يتم تعريف وحدات الماكرو هذه في ملف nuse_types. h وتعيين المتغير العمومي NUSE_Task_State إلى NUSE_NISR_CONTEXT .

المقاطعات الموجهة


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

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

اعتمد المقاطعة المُدارة باستخدام ماكرو NUSE_MANAGED_ISR () الموصوف في nuse_types.h . ينشئ هذا الماكرو دالة تحتوي على الإجراءات التالية:

  • الحفاظ على سياق المهمة ؛
  • تعيين NUSE_Task_State إلى NUSE_MISR_CONTEXT ؛
  • رمز دالة معالج المقاطعة الذي يوفره المستخدم ؛
  • استعادة NUSE_Task_State إلى حالتها السابقة ؛
  • استعادة سياق المهمة.

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

استدعاءات API من معالج المقاطعة


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

يستدعي API معالج المقاطعة القياسي عند استخدام جدولة الأولوية

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

يُسمح دائمًا بمكالمات واجهة برمجة التطبيقات التالية:

NUSE_Task_Current() NUSE_Task_Check_Stack() NUSE_Task_Information() NUSE_Task_Count() NUSE_Partition_Pool_Information() NUSE_Partition_Pool_Count() NUSE_Mailbox_Information() NUSE_Mailbox_Count() NUSE_Queue_Information() NUSE_Queue_Count() NUSE_Pipe_Information() NUSE_Pipe_Count() NUSE_Semaphore_Information() NUSE_Semaphore_Count() NUSE_Event_Group_Information() NUSE_Event_Group_Count() NUSE_Signals_Send() NUSE_Timer_Control() NUSE_Timer_Get_Remaining() NUSE_Timer_Reset() NUSE_Timer_Information() NUSE_Timer_Count() NUSE_Clock_Set() NUSE_Clock_Retrieve() NUSE_Release_Information() 

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

إذا تم تعطيل القفل ، أي أنه لا يمكن وضع المهام في حالة جاهزة من خلال العديد من مكالمات واجهة برمجة التطبيقات ، تصبح مكالمات API الإضافية متاحة:

 NUSE_Partition_Allocate() NUSE_Partition_Deallocate() NUSE_Mailbox_Send() NUSE_Mailbox_Receive() NUSE_Mailbox_Reset() NUSE_Queue_Send() NUSE_Queue_Receive() NUSE_Queue_Jam() NUSE_Queue_Reset() NUSE_Pipe_Send() NUSE_Pipe_Receive() NUSE_Pipe_Jam() NUSE_Pipe_Reset() NUSE_Semaphore_Obtain() NUSE_Semaphore_Release() NUSE_Semaphore_Reset() NUSE_Event_Group_Set() NUSE_Event_Group_Retrieve() 

لا يمكن الوصول دائمًا إلى بعض مكالمات واجهة برمجة التطبيقات لمعالجات المقاطعة القياسية ، حيث إنها ستحتاج حتماً إلى عمل مجدول:
 NUSE_Task_Suspend() NUSE_Task_Resume() NUSE_Task_Sleep() NUSE_Task_Relinquish() NUSE_Task_Reset() NUSE_Signals_Receive() 

تستدعي API معالج المقاطعة المدار أو معالج المقاطعة القياسي عند استخدام أي برنامج جدولة بخلاف برنامج جدولة الأولوية

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

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

بمعنى آخر ، يجب إجراء هذه المكالمات باستخدام خيار الإيقاف المؤقت NUSE_NO_SUSPEND .

مع وضع ذلك في الاعتبار ، يمكن استخدام مكالمات API التالية:

 NUSE_Task_Current() NUSE_Task_Check_Stack() NUSE_Task_Information() NUSE_Task_Count() NUSE_Task_Suspend() NUSE_Task_Resume() NUSE_Task_Reset() NUSE_Partition_Allocate() NUSE_Partition_Deallocate() NUSE_Partition_Pool_Information() NUSE_Partition_Pool_Count() NUSE_Mailbox_Send() NUSE_Mailbox_Receive() NUSE_Mailbox_Reset() NUSE_Mailbox_Information() NUSE_Mailbox_Count() NUSE_Queue_Send() NUSE_Queue_Receive() NUSE_Queue_Jam() NUSE_Queue_Reset() NUSE_Queue_Information() NUSE_Queue_Count() NUSE_Pipe_Send() NUSE_Pipe_Receive() NUSE_Pipe_Jam() NUSE_Pipe_Reset() NUSE_Pipe_Information() NUSE_Pipe_Count() NUSE_Semaphore_Obtain() NUSE_Semaphore_Release() NUSE_Semaphore_Reset() NUSE_Semaphore_Information() NUSE_Semaphore_Count() NUSE_Event_Group_Set() NUSE_Event_Group_Retrieve() NUSE_Event_Group_Information() NUSE_Event_Group_Count() NUSE_Signals_Send() NUSE_Timer_Control() NUSE_Timer_Get_Remaining() NUSE_Timer_Reset() NUSE_Timer_Information() NUSE_Timer_Count() NUSE_Clock_Set() NUSE_Clock_Retrieve() NUSE_Release_Information() 

يتم حظر بعض المكالمات دائمًا ، لأنها تتعلق مباشرة بالمهمة الحالية:
 NUSE_Task_Relinquish() NUSE_Signals_Receive() NUSE_Task_Sleep() 

الوقت الحقيقي على مدار الساعة المقاطعة معالج


تعتبر معالج المقاطعة Real Time Clock (RTC) هو معالج المقاطعة الكامل الوحيد في Nucleus SE. بالإضافة إلى توفير جميع الوظائف اللازمة لإدارة الوقت في Nucleus SE ، فهو أيضًا مثال على كتابة معالج المقاطعة المدار.

عمليات معالج المقاطعة RTC


تم سرد الوظائف التي يوفرها معالج المقاطعة RTC في واحدة من المقالات السابقة ، والتي تعاملت مع موضوع واسع من وقت النظام في Nucleus SE ( # 27 ). الوظيفة الموصوفة اختيارية حسب تكوين التطبيق.

التالي هو رمز معالج المقاطعة RTC الكامل.
 #if NUSE_TIMER_NUMBER != 0 { U8 timer; for (timer=0; timer<NUSE_TIMER_NUMBER; timer++) { if (NUSE_Timer_Status[timer]) { if (--NUSE_Timer_Value[timer] == 0) { NUSE_Timer_Expirations_Counter[timer]++; #if NUSE_TIMER_EXPIRATION_ROUTINE_SUPPORT || NUSE_INCLUDE_EVERYTHING if (NUSE_Timer_Expiration_Routine_Address[timer] != NULL) { ((PF1)NUSE_Timer_Expiration_Routine_Address[timer]) NUSE_Timer_Expiration_Routine_Parameter[timer]); } #endif /* reschedule? */ if (NUSE_Timer_Reschedule_Time[timer] != 0) { /* yes: set up time */ NUSE_Timer_Value[timer] = NUSE_Timer_Reschedule_Time[timer]; } else { /* no: disable */ NUSE_Timer_Status[timer] = FALSE; } } } } } #endif #if NUSE_SYSTEM_TIME_SUPPORT || NUSE_INCLUDE_EVERYTHING NUSE_Tick_Clock++; #endif #if NUSE_TASK_SLEEP || NUSE_INCLUDE_EVERYTHING { U8 task; for (task=0; task<NUSE_TASK_NUMBER; task++) { if (NUSE_Task_Timeout_Counter[task] != 0) { NUSE_Task_Timeout_Counter[task]--; if (NUSE_Task_Timeout_Counter[task] == 0) { NUSE_Wake_Task(task); } } } } #endif #if NUSE_SCHEDULER_TYPE == NUSE_TIME_SLICE_SCHEDULER if (--NUSE_Time_Slice_Ticks == 0) { NUSE_Reschedule(); } #endif 


بعد ذلك ، ننظر إلى أربعة مجالات رئيسية من وظائف معالج المقاطعة RTC.

مؤقتات (مؤقتات)
إذا تم تكوين أجهزة ضبط الوقت للتطبيق ، ينتقل معالج المقاطعة إلى حلقة لمعالجة كل مؤقت من خلال تقليل عداده بمقدار 1. إذا كان المؤقت ينهي العد (بمعنى أن العداد يصل إلى 0) ، يكون هناك إجراءان ممكنان:

  • إذا تم تكوين معالج إكمال المؤقت وكان المؤقت يحتوي على مؤشر دالة (غير NULL ) صحيح (في NUSE_Timer_Expiration_Routine_Address [] ) ، يتم تنفيذ المعالج عن طريق أخذ معلمة من NUSE_Timer_Expiration_Routine_Parameter [] ؛
  • إذا تم تكوين المؤقت لتهيئة بعد الانتهاء (أي ، NUSE_Timer_Reschedule_Time [] له قيمة غير صفرية) ، يتم إعادة تحميل المؤقت مع هذه القيمة.

تم وصف توقيت التطبيق بالتفصيل في مقالة سابقة (رقم 28).

ساعة النظام
إذا تم تكوين جهاز ضبط وقت النظام ، فستزيد قيمة NUSE_Tick_Cloc k ببساطة بمقدار 1. ويمكن العثور على مزيد من المعلومات في المقالة رقم 28.

تعليق مهمة (مهمة السكون)
إذا تم تمكين دعم الإيقاف المؤقت للمهام (أي ، تم تكوين استدعاء واجهة برمجة التطبيقات NUSE_Task_Sleep () ) ، يتم تحديد عداد مهلة كل مهمة (القيمة في NUSE_Task_Timeout_Counter [] ) ، وإذا كانت غير مساوية للصفر ، فسوف تنخفض بمقدار 1. إذا وصلت إلى الصفر .

شريحة الوقت الجدولة
إذا تم استخدام جدولة Time Slice ، فسيتم تقليل عداد المجدول ( NUSE_Time_Slice_Ticks ). إذا وصل إلى الصفر ، يتم استدعاء المجدول. الدعوة إلى NUSE_Reschedule () هي المسؤولة عن إعادة تعيين العداد.

انقطاع السيطرة


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

  • إذا تم استخدام أجهزة ضبط الوقت وتم تكوين معالجات لإكمالها ، حيث يمكن لهذه المعالجات إجراء مكالمات API (من سياق المقاطعة) ، مما سيؤدي إلى جدولة جديدة. لديهم نفس القيود مثل مكالمات API التي تم إجراؤها من معالجات المقاطعة (راجع سابقًا في هذه المقالة) ؛
  • إذا تم استخدام جدولة الأولوية ، فقد يتطلب إكمال تعليق مهمة الاستيقاظ من مهمة ذات أولوية أعلى ؛
  • إذا تم استخدام جدولة Time Slice ، فسيتم استدعاؤها من معالج المقاطعة RTC ، لذلك ، يلزم وجود مقاطعة مسيطر عليها.

نواة RTOS متوافق


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

معالجات المقاطعة ذات المستوى المنخفض والعالي


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

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

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

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

نواة RTOS API فائدة يدعو للانقطاع


يحتوي Nucleus RTOS على العديد من مكالمات API لدعم المقاطعات. لم يتم تنفيذ أي منها في Nucleus SE.

بالنسبة إلى المقاطعات القياسية ، توفر مكالمات API الوظائف التالية:

  • التحكم (التنشيط / التعطيل) للانقطاع (محليا وعالميا) ؛
  • وضع متجه المقاطعة.

بالنسبة إلى المقاطعات ذات المستوى المنخفض:

  • تسجيل معالج مقاطعة منخفض المستوى في kernel.

بالنسبة إلى المقاطعات عالية المستوى:

  • إنشاء / إزالة الانقطاعات عالية المستوى ؛
  • تفعيل المقاطعة على مستوى عال.
  • الحصول على عدد المقاطعات عالية المستوى في التطبيق (في الوقت الحالي) ؛
  • الحصول على مؤشرات للتحكم في وحدات جميع المقاطعات عالية المستوى ؛
  • الحصول على مؤشرات للتحكم في وحدات المقاطعة الحالية عالية المستوى ؛
  • الحصول على معلومات المقاطعة عالية المستوى.

مراقبة المقاطعة العالمية

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

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

 INT NU_Control_Interrupts (INT new_level); 

خيارات:

new_level - مستوى مقاطعة جديد للنظام. يمكن أن يأخذ دائمًا القيم NU_DISABLE_INTERRUPTS (إلغاء تنشيط جميع المقاطعات) و NU_ENABLE_INTERRUPTS (ينشط جميع المقاطعات). قد تكون القيم الأخرى المتاحة اعتمادا على الهندسة المعمارية.

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

تقوم مكالمة الخدمة هذه بإرجاع المستوى السابق من المقاطعات التي تم تنشيطها.

مراقبة المقاطعة المحلية

تسمح لك مكالمة الخدمة هذه بتنشيط المقاطعات أو إلغاء تنشيطها حسب المهمة. هذه المكالمة تغيير سجل الحالة إلى القيمة المحددة. سيتم إرجاع سجل الحالة إلى القيمة المحددة بواسطة آخر مكالمة إلى NU_Control_Interrupts () في المرة التالية التي يتم فيها تغيير السياق.

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

 INT NU_Local_Control_Interrupts (INT new_level); 

خيارات:

new_level - مستوى مقاطعة جديد للمهمة الحالية. يمكن أن يأخذ دائمًا القيم NU_DISABLE_INTERRUPTS (إلغاء تنشيط جميع المقاطعات) و NU_ENABLE_INTERRUPTS (ينشط جميع المقاطعات). قد تكون القيم الأخرى المتاحة اعتمادا على الهندسة المعمارية.

قيمة الإرجاع:
تقوم مكالمة الخدمة هذه بإرجاع المستوى السابق من المقاطعات التي تم تنشيطها.

تحديد متجه المقاطعة

يستبدل هذا الحمل المتجه المقاطعة المحدد بواسطة المتجه التي يتحكم فيها معالج المقاطعة.

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

 VOID *NU_Setup_Vector (INT vector, VOID *new); 

خيارات:

vector - ناقل المقاطعة الذي سيتم تسجيل المقاطعة به ؛
الجديد هو معالج المقاطعة المكتوب للمتجه.

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

إرجاع استدعاء الأداة المساعدة هذا مؤشر إلى معالج المقاطعة المسجلة مسبقاً من أجل ناقل المقاطعة.

انخفاض مستوى المقاطعة تسجيل

يستدعي هذا الحمل دالة معالج المقاطعة ذات المستوى المنخفض مع ناقل المقاطعة. يتم حفظ سياق النظام تلقائيًا قبل استدعاء معالج المقاطعة ذي المستوى المنخفض المحدد واستعادته بعد اكتمال معالج المقاطعة.

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

 STATUS NU_Register_LISR (INT vector, VOID (*lisr_entry) (INT), VOID (**old_lisr) (INT); 

خيارات:

vector - ناقل المقاطعة الذي سيتم تسجيل المقاطعة به ؛
lisr_entry - الوظيفة التي سيتم تسجيلها للمتجه ، القيمة NU_NULL ستقوم بمسح المتجه ؛
old_lisr هي وظيفة مسجلة مسبقًا للناقل المحدد.

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

NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_VECTOR - متجه غير صالح ؛
NU_NOT_Rector - في الوقت الحالي ، لم يتم تسجيل المتجه ، حيث تم إلغاء التسجيل في l isr_entry ؛
NO_MORE_LISRS - تم الوصول إلى الحد الأقصى لعدد معالجات المقاطعة منخفضة المستوى المسجلة.

إنشاء معالج مقاطعة رفيع المستوى
استدعاء الأداة المساعدة هذه بإنشاء معالج مقاطعة رفيع المستوى.

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

 STATUS NU_Create_HISR (NU_HISR *hisr, CHAR *name, VOID (*hisr_entry) (VOID), OPTION priority, VOID *stack_pointer, UNSIGNED stack_size); 

خيارات:

hisr - مؤشر إلى كتلة تحكم يوفرها المستخدم لمعالج مقاطعة عالي المستوى ؛
name - مؤشر إلى اسم مكون من 7 أحرف لمعالج مقاطعة عالي المستوى بصفر إنهاء ؛
hisr_entry - نقطة إدخال وظيفة معالج المقاطعة عالية المستوى ؛
الأولوية - هناك ثلاث أولويات لمعالجات المقاطعة عالية المستوى (0-2) ؛ الأولوية 0 هي الأعلى ؛
stack_pointer - مؤشر إلى منطقة مكدس معالج المقاطعة عالية المستوى؛
stack_size - عدد البايتات في مكدس معالج المقاطعة عالي المستوى.

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

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

إزالة معالج المقاطعة رفيع المستوى
استدعاء الأداة المساعدة هذه يزيل معالج المقاطعة رفيع المستوى تم إنشاؤه مسبقًا.

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

 STATUS NU_Delete_HISR (NU_HISR *hisr); 

خيارات:

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

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

NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_HISR - مؤشر غير صالح إلى معالج مقاطعة رفيع المستوى.

تنشيط معالج المقاطعة رفيع المستوى

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

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

 STATUS NU_Activate_HISR (NU_HISR *hisr); 

خيارات:

hisr هو مؤشر إلى كتلة التحكم من معالج المقاطعة رفيع المستوى.
قيمة الإرجاع:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_HISR - مؤشر غير صالح إلى وحدة التحكم في معالج مقاطعة عالي المستوى.

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

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

 UNSIGNED NU_Established_HISRs(VOID); 

خيارات:
غائب.

قيمة الإرجاع:
إرجاع استدعاء الأداة المساعدة هذا عدد معالجات المقاطعة رفيعة المستوى المثبتة في النظام.

الحصول على مؤشرات للتحكم في كتل معالجات المقاطعة عالية المستوى

تشكل مكالمة الخدمة هذه قائمة متتابعة من المؤشرات لجميع معالجات المقاطعة عالية المستوى المثبتة في النظام.

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

 UNSIGNED NU_HISR_Pointers(NU_HISR **pointer_list, UNSIGNED maximum_pointers); 

خيارات:

pointer_list - مؤشر إلى مجموعة من المؤشرات NU_HISR ؛ سيتم تعبئة هذا الصفيف مع مؤشرات إلى معالجات المقاطعة عالية المستوى المثبتة في النظام ؛
maximum_pointers - الحد الأقصى لعدد مؤشرات NU_HISR التي يمكن وضعها في الصفيف ؛ عادة ما يكون مساويًا لحجم صفيف pointer_list .

قيمة الإرجاع:
إرجاع استدعاء الأداة المساعدة هذه عدد معالجات المقاطعة النشطة عالية المستوى في النظام.

الحصول على مؤشر إلى معالج المقاطعة عالي المستوى الحالي
إرجاع استدعاء الأداة المساعدة هذا مؤشر إلى معالج المقاطعة رفيع المستوى تنفيذ حاليًا.

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

 NU_HISR *NU_Current_HISR_Pointer(VOID); 

خيارات:
غائب.

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

الحصول على معلومات حول معالج المقاطعة رفيع المستوى
إرجاع استدعاء الأداة المساعدة هذه معلومات مختلفة حول معالج المقاطعة رفيع المستوى المحدد.

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

 STATUS NU_HISR_Information(NU_HISR *hisr, char *name, UNSIGNED *scheduled_count, DATA_ELEMENT *priority, VOID **stack_base, UNSIGNED *stack_size, UNSIGNED *minimum_stack); 

خيارات:

hisr - مؤشر إلى معالج مقاطعة رفيع المستوى ؛
name - مؤشر إلى منطقة ذات 8 أحرف لاسم معالج المقاطعة عالي المستوى ، بما في ذلك صفر الإنهاء ؛
Schedule_count - مؤشر إلى متغير لعدد إجمالي مرات جدولة معالج المقاطعة رفيع المستوى هذا ؛
الأولوية - مؤشر إلى متغير لتخزين أولوية معالج المقاطعة رفيع المستوى ؛
stack_base - مؤشر إلى مؤشر لتخزين المؤشر الأصلي إلى المكدس؛ هذا هو نفس المؤشر الذي تم تمريره عند إنشاء معالج المقاطعة رفيع المستوى ؛
stack_size - مؤشر إلى متغير لتخزين إجمالي حجم الرصة لمعالج المقاطعة عالي المستوى ؛
minimal_stack - مؤشر إلى متغير لتخزين الحد الأدنى لمساحة المكدس المتاحة المكتشفة أثناء تنفيذ معالج المقاطعة عالي المستوى.

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

NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_HISR - مؤشر غير صالح إلى معالج مقاطعة رفيع المستوى.

استدعاءات API من معالجات المقاطعة


استدعاء API من معالجات المقاطعة ذات المستوى المنخفض
لا يمكن لمعالج المقاطعة ذي المستوى المنخفض استخدام ميزات Nucleus RTOS التالية:

 NU_Activate_HISR() NU_Local_Control_Interrupts() NU_Current_HISR_Pointer() NU_Current_Task_Pointer() NU_Retrieve_Clock() 

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

ستغطي المقالة التالية في هذه السلسلة إجراءات التهيئة وبدء التشغيل الخاصة بـ Nucleus SE.

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

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


All Articles