
تم ذكر الطوابير في أحد المقالات السابقة (رقم 5). إنها توفر طريقة أكثر مرونة لنقل الرسائل البسيطة بين المهام مقارنة بصناديق البريد.
المقالات السابقة في السلسلة:
المادة رقم 22. صناديق البريد: الخدمات المساعدة وهياكل البياناتالمادة رقم 21 صناديق البريد: المقدمة والخدمات الأساسيةالمادة رقم 20. الإشارات: الخدمات المساعدة وهياكل البياناتالمادة رقم 19. الإشارات: المقدمة والخدمات الأساسيةالمادة رقم 18. مجموعات علامات الأحداث: خدمات المساعدة وهياكل البياناتالمادة رقم 17. مجموعات علامة الحدث: المقدمة والخدمات الأساسيةالمادة رقم 16. الإشاراتالمادة رقم 15. أقسام الذاكرة: الخدمات وهياكل البياناتالمادة رقم 14. أقسام الذاكرة: المقدمة والخدمات الأساسيةالمادة رقم 13. هياكل بيانات المهام ومكالمات API غير مدعومةالمادة رقم 12. خدمات للعمل مع المهامالمادة رقم 11. المهام: التكوين والمقدمة لواجهة برمجة التطبيقاتالمادة رقم 10. المجدول: الميزات المتقدمة والحفاظ على السياقالمادة رقم 9. المجدول: التنفيذالمادة رقم 8. نواة SE: التصميم الداخلي والنشرالمادة رقم 7. Nucleus SE: مقدمةالمادة رقم 6. خدمات RTOS الأخرىالمادة رقم 5. مهمة التفاعل والتزامنالمادة رقم 4. المهام وتبديل السياق والمقاطعاتالمادة رقم 3. المهام والتخطيطالمادة رقم 2. RTOS: البنية ووضع الوقت الحقيقي
المادة رقم 1. RTOS: مقدمة.باستخدام قوائم الانتظار
في Nucleus SE ، يتم تعريف قوائم الانتظار أثناء مرحلة الإنشاء. يمكن أن يحتوي التطبيق على ما يصل إلى 16 قائمة انتظار. في حالة عدم وجود قوائم انتظار في التطبيق ، لا يتم تضمين هياكل البيانات ولا رمز الخدمة المتعلقة بقوائم الانتظار في التطبيق.
قائمة الانتظار عبارة عن مجموعة من المناطق في الذاكرة كبيرة بما يكفي لعنصر واحد من نوع
ADDR ويمكن الوصول إليها بأمان حتى تتمكن العديد من المهام من استخدامه. يمكن للمهام كتابة البيانات إلى قائمة الانتظار حتى تمتلئ جميع المناطق. يمكن للمهام قراءة البيانات من قائمة الانتظار ، حيث تأتي البيانات عادةً على أساس FIFO (First-in-First-Out). يمكن أن تؤدي محاولة كتابة البيانات إلى قائمة انتظار مزدحمة أو قراءة البيانات من قائمة انتظار فارغة إلى حدوث خطأ أو توقف مؤقت للمهمة ، اعتمادًا على معلمات استدعاء API المحددة وتكوين Nucleus SE.
قوائم الانتظار وروابط البيانات
يدعم Nucleus SE قنوات البيانات ، التي تم ذكرها أيضًا في مقال سابق (# 5) وسيتم مناقشتها بالتفصيل في أحد الأمور التالية. الفرق الرئيسي بين قوائم الانتظار والقنوات هو حجم الرسالة. تحتوي قوائم الانتظار على رسائل تتكون من متغير واحد من نوع
ADDR (عادةً مؤشرات). تحتوي القناة على رسائل ذات حجم تعسفي ، فردية لكل قناة في التطبيق ويتم تخصيصها أثناء إعدادات المعلمة.
إعداد قائمة الانتظار
عدد الطوابير
كما هو الحال مع معظم كائنات Nucleus SE ، يتم التحكم في تكوين قائمة الانتظار بشكل أساسي من خلال توجيهات
#define في ملف
nuse_config.h . المعلمة الرئيسية هي
NUSE_QUEUE_NUMBER ، والتي تحدد عدد قوائم الانتظار التي تم تكوينها في التطبيق. القيمة الافتراضية هي صفر (أي أنه لا توجد قوائم انتظار في التطبيق) ويمكن أن تأخذ قيمًا حتى 16. ستؤدي القيمة غير الصحيحة إلى خطأ أثناء
التحويل البرمجي ، والذي سيتم إنشاؤه أثناء التحقق في ملف
nuse_config_check.h (يتم تضمينه في ملف
nuse_config.c وتجميعه جنبا إلى جنب مع ذلك) ، والتي سوف تؤدي إلى توجيه
الإرهاب # .
تحديد قيمة غير صفرية بمثابة المنشط الرئيسي لقوائم الانتظار. يتم استخدام هذه المعلمة عند تعريف بنيات البيانات وحجمها يعتمد على قيمتها (المزيد حول هذا الموضوع في المقالة التالية). بالإضافة إلى ذلك ، تعمل القيمة غير الصفرية على تنشيط إعدادات واجهة برمجة التطبيقات.
تنشيط مكالمات API
تحتوي كل وظيفة API (استدعاء الأداة المساعدة) في Nucleus SE على توجيه
#define نشط في
nuse_config.h . بالنسبة للطوابير ، هذه التوجيهات هي:
NUSE_QUEUE_SEND NUSE_QUEUE_RECEIVE NUSE_QUEUE_JAM NUSE_QUEUE_RESET NUSE_QUEUE_INFORMATION NUSE_QUEUE_COUNT
بشكل افتراضي ، يتم تعيينها على
FALSE ، وبالتالي تعطيل جميع مكالمات الخدمة وحظر تضمين التعليمات البرمجية التي تنفذها. لتكوين قوائم الانتظار في التطبيق ، تحتاج إلى تحديد مكالمات API الضرورية وتعيينها على
TRUE .
فيما يلي مقتطف من التعليمات البرمجية من ملف
nuse_config.h :
#define NUSE_QUEUE_NUMBER 0 /* Number of queues in the system - 0-16 */ /* Service call enablers */ #define NUSE_QUEUE_SEND FALSE #define NUSE_QUEUE_RECEIVE FALSE #define NUSE_QUEUE_JAM FALSE #define NUSE_QUEUE_RESET FALSE #define NUSE_QUEUE_INFORMATION FALSE #define NUSE_QUEUE_COUNT FALSE
إذا تم تنشيط وظائف قائمة انتظار API ، ولكن لا توجد قوائم انتظار في التطبيق (باستثناء
NUSE_Queue_Count () ، والذي يتم تمكينه دائمًا) ، فسيظهر خطأ في
الترجمة . إذا كان الرمز الخاص بك يستخدم استدعاء API لم يتم تنشيطه ، فسيؤدي ذلك إلى حدوث خطأ في التخطيط لأنه لم يتم تضمين رمز التنفيذ في التطبيق.
انتظار المكالمات
يدعم Nucleus RTOS 10 مكالمات خدمة قائمة الانتظار التي توفر الوظائف التالية:
- وضع رسالة في قائمة الانتظار. يتم تطبيق Nucleus SE في دالة NUSE_Queue_Send () .
- قبول رسالة من قائمة الانتظار. تطبق Nucleus SE الوظيفة NUSE_Queue_Receive () .
- الترحيل إلى رأس قائمة الانتظار. في Nucleus SE ، تم تنفيذه في NUSE_Queue_Jam () .
- استعادة قائمة الانتظار إلى حالة غير مستخدمة مع إصدار كافة المهام المعلقة (إعادة تعيين). يتم تنفيذ Nucleus SE في NUSE_Queue_Reset () .
- توفير معلومات حول قائمة انتظار محددة. تطبيق Nucleus SE في NUSE_Queue_Information () .
- إرجاع عدد قوائم الانتظار التي تم تكوينها حاليًا في التطبيق. في Nucleus SE ، تم تنفيذه في NUSE_Queue_Count () .
- إضافة قائمة انتظار جديدة إلى التطبيق (إنشاء قائمة انتظار). لم يتم تنفيذ Nucleus SE.
- إزالة قائمة انتظار من تطبيق. Nucleus SE غير مطبق.
- إرجاع المؤشرات إلى كافة قوائم الانتظار في التطبيق. لم يتم تنفيذ Nucleus SE.
- إرسال رسالة إلى جميع المهام المعلقة في قائمة الانتظار (البث). لم يتم تنفيذ Nucleus SE.
يتم وصف تنفيذ كل من هذه المكالمات العامة بالتفصيل أدناه.
خدمة المكالمات للكتابة والقراءة من الطوابير
العمليات الأساسية التي يتم إجراؤها على قوائم الانتظار هي الكتابة (والتي تسمى أحيانًا رسائل قائمة الانتظار) والقراءة (تعرف أيضًا باستلام الرسائل). من الممكن أيضًا الكتابة إلى بداية الطابور (التشويش). يوفر Nucleus RTOS و Nucleus SE ثلاثة مكالمات API أساسية لهذه العمليات ، والتي سيتم مناقشتها أدناه.
الطابور
إن استدعاء الأداة المساعدة Nucleus RTOS API للكتابة إلى قائمة الانتظار مرن للغاية ويسمح لك بإيقاف المهمة مؤقتًا بشكل ضمني ، أو مع مهلة محددة إذا تعذر إكمال العملية على الفور (على سبيل المثال ، عند محاولة الكتابة إلى قائمة انتظار كاملة). يوفر Nucleus SE نفس الميزات ، ولكن الإيقاف المؤقت للمهمة اختياري ولا يتم تنفيذ المهلة.
استدعاء قائمة الانتظار في نواة RTOSنموذج استدعاء الخدمة:
STATUS NU_Send_To_Queue (NU_QUEUE * قائمة انتظار ، VOID * رسالة ، حجم غير موقّع ، تعليق غير موقَّع) ؛المعلمات:
قائمة الانتظار - مؤشر إلى كتلة التحكم في قائمة الانتظار التي يوفرها المستخدم ؛
رسالة - مؤشر للرسالة المراد إرسالها ؛
الحجم - عدد عناصر البيانات غير
الموقعة في الرسالة. إذا كانت قائمة الانتظار تدعم رسائل ذات طول متغير ، يجب أن تكون هذه المعلمة مساوية لحجم الرسالة أو أن تكون أقل من حجم الرسالة التي تدعمها قائمة الانتظار. إذا كانت قائمة الانتظار تدعم رسائل ذات حجم ثابت ، يجب أن تتطابق هذه المعلمة تمامًا مع حجم الرسالة التي تدعمها قائمة الانتظار ؛
تعليق - تحديد تعليق المهمة ، يمكن أن يأخذ القيم
NU_NO_SUSPEND أو
NU_SUSPEND أو قيمة مهلة.
القيمة المعادة:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_QUEUE - مؤشر قائمة انتظار غير صالح ؛
NU_INVALID_POINTER - مؤشر فارغ إلى رسالة (
NULL ) ؛
NU_INVALID_SIZE - حجم الرسالة غير متوافق مع حجم الرسالة الذي تدعمه قائمة الانتظار ؛
NU_INVALID_SUSPEND - تم إجراء التعليق من سلسلة رسائل غير متعلقة بالمهمة ؛
NU_QUEUE_FULL - قائمة الانتظار ممتلئة ، ولم يتم تحديد التعليق ؛
NU_TIMEOUT - قائمة الانتظار ممتلئة حتى بعد تعليق المهمة للمهلة المحددة ؛
NU_QUEUE_DELETED - تم حذف قائمة الانتظار أثناء تعليق المهمة ؛
NU_QUEUE_RESET - تم إعادة تعيين قائمة الانتظار أثناء تعليق المهمة.
وضع رسالة في قائمة الانتظار في Nucleus SEيدعم استدعاء خدمة API هذا الوظائف الأساسية لـ Nucleus RTOS API.
النموذج الأولي لمكالمة الخدمة:
STATUS NUSE_Queue_Send (قائمة انتظار NUSE_QUEUE ، رسالة ADDR * ، تعليق U8) ؛معلمات:
قائمة الانتظار - مؤشر
قائمة الانتظار (ID) ؛
message - مؤشر للرسالة المراد إرسالها ؛ إنه متغير واحد من نوع
ADDR ؛
تعليق - مواصفات
لإيقاف المهام مؤقتًا ؛ يمكن أن تأخذ القيم
NUSE_NO_SUSPEND أو NUSE_SUSPEND .
القيمة المعادة:
NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_QUEUE - فهرس قائمة انتظار غير صالح ؛
NUSE_INVALID_POINTER - مؤشر فارغ لرسالة (
NULL ) ؛
NUSE_INVALID_SUSPEND - محاولة إيقاف مهمة مؤقتًا من سلسلة
محادثات غير مرتبطة بالمهمة أو عندما يتم تعطيل مكالمات خدمة API لحظر المهام ؛
NUSE_QUEUE_FULL - قائمة الانتظار ممتلئة ولم يتم تحديد التعليق ؛
NUSE_QUEUE_WAS_RESET - تمت إعادة تعيين قائمة الانتظار أثناء تعليق المهمة.
تطبيق قائمة الانتظار في Nucleus SEيتم تحديد إصدار رمز دالة API
NUSE_Queue_Send () (بعد التحقق من المعلمات) باستخدام
التحويل البرمجي الشرطي ، اعتمادًا على ما إذا كان دعم تأمين المهام قد تم تنشيطه أم لا. سننظر في كلا الخيارين.
إذا لم يتم تنشيط تأمين المهام ، يكون رمز استدعاء الخدمة هذا بسيطًا جدًا:
if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { return_value = NUSE_QUEUE_FULL; } else /* queue element available */ { NUSE_Queue_Data[queue][NUSE_Queue_Head[queue]++] = *message; if (NUSE_Queue_Head[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Head[queue] = 0; } NUSE_Queue_Items[queue]++; return_value = NUSE_SUCCESS; }
تتحقق الوظيفة ببساطة لمعرفة ما إذا كانت هناك مساحة خالية في قائمة الانتظار وتستخدم فهرس
NUSE_Queue_Head [] لتخزين الرسالة في منطقة بيانات قائمة الانتظار.
في حالة تنشيط تأمين المهام ، يصبح الرمز أكثر تعقيدًا:
do { if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_QUEUE_FULL; } else { /* block task */ NUSE_Queue_Blocking_Count[queue]++; NUSE_Suspend_Task(NUSE_Task_Active, (queue << 4) | NUSE_QUEUE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } else { /* queue element available */ NUSE_Queue_Data[queue][NUSE_Queue_Head[queue]++] = *message; if (NUSE_Queue_Head[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Head[queue] = 0; } NUSE_Queue_Items[queue]++; if (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; /* check whether a task is blocked on this queue */ NUSE_Queue_Blocking_Count[queue]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } } while (suspend == NUSE_SUSPEND);
بعض التوضيحات قد تكون مفيدة.
يتم تضمين الكود في حلقة
do ... while ، والتي تعمل في حين أن معلمة الإيقاف المؤقت للمهمة هي
NUSE_SUSPEND .
إذا كانت قائمة الانتظار ممتلئة وكان
الإيقاف المؤقت NUSE_NO_SUSPEND ، تنتهي مكالمة API بـ
NUSE_QUEUE_FULL . إذا كانت معلمة التوقف المرحلي هي
NUSE_SUSPEND ، تتوقف المهمة مؤقتًا. عند الانتهاء (أي عند استئناف المهمة) ، إذا كانت القيمة
المرجعة هي
NUSE_SUCCESS ، أي أنه تم استئناف المهمة لأن الرسالة تمت قراءتها (وليس بسبب إعادة تعيين قائمة الانتظار) ، يعود الرمز إلى بداية الحلقة.
في حالة عدم امتلاء قائمة الانتظار ، يتم تخزين الرسالة المقدمة باستخدام فهرس
NUSE_Queue_Head [] في منطقة بيانات قائمة الانتظار. وهو يتحقق لمعرفة ما إذا كانت هناك مهام معلقة (رسائل انتظار) في قائمة الانتظار. إذا كانت هناك مثل هذه المهام ، يتم استئناف أولها. تم تعيين متغير التوقف المرحلي إلى
NUSE_NO_SUSPEND ، واستكمال استدعاء API بالقيمة
NUSE_SUCCESS .
القراءة من قائمة الانتظار
تعتبر أداة مساعدة Nucleus RTOS API للقراءة من قائمة الانتظار مرنة جدًا وتتيح لك إيقاف المهام بشكل ضمني أو مع مهلة محددة إذا تعذر إكمال العملية على الفور (على سبيل المثال ، عند محاولة القراءة من قائمة انتظار فارغة). يوفر Nucleus SE نفس الوظيفة ، ولكن توقف المهمة اختياري ولا يتم تنفيذ مهلة.
اتصل لتلقي رسائل من قائمة الانتظار في Nucleus RTOSنموذج استدعاء الخدمة:
STATUS NU_Receive_From_Queue (NU_QUEUE * قائمة انتظار ، VOID * رسالة ، حجم غير موقّع ، غير موقّع * حجم_معيّن ، تعليق غير موقّع) ؛المعلمات:
قائمة الانتظار - مؤشر إلى كتلة التحكم قائمة الانتظار المقدمة من قبل المستخدم؛
رسالة - مؤشر للتخزين للرسائل المستلمة ؛
الحجم - عدد عناصر البيانات غير
الموقعة في الرسالة. يجب أن يتطابق هذا الرقم مع حجم الرسالة المحدد عند إنشاء قائمة الانتظار ؛
تعليق - مواصفات تعليق المهمة ، يمكن أن تأخذ القيم
NU_NO_SUSPEND أو
NU_SUSPEND أو قيمة المهلة.
القيمة المعادة:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_QUEUE - مؤشر قائمة انتظار غير صالح ؛
NU_INVALID_POINTER - مؤشر فارغ لرسالة (
NULL ) ؛
NU_INVALID_SUSPEND - محاولة إيقاف مهمة مؤقتًا من سلسلة
رسائل غير مرتبطة بالمهمة ؛
NU_QUEUE_EMPTY - قائمة الانتظار فارغة ولم يتم تحديد التعليق ؛
NU_TIMEOUT - يشير إلى أن قائمة الانتظار لا تزال فارغة ، حتى بعد تعليق المهمة لفترة زمنية محددة ؛
NU_QUEUE_DELETED - تم حذف قائمة الانتظار أثناء تعليق المهمة ؛
NU_QUEUE_RESET - تمت إعادة تعيين قائمة الانتظار أثناء تعليق المهمة.
اتصل لتلقي رسائل من قائمة انتظار Nucleus SEيدعم اتصال API هذا الوظائف الأساسية لـ Nucleus RTOS API.
النموذج الأولي لمكالمة الخدمة:
STATUS NUSE_Queue_Receive (NUSE_QUEUE قائمة الانتظار ، رسالة ADDR * ، تعليق U8) ؛المعلمات:
قائمة الانتظار - مؤشر
قائمة الانتظار (ID) ؛
message - مؤشر إلى المستودع للرسائل المستلمة ؛ وهو متغير واحد من نوع
ADDR ؛
تعليق - مواصفات تعليق المهمة ، يمكن أن تأخذ القيم
NUSE_NO_SUSPEND أو
NUSE_SUSPEND .
القيمة المعادة:
NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_QUEUE - فهرس قائمة الانتظار غير صالح ؛
NUSE_INVALID_POINTER - مؤشر فارغ لرسالة (
NULL ) ؛
NUSE_INVALID_SUSPEND - محاولة لتعليق مهمة من سلسلة
رسائل غير مرتبطة بالمهمة أو بدعم معطل لحظر المهام ؛
NUSE_QUEUE_EMPTY - قائمة الانتظار فارغة ولم يتم تحديد التعليق ؛
NUSE_QUEUE_WAS_RESET - تم إعادة تعيين قائمة الانتظار أثناء تعليق المهمة.
تنفيذ استقبال الرسائل من الطوابير في Nucleus SEيتم تحديد إصدار رمز وظيفة واجهة برمجة التطبيقات
NUSE_Queue_Receive () (بعد التحقق من المعلمات) باستخدام
الترجمة الشرطية ، اعتمادًا على ما إذا كان دعم قفل المهام نشطًا أم لا. النظر في كلا الخيارين.
إذا تم تنشيط دعم القفل ، فإن رمز مكالمة API هذه بسيط جدًا:
if (NUSE_Queue_Items[queue] == 0) /* queue empty */ { return_value = NUSE_QUEUE_EMPTY; } else { /* message available */ *message = NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]++]; if (NUSE_Queue_Tail[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Tail[queue] = 0; } NUSE_Queue_Items[queue]--; return_value = NUSE_SUCCESS; }
تتحقق الوظيفة ببساطة لمعرفة ما إذا كانت هناك رسالة في قائمة الانتظار ، وتستخدم فهرس
NUSE_Queue_Tail [] لاسترداد الرسالة من قائمة الانتظار وإرجاع البيانات باستخدام مؤشر للرسالة.
إذا تم تنشيط تأمين المهام ، يصبح الرمز أكثر تعقيدًا:
do { if (NUSE_Queue_Items[queue] == 0) /* queue empty */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_QUEUE_EMPTY; } else { /* block task */ NUSE_Queue_Blocking_Count[queue]++; NUSE_Suspend_Task(NUSE_Task_Active, (queue << 4) | NUSE_QUEUE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } else { /* message available */ *message = NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]++]; if (NUSE_Queue_Tail[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Tail[queue] = 0; } NUSE_Queue_Items[queue]--; if (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; /* check whether a task is blocked */ /* on this queue */ NUSE_Queue_Blocking_Count[queue]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } } while (suspend == NUSE_SUSPEND);
بعض التوضيحات ستكون مفيدة.
يتم تضمين الكود في حلقة
do ... while ، والتي تعمل في حين أن معلمة الإيقاف المؤقت للمهمة هي
NUSE_SUSPEND .
إذا كانت قائمة الانتظار فارغة وكان التوقف المرحلي
NUSE_NO_SUSPEND ،
فستنتهي مكالمة API بـ
NUSE_QUEUE_EMPTY . إذا كانت معلمة
التوقف المرحلي هي
NUSE_SUSPEND ، تتوقف المهمة مؤقتًا. عند الانتهاء (أي عند استئناف المهمة) ، إذا كانت القيمة
المرجعة هي
NUSE_SUCCESS ، أي أنه تم استئناف المهمة لأنه تم إرسال الرسالة (وليس بسبب إعادة تعيين قائمة الانتظار) ، يعود الرمز إلى بداية الحلقة.
إذا كانت قائمة الانتظار تحتوي على رسائل ، فسيتم إرجاع الرسالة المخزنة باستخدام فهرس
NUSE_Queue_Tail [] . وهو يتحقق لمعرفة ما إذا كانت هناك أي مهام متوقفة مؤقتًا (معلقة) في قائمة الانتظار هذه. إذا كان هناك مثل هذه المهام ، يستأنف أولها. يتم تعيين متغير التوقف المرحلي إلى
NUSE_NO_SUSPEND ، وينتهي استدعاء API برمز
NUSE_SUCCESS .
اكتب لرأس الخط
إن استدعاء الأداة المساعدة Nucleus RTOS API لكتابة رسالة إلى رأس قائمة الانتظار مرن للغاية ويسمح لك بإيقاف المهمة مؤقتًا بشكل ضمني ، أو مع مهلة محددة إذا تعذر إكمال العملية على الفور (على سبيل المثال ، عند محاولة الكتابة إلى قائمة انتظار مزدحمة). يوفر Nucleus SE نفس الوظيفة ، ولكن توقف المهام اختياري ، ولم يتم تنفيذ مهلة.
اتصل لكتابة رسالة إلى رأس قائمة انتظار Nucleus RTOSنموذج استدعاء الخدمة:
STATUS NU_Send_To_Front_Of_Queue (NU_QUEUE * قائمة الانتظار ، VOID * رسالة ، حجم غير موقّع ، تعليق غير موقَّع) ؛معلمات:
قائمة الانتظار - مؤشر إلى كتلة التحكم قائمة الانتظار المقدمة من قبل المستخدم؛
رسالة - مؤشر للرسالة المراد إرسالها ؛
الحجم - عدد عناصر البيانات غير
الموقعة في الرسالة. إذا كانت قائمة الانتظار تدعم الرسائل ذات الطول المتغير ، فيجب أن تكون هذه المعلمة مساوية لحجم الرسالة أو أصغر من حجم الرسالة الذي تدعمه قائمة الانتظار. إذا كانت قائمة الانتظار تدعم رسائل ذات طول ثابت ، يجب أن تتطابق هذه المعلمة تمامًا مع حجم الرسالة التي تدعمها قائمة الانتظار ؛
تعليق - تحديد تعليق المهمة ، يمكن أن يأخذ القيم
NU_NO_SUSPEND أو
NU_SUSPEND أو قيمة مهلة.
قيمة الإرجاع:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_QUEUE - مؤشر قائمة انتظار غير صالح ؛
NU_INVALID_POINTER - مؤشر فارغ لرسالة (
NULL ) ؛
NU_INVALID_SIZE - حجم الرسالة غير متوافق مع حجم الرسالة التي تدعمها قائمة الانتظار ؛
NU_INVALID_SUSPEND - محاولة الإيقاف المؤقت من تدفق غير مهمة
NU_QUEUE_FULL - قائمة الانتظار ممتلئة ، ولم يتم تحديد التعليق ؛
NU_TIMEOUT - قائمة الانتظار ممتلئة ، حتى بعد تعليق المهمة لفترة
زمنية محددة ؛
NU_QUEUE_DELETED - تم حذف قائمة الانتظار أثناء تعليق المهمة ؛
NU_QUEUE_RESET - تم إعادة تعيين قائمة الانتظار أثناء تعليق المهمة.
مكالمة لكتابة رسالة إلى رأس قائمة الانتظار في Nucleus SEتدعم مكالمة API هذه الوظيفة الأساسية لـ Nucleus RTOS API.
النموذج الأولي لمكالمة الخدمة:
STATUS NUSE_Queue_Jam (قائمة انتظار NUSE_QUEUE ، رسالة ADDR * ، تعليق U8) ؛معلمات:
قائمة الانتظار - مؤشر
قائمة الانتظار (ID) ؛
message - مؤشر إلى رسالة ، هو متغير واحد من نوع
ADDR ؛
تعليق - تحديد تعليق المهمة ، يمكن أن يكون
NUSE_NO_SUSPEND أو
NUSE_SUSPEND .
القيمة المعادة:
NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_QUEUE - فهرس قائمة انتظار غير صالح ؛
NUSE_INVALID_POINTER - مؤشر فارغ لرسالة (
NULL ) ؛
NUSE_INVALID_SUSPEND - محاولة لتعليق مهمة من سلسلة
رسائل غير مرتبطة بالمهمة أو بدعم معطل لحظر المهام ؛
NUSE_QUEUE_FULL - قائمة الانتظار ممتلئة ولم يتم تحديد التعليق ؛
NUSE_QUEUE_WAS_RESET - تمت إعادة تعيين قائمة الانتظار أثناء تعليق المهمة.
تطبيق قائمة انتظار قائمة انتظار في Nucleus SEمتغير رمز دالة API
NUSE_Queue_Jam () يشبه إلى حد كبير
NUSE_Queue_Send () ، يتم تخزين البيانات فقط باستخدام فهرس
NUSE_Queue_Tail [] ، وبالتالي:
if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { return_value = NUSE_QUEUE_FULL; } else /* queue element available */ { if (NUSE_Queue_Tail[queue] == 0) { NUSE_Queue_Tail[queue] = NUSE_Queue_Size[queue] - 1; } else { NUSE_Queue_Tail[queue]--; } NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]] = *message; NUSE_Queue_Items[queue]++; return_value = NUSE_SUCCESS; }
ستبحث المقالة التالية في مكالمات API الإضافية المرتبطة بقوائم الانتظار ، وكذلك بنيات البيانات.
نبذة عن الكاتب: يعمل Colin Walls في صناعة الإلكترونيات لأكثر من ثلاثين عامًا ، ويكرس معظم وقته للبرامج الثابتة. وهو الآن مهندس برامج ثابتة في Mentor Embedded (قسم من Mentor Graphics). غالبًا ما يتحدث كولين وولز في المؤتمرات والندوات ، مؤلف العديد من المقالات الفنية وكتابين عن البرامج الثابتة. يعيش في المملكة المتحدة.
مدونة كولين المهنية ، البريد الإلكتروني: colin_walls@mentor.com.