
تستمر هذه المقالة في مراجعة الإشارات.
خدمات الإشارة المساعدة
يحتوي Nucleus RTOS على أربع مكالمات API توفر وظائف مرتبطة بالسيمة: إعادة تعيين الإشارة ، واسترداد معلومات الإشارة ، واسترداد عدد الإشارات في التطبيق ، واسترداد المؤشرات إلى جميع الإشارات في التطبيق. يتم تنفيذ الثلاثة الأولى منها في Nucleus SE.
المقالات السابقة في السلسلة:
المادة رقم 19. الإشارات: المقدمة والخدمات الأساسيةالمادة رقم 18. مجموعات علامات الأحداث: خدمات المساعدة وهياكل البياناتالمادة رقم 17. مجموعات علامة الحدث: المقدمة والخدمات الأساسيةالمادة رقم 16. الإشاراتالمادة رقم 15. أقسام الذاكرة: الخدمات وهياكل البياناتالمادة رقم 14. أقسام الذاكرة: المقدمة والخدمات الأساسيةالمادة رقم 13. هياكل بيانات المهام ومكالمات API غير مدعومةالمادة رقم 12. خدمات للعمل مع المهامالمادة رقم 11. المهام: التكوين والمقدمة لواجهة برمجة التطبيقاتالمادة رقم 10. المجدول: الميزات المتقدمة والحفاظ على السياقالمادة رقم 9. المجدول: التنفيذالمادة رقم 8. Nucleus SE: التصميم الداخلي والنشرالمادة رقم 7. Nucleus SE: مقدمةالمادة رقم 6. خدمات RTOS الأخرىالمادة رقم 5. تفاعل المهام والمزامنةالمادة رقم 4. المهام وتبديل السياق والمقاطعاتالمادة رقم 3. المهام والتخطيطالمادة رقم 2. RTOS: البنية ووضع الوقت الحقيقي
المادة رقم 1. RTOS: مقدمة.
إعادة تعيين إشارة
يعيد استدعاء API هذا الإشارة إلى حالتها الأولية غير المستخدمة. وظيفة API هذه غير عادية بالمقارنة مع وظائف كائنات kernel الأخرى ، لأنه على الرغم من حقيقة أنها تقوم بإعادة تعيين ، فإنها لا تقوم فقط بتعيين العداد إلى القيمة الأولية ، ولكن يتم تمرير قيمة عداد أولية جديدة في المكالمة. يتم استئناف أي مهمة تم إيقافها مؤقتًا في إشارة
المرور وإرجاع رمز
NUSE_SEMAPHORE_WAS_RESET في Nucleus SE وفي Nucleus RTOS و
NU_SEMAPHORE_RESET .
استدعاء لإعادة الإشارة في Nucleus RTOSالنموذج الأولي لمكالمة الخدمة:
STATUS NU_Reset_Semaphore (إشارة NU_SEMAPHORE * ، غير مبدئي_عدد) ؛معلمات:
إشارة الإشارة - مؤشر إلى كتلة تحكم الإشارة التي يوفرها المستخدم ؛
الأولية_القيمة - القيمة التي سيتم تعيين إشارة الإشارة إليها.
القيمة المعادة:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_SEMAPHORE - مؤشر إشارة
غير صالح .
استدعاء لإعادة إشارة في Nucleus SEيدعم اتصال API هذا الوظائف الأساسية لـ Nucleus RTOS API.
النموذج الأولي لمكالمة الخدمة:
STATUS NUSE_Semaphore_Reset (إشارة NUSE_SEMAPHORE ، U8 الأولية_count) ؛معلمات:
إشارة - فهرس (معرف) إشارة التفريغ ؛
الأولية_القيمة - القيمة التي سيتم تعيين إشارة الإشارة إليها.
القيمة المعادة:
NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_SEMAPHORE - فهرس إشارة غير صالح.
تنفيذ إعادة ضبط الإشارة في Nucleus SEتتمثل المهمة الرئيسية
لوظيفة NUSE_Semaphore_Reset () API في تعيين عنصر
NUSE_Semaphore_Counter [] المقابل على القيمة المحددة (بعد التحقق من المعلمات).
إذا تم تنشيط تأمين المهام ، فسيكون الرمز التالي مطلوبًا لإلغاء تأمين المهام:
while (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; /* check whether any tasks are blocked */ /* on this semaphore */ for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { NUSE_Task_Blocking_Return[index] = NUSE_SEMAPHORE_WAS_RESET; NUSE_Task_Status[index] = NUSE_READY; break; } } NUSE_Semaphore_Blocking_Count[semaphore]--; } #if NUSE_SCHEDULER_TYPE == NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif
يتم وضع علامة "منتهية" على كل مهمة معلقة في الإشارة ، ويؤدي رمز تعليق المهمة إلى إرجاع
NUSE_SEMAPHORE_WAS_RESET . بعد اكتمال هذه العملية ، إذا تم استخدام جدولة الأولوية ، يقوم الاستدعاء بتهيئة
NUSE_Reschedule () ، لأن مهمة أو أكثر ذات أولوية أعلى يمكن أن تنتقل إلى حالة جاهزة وتنتظر الاستئناف.
معلومات الإشارة
إرجاع استدعاء الأداة المساعدة هذه معلومات إشارة. يختلف تنفيذ هذه المكالمة في Nucleus SE عن Nucleus RTOS حيث يتم إرجاع معلومات أقل ، لأن تسمية الكائن وترتيب الإيقاف المؤقت غير مدعومين ، ويمكن تعطيل تعليق المهمة نفسه.
اتصل للحصول على معلومات الإشارة في Nucleus RTOSالنموذج الأولي لمكالمة الخدمة:
STATUS NU_Semaphore_Information (NU_SEMAPHORE * إشارة ، CHAR * الاسم ، UNSIGNED * current_count ، OPTION * suspend_type ، UNSIGNED * task_waiting ، NU_TASK ** first_task) ؛معلمات:
إشارة - مؤشر إلى كتلة تحكم إشارة حول المعلومات المطلوبة ؛
name - مؤشر
لاسم 8 حروف من إشارة الإشارة ، مع تضمين صفر بايت بايت في هذه المنطقة ؛
current_count - مؤشر إلى متغير يأخذ القيمة الحالية لعداد الإشارة ؛
suspend_type - مؤشر لمتغير يقبل نوع مهمة الإيقاف ، ويمكن أن يأخذ القيم
NU_FIFO و
NU_PRIORITY ؛
task_waiting - مؤشر للمتغير الذي سيأخذ عدد المهام المعلقة في الإشارة ؛
first_task - مؤشر إلى متغير من النوع
NU_TASK ، والذي سينقل المؤشر إلى وحدة التحكم في المهمة المعلقة الأولى.
القيمة المعادة:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_SEMAPHORE - مؤشر إشارة
غير صالح .
اتصل للحصول على معلومات الإشارة في Nucleus SEيدعم اتصال API هذا الوظائف الأساسية لـ Nucleus RTOS API.
النموذج الأولي لمكالمة الخدمة:
STATUS NUSE_Semaphore_Information (إشارة NUSE_SEMAPHORE ، U8 * current_count ، U8 * task_waiting ، NUSE_TASK * first_task) ؛معلمات:
إشارة - فهرس إشارة حول المعلومات المطلوب تقديمها ؛
current_count - مؤشر إلى متغير يأخذ القيمة الحالية لعداد الإشارة ؛
task_waiting - مؤشر إلى متغير يأخذ عدد المهام المعلقة في هذه الإشارة (لا يتم إرجاع أي شيء إذا تم تعطيل دعم تعليق المهام) ؛
first_task - مؤشر إلى متغير من النوع
NUSE_TASK ، والذي سيأخذ فهرس أول مهمة متوقفة مؤقتًا (لا يتم إرجاع أي شيء إذا تم تعطيل دعم إيقاف المهام مؤقتًا)
القيمة المعادة:
NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_SEMAPHORE - فهرس إشارة غير صالح ؛
NUSE_INVALID_POINTER - معلمة مؤشر أو أكثر غير صحيحة.
تنفيذ معلومات الإشارة في Nucleus SEتنفيذ استدعاء API هذا بسيط جدًا:
NUSE_CS_Enter(); *current_count = NUSE_Semaphore_Counter[semaphore]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Semaphore_Blocking_Count[semaphore]; if (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif NUSE_CS_Exit(); return NUSE_SUCCESS;
تقوم الدالة بإرجاع حالة الإشارة. بعد ذلك ، إذا تم تنشيط وظيفة حظر مكالمة واجهة برمجة التطبيقات ، فسيتم إرجاع عدد المهام المعلقة وفهرس المهمة الأولى (وإلا ، يتم تعيين هذه المعلمات إلى 0).
الحصول على عدد الإشارات
إرجاع استدعاء الأداة المساعدة هذا عدد الإشارات في التطبيق. في Nucleus RTOS ، تتغير هذه القيمة بمرور الوقت وتتوافق قيمة الإرجاع مع العدد الحالي من الإشارات ، وفي Nucleus SE ، يتم تعيين القيمة المرتجعة في مرحلة التجميع ولا تتغير بعد الآن.
استدعاء عداد إشارة في Nucleus RTOSالنموذج الأولي لمكالمة الخدمة:
NU_Eststited_Semaphores (VOID) غير الموقعة ؛معلمات:
غائبون.
القيمة المعادة:
عدد الإشارات التي تم إنشاؤها في التطبيق.
استدعاء عداد إشارة في Nucleus SEيدعم اتصال API هذا الوظائف الأساسية لـ Nucleus RTOS API.
النموذج الأولي لمكالمة الخدمة:
U8 NUSE_Semaphore_Count (باطل) ؛معلمات:
غائبون.
القيمة المعادة:
عدد الإشارات التي تم تكوينها في التطبيق.
تنفيذ عدادات الإشارة في Nucleus SEتنفيذ استدعاء API هذا بسيط للغاية: تم
إرجاع قيمة
#define NUSE_SEMAPHORE_NUMBER الرمز.
هياكل البيانات
تستخدم الإشارات صفين أو ثلاثة من صفيفات هياكل البيانات (في ذاكرة الوصول العشوائي وذاكرة القراءة فقط) ، والتي ، مثل جميع كائنات Nucleus SE الأخرى ، هي مجموعة من الجداول التي يعتمد حجمها على عدد الإشارات في التطبيق والمعلمات المحددة.
أوصي بشدة ألا يستخدم رمز التطبيق الوصول المباشر إلى هياكل البيانات هذه ، ولكنه يشير إليها من خلال وظائف واجهة برمجة التطبيقات المتوفرة. سيؤدي ذلك إلى تجنب عدم التوافق مع الإصدارات المستقبلية من Nucleus SE والآثار الجانبية غير المرغوب فيها ، فضلاً عن تبسيط نقل التطبيق إلى Nucleus RTOS. لفهم أفضل لكيفية عمل رمز مكالمة الخدمة وللتصحيح ، يتم إعطاء نظرة عامة مفصلة على هياكل البيانات أدناه.
بيانات ذاكرة الوصول العشوائي
تحتوي هذه البيانات على البنية التالية:
NUSE_Semaphore_Counter [] - صفيف من النوع
U8 له إدخال واحد لكل إشارة تم تكوينها ، يقوم بتخزين قيمة العداد.
NUSE_Semaphore_Blocking_Count [] - صفيف من النوع
U8 ، يحتوي على عدادات المهام المحظورة في كل إشارة. هذا الصفيف موجود فقط إذا تم تنشيط وظيفة حظر استدعاء API.
تتم تهيئة
NUSE_Semaphore_Counter [] على القيمة الأولية (انظر "البيانات في ROM" أدناه) ،
وتتم إعادة تعيين NUSE_Semaphore_Blocking_Count [] باستخدام
NUSE_Init_Semaphore () عند بدء Nucleus SE. ستقدم إحدى المقالات التالية وصفًا كاملاً لإجراءات بدء تشغيل Nucleus SE.
فيما يلي تعريفات هياكل البيانات هذه في ملف
nuse_init.c .
RAM U8 NUSE_Semaphore_Counter[NUSE_SEMAPHORE_NUMBER]; #if NUSE_BLOCKING_ENABLE RAM U8 NUSE_Semaphore_Blocking_Count[NUSE_SEMAPHORE_NUMBER]; #endif
بيانات ROM
هيكل البيانات:
NUSE_Semaphore_Initial_Value [] - صفيف من النوع
U8 ، له سجل واحد لكل إشارة ، هذه هي القيم الأولية للأشكال.
تم التصريح عن بنية البيانات هذه
وتهيئتها (بشكل ثابت) في
nuse_config.c :
ROM U8 NUSE_Semaphore_Initial_Value[NUSE_SEMAPHORE_NUMBER] = { /* semaphore initial count values */ };
مقدار الذاكرة من الإشارات
مثل جميع كائنات Nucleus SE kernel ، يمكن التنبؤ بكمية البيانات المطلوبة لأشكال الإشارة.
مقدار الذاكرة في ROM (بالبايت) لجميع الإشارات في التطبيق هو
NUSE_SEMAPHORE_NUMBER .
يمكن حساب مقدار الذاكرة في ذاكرة الوصول العشوائي (بالبايت) لجميع الإشارات في التطبيق مع المكالمات المفعلة إلى API API على النحو التالي:
NUSE_SEMAPHORE_NUMBER * 2
وإلا ، فسيكون
NUSE_SEMAPHORE_NUMBER .
مكالمات API غير محققة
لم يتم تنفيذ ثلاث مكالمات API للأشكال الموجودة في Nucleus RTOS في Nucleus SE.
إنشاء الإشارات
ينشئ استدعاء API هذا إشارة. ليست هناك حاجة لـ Nucleus SE لأنه يتم إنشاء الإشارات بشكل ثابت.
النموذج الأولي لمكالمة الخدمة:
STATUS NU_Create_Semaphore (إشارة NU_SEMAPHORE * إشارة ، اسم CHAR ، حساب غير مبدئي ، OPTION suspend_type) ؛معلمات:
إشارة - مؤشر إلى كتلة تحكم إشارة يوفرها المستخدم ؛ يتم استخدامه للتحكم في الإشارة في مكالمات API الأخرى ؛
name - مؤشر لاسم الإشارة المكون من 8 أحرف ، مع إنهاء البايت الفارغ ؛
الأولية_القيمة - القيمة الأولية
للإشارة ؛
suspend_type - يشير إلى مبدأ إيقاف المهمة مؤقتًا على إشارة. يمكن أن تأخذ القيم
NU_FIFO و
NU_PRIORITY ، المقابلة لمبدأ FIFO (First-in-First-Out) وترتيب أولوية تعليق المهام.
القيمة المعادة:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_SEMAPHORE - يقول أن المؤشر إلى كتلة تحكم الإشارة
فارغة أو أنه قيد الاستخدام بالفعل ؛
NU_INVALID_SUSPEND - معلمة
suspend_type غير صالحة.
إزالة سيمافور
يزيل استدعاء API هذا الإشارة التي تم إنشاؤها مسبقًا. Nucleus SE غير مطلوب لأنه يتم إنشاء الإشارات بشكل ثابت ولا يمكن حذفها.
النموذج الأولي لمكالمة الخدمة:
STATUS NU_Delete_Semaphore (NU_SEMAPHORE * إشارة) ؛معلمات:
إشارة الإشارة - مؤشر كتلة تحكم الإشارة.
القيمة المعادة:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_SEMAPHORE - مؤشر إشارة
غير صالح .
مؤشرات على الاشارة
يشكل استدعاء API هذا قائمة متسلسلة من المؤشرات لجميع الإشارات في النظام. لا يحتاج إلى Nucleus SE ، حيث يتم تحديد الإشارات من خلال مؤشر بسيط ، وليس مؤشر.
النموذج الأولي لمكالمة الخدمة:
NU_Semaphore_Pointers غير موقعة (NU_SEMAPHORE ** pointer_list ، غير موقعة الحد الأقصى).معلمات:
pointer_list - مؤشر لمجموعة من المؤشرات
NU_SEMAPHORE ، هذا الصفيف مليء
بمؤشرات على الإشارات ؛
max_pointers - الحد الأقصى لعدد المؤشرات في المصفوفة.
القيمة المعادة:
عدد مؤشرات
NU_SEMAPHORE في الصفيف.
متوافق مع Nucleus RTOS
كما هو الحال مع جميع كائنات Nucleus SE الأخرى ، كان الهدف هو زيادة توافق رمز التطبيق مع Nucleus RTOS. الإشارات ليست استثناء ، ومن وجهة نظر المستخدم ، يتم تنفيذها بنفس الطريقة كما في Nucleus RTOS. هناك أيضًا عدم توافق معين ، والذي اعتبرته مقبولًا نظرًا لأن الرمز النهائي سيصبح أكثر قابلية للفهم وأكثر كفاءة من حيث حجم الذاكرة المطلوبة. خلاف ذلك ، يمكن استخدام مكالمات Nucleus RTOS API مباشرة تقريبًا مثل مكالمات Nucleus SE.
معرفات الكائن
في Nucleus RTOS ، يتم وصف جميع الكائنات من خلال هياكل البيانات (وحدات التحكم) من نوع معين. يعمل مؤشر وحدة التحكم هذه كمعرف لـ الإشارة. قررت أنه في Nucleus SE ، هناك حاجة إلى نهج مختلف للاستخدام الفعال للذاكرة: يتم وصف جميع كائنات النواة من خلال مجموعة من الجداول في ذاكرة الوصول العشوائي و / أو ROM. يتم تحديد حجم هذه الجداول من خلال عدد الكائنات المكونة لكل نوع. معرف كائن معين هو الفهرس في هذا الجدول. لذلك قمت بتعريف
NUSE_SEMAPHORE كمكافئ لـ
U8 ، يعمل متغير (وليس مؤشر) من هذا النوع
كمعرف الإشارة. من السهل معالجة هذا التعارض البسيط إذا تم نقل الرمز من Nucleus SE إلى Nucleus RTOS والعكس صحيح. عادةً ، لا يتم تنفيذ أي عمليات على معرفات الكائنات بخلاف النقل والتخزين.
يدعم Nucleus RTOS أيضًا تسمية الإشارات. يتم استخدام هذه الأسماء فقط لتصحيح الأخطاء. لقد استبعدتهم من Nucleus SE لتوفير الذاكرة.
حجم العداد
في Nucleus RTOS ، يكون عداد الإشارة من النوع
غير الموقع ، والذي عادة ما يكون متغيرًا 32 بت. يحتوي Nucleus SE على عداد 8 بت ، ولكن يمكن تغييره بسهولة. عادة ، لا يتحقق Nucleus RTOS من تجاوز الإشارة. لن يسمح استدعاء Nucleus SE API للعداد بتعيين قيم أعلى من 255.
مكالمات API غير محققة
يدعم Nucleus RTOS ثماني مكالمات مفيدة للعمل مع الإشارات. لم يتم تنفيذ ثلاثة منها في Nucleus SE. تم وصف تفاصيل هذه التحديات ، بالإضافة إلى قرار استبعادها من Nucleus SE ، أعلاه.
ستفحص المقالة التالية علب البريد.
نبذة عن الكاتب: يعمل Colin Walls في صناعة الإلكترونيات لأكثر من ثلاثين عامًا ، ويكرس معظم وقته للبرامج الثابتة. وهو الآن مهندس برامج ثابتة في Mentor Embedded (قسم من Mentor Graphics). غالبًا ما يتحدث كولين وولز في المؤتمرات والندوات ، مؤلف العديد من المقالات الفنية وكتابين عن البرامج الثابتة. يعيش في المملكة المتحدة.
مدونة كولين المهنية ، البريد الإلكتروني: colin_walls@mentor.com.