
تم ذكر صناديق البريد في إحدى المقالات السابقة (رقم 5). إنها ثاني أسهل طريقة للتواصل بين المهام من إشارة إلى إشارة مدعومة من Nucleus SE وتوفر طريقة منخفضة التكلفة ومرنة لنقل الرسائل البسيطة بين المهام.
المقالات السابقة في السلسلة:
المادة رقم 20. الإشارات: الخدمات المساعدة وهياكل البياناتالمادة رقم 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: مقدمة.
استخدام صناديق البريد
في Nucleus SE ، يتم تحديد صناديق البريد أثناء مرحلة البناء. يمكن أن يحتوي التطبيق على ما يصل إلى 16 صندوق بريد. إذا لم يكن التطبيق يحتوي على صناديق بريد ، فلن يتم تضمين كود استدعاء الخدمة وهياكل البيانات المرتبطة بصناديق البريد في التطبيق.
صندوق البريد هو مجرد مكان لتخزين البيانات ، وحجمه يكفي لتخزين متغير من نوع
ADDR والوصول الآمن الذي يتم التحكم فيه بطريقة يمكن استخدامها في العديد من المهام. يمكن للمهمة إرسال البيانات إلى صندوق بريد. ونتيجة لذلك ، سيصبح صندوق البريد ممتلئًا ، ولن تكون هناك مهمة قادرة على إرسال البيانات إليه حتى تقوم المهمة بعملية قراءة صندوق البريد أو حتى يصبح صندوق البريد فارغًا. ستؤدي محاولة إرسال البيانات إلى صندوق بريد كامل أو محاولة قراءة صندوق بريد فارغ إلى حدوث خطأ أو تعليق مهمة ، بناءً على إعدادات استدعاء API المحددة وتكوين Nucleus SE.
صناديق البريد وقوائم الانتظار
في بعض تطبيقات نظام التشغيل ، لا يتم تنفيذ صناديق البريد ، ولكن كبديل ، يُقترح استخدام قائمة انتظار. يبدو هذا منطقيًا ، نظرًا لأن قائمة الانتظار هذه ستوفر نفس الوظائف مثل علبة البريد. ومع ذلك ، فإن قائمة الانتظار هي بنية بيانات أكثر تعقيدًا وتحمل بيانات مساعدة ورمزًا أكبر بكثير ولديها وقت خدمة أطول.
في Nucleus SE ، كما هو الحال في Nucleus RTOS ، يمكنك تحديد أي من هذه الأنواع من الكائنات.
إذا كان التطبيق الخاص بك يحتوي على العديد من قوائم الانتظار وصندوق بريد واحد ، فمن المنطقي التفكير في استبدال صندوق البريد بقائمة انتظار. سيؤدي هذا إلى زيادة كمية النفقات العامة قليلاً ، ولكنه سيتخلص من جميع رموز API المرتبطة بصناديق البريد. بدلاً من ذلك ، يمكنك تكوين التطبيق بكلتا الطريقتين ومقارنة مقدار البيانات والأداء.
سيتم مناقشة قوائم الانتظار في المقالات المستقبلية.
تكوين صناديق البريد
عدد صناديق البريد
كما هو الحال مع معظم كائنات Nucleus SE ، يتم تعريف تكوين صندوق البريد بشكل أساسي من خلال توجيهات
#define في ملف
nuse_config.h . المعلمة الرئيسية هي
NUSE_MAILBOX_NUMBER ، والتي تحدد عدد علب البريد في التطبيق. القيمة الافتراضية هي صفر (أي أنه لا توجد صناديق بريد) ويمكن أن تأخذ قيمًا تصل إلى 16. ستؤدي القيمة غير الصحيحة إلى حدوث خطأ أثناء
التحويل البرمجي ، والذي سيتم إنشاؤه عن طريق التحقق في
nuse_config_check.h (يتم تضمينه في الملف
nuse_config.c وجمعه معه ) ، والتي ستؤدي إلى توجيه #
خطأ .
تحديد قيمة غير صفرية هو المنشط الأساسي لصناديق البريد. يتم استخدام هذه المعلمة عند تحديد هياكل البيانات ويعتمد حجمها على قيمتها (المزيد عن هذا في المقالة التالية). بالإضافة إلى ذلك ، تعمل القيمة غير الصفرية على تنشيط إعدادات واجهة برمجة التطبيقات.
تنشيط مكالمات API
يتم تنشيط كل وظيفة API (استدعاء فائدة) في Nucleus SE بواسطة التوجيه
#define في ملف
nuse_config.h . بالنسبة إلى صناديق البريد ، هذه التوجيهات هي:
NUSE_MAILBOX_SEND NUSE_MAILBOX_RECEIVE NUSE_MAILBOX_RESET NUSE_MAILBOX_INFORMATION NUSE_MAILBOX_COUNT
بشكل افتراضي ، يتم تعيينها على
FALSE ، وبالتالي تعطيل جميع مكالمات الخدمة وحظر تضمين التعليمات البرمجية التي تنفذها. لتهيئة صناديق البريد في التطبيق ، تحتاج إلى تحديد مكالمات API اللازمة وتعيينها على
TRUE .
ما يلي هو مقطع من التعليمات البرمجية من ملف
nuse_config.h .
/* Number of mailboxes in the system - 0-16 */ #define NUSE_MAILBOX_NUMBER 0 /* Service call enablers: */ #define NUSE_MAILBOX_SEND FALSE #define NUSE_MAILBOX_RECEIVE FALSE #define NUSE_MAILBOX_RESET FALSE #define NUSE_MAILBOX_INFORMATION FALSE #define NUSE_MAILBOX_COUNT FALSE
إذا تم تنشيط وظيفة API
لصندوق البريد ولم يكن هناك صناديق بريد في التطبيق (باستثناء
NUSE_Mailbox_Count () ، التي يتم تمكينها دائمًا) ،
فسيحدث خطأ في
الترجمة . إذا كان الرمز الخاص بك يستخدم استدعاء API لم يتم تنشيطه ، فسيحدث خطأ تخطيط لأن رمز التنفيذ لم يتم تضمينه في التطبيق.
مكالمات خدمة صندوق البريد
يدعم Nucleus RTOS تسع مكالمات خدمة مرتبطة بصناديق البريد وتوفر الوظائف التالية:
- إرسال رسائل إلى صندوق البريد. يتم تنفيذ Nucleus SE في دالة NUSE_Mailbox_Send () .
- قراءة رسالة من صندوق بريد. تطبق Nucleus SE الوظيفة NUSE_Mailbox_Receive () .
- استعادة صندوق بريد إلى حالة غير مستخدمة مع إصدار جميع المهام المعلقة (إعادة الضبط). في Nucleus SE ، تم التنفيذ في NUSE_Mailbox_Reset () .
- توفير معلومات حول صندوق بريد محدد. يتم تنفيذ Nucleus SE في NUSE_Mailbox_Information () .
- إرجاع عدد صناديق البريد التي تم تكوينها حاليًا في التطبيق. في Nucleus SE ، تم التنفيذ في NUSE_Mailbox_Count () .
- إضافة صندوق بريد جديد (إنشاء). لم يتم تنفيذ Nucleus SE.
- حذف صندوق بريد. لم يتم تنفيذ Nucleus SE.
- إرجاع المؤشرات إلى كافة علب البريد الموجودة في التطبيق. لم يتم تنفيذ Nucleus SE.
- إرسال رسالة إلى جميع المهام المعلقة على صندوق البريد (البث). لم يتم تنفيذ Nucleus SE.
ضع في اعتبارك بالتفصيل تنفيذ كل مكالمة خدمة.
قراءة وكتابة مكالمات خدمة صندوق البريد
العمليات الأساسية التي يمكن إجراؤها على صناديق البريد هي كتابة وقراءة البيانات (إرسال واستقبال). يوفر Nucleus RTOS و Nucleus SE مكالمتين أساسيتين لواجهة برمجة التطبيقات لهذه العمليات ، والتي سيتم وصفها أدناه.
اكتب إلى صندوق البريد
يعد الاتصال ببرنامج Nucleus RTOS API للكتابة إلى صندوق البريد أمرًا مرنًا للغاية ، مما يسمح لك بإيقاف المهمة مؤقتًا بشكل ضمني أو مع انتهاء المهلة إذا تعذر إكمال العملية على الفور (على سبيل المثال ، عندما تحاول الكتابة إلى صندوق بريد كامل). يوفر Nucleus SE استدعاء خدمة مشابهًا ، إلا أن إيقاف المهمة مؤقتًا اختياري ، ولم يتم تنفيذ المهلة.
يقدم Nucleus RTOS أيضًا مكالمة خدمة لبث البيانات إلى صندوق بريد ؛ هذه المكالمة غير مدعومة في Nucleus SE وسيتم وصفها في قسم "مكالمات API غير المحققة" في المقالة التالية.
اتصل للكتابة إلى صندوق بريد في Nucleus RTOSالنموذج الأولي لمكالمة الخدمة:
STATUS NU_Send_To_Mailbox (صندوق بريد NU_MAILBOX * ، رسالة VOID ، تعليق غير موقَّع) ؛معلمات:
صندوق البريد - مؤشر لعلبة البريد ؛
message - مؤشر للرسالة المراد إرسالها ، يتكون من أربعة عناصر من النوع
غير الموقع ؛
تعليق - مواصفات تعليق المهمة ، يمكن أن تأخذ القيم
NU_NO_SUSPEND أو
NU_SUSPEND أو قيمة المهلة.
القيمة المعادة:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_MAILBOX - مؤشر صندوق البريد غير صالح ؛
NU_INVALID_POINTER - مؤشر فارغ لرسالة (
NULL ) ؛
NU_INVALID_SUSPEND - محاولة التعليق من سلسلة رسائل غير متعلقة بالمهمة ؛
NU_MAILBOX_FULL - صندوق البريد ممتلئ ، ولكن نوع التعليق غير محدد ؛
NU_TIMEOUT - صندوق البريد لا يزال ممتلئًا ، حتى بعد التعليق للفترة المحددة ؛
NU_MAILBOX_DELETED - تم حذف صندوق البريد أثناء تعليق المهمة ؛
NU_MAILBOX_WAS_RESET - تم إعادة ضبط صندوق البريد أثناء تعليق المهمة.
اتصل للكتابة إلى صندوق بريد في Nucleus SEيدعم اتصال API هذا الوظائف الأساسية لـ Nucleus RTOS API.
النموذج الأولي لمكالمة الخدمة:
STATUS NUSE_Mailbox_Send (صندوق بريد NUSE_MAILBOX ، رسالة ADDR * ، تعليق U8) ؛معلمات:
صندوق البريد - فهرس
صندوق البريد (ID) ؛
message - مؤشر للرسالة المراد إرسالها ؛ وهو متغير واحد من نوع
ADDR ؛
تعليق - مواصفات تعليق المهمة ، يمكن أن تأخذ القيم
NUSE_NO_SUSPEND أو
NUSE_SUSPEND .
القيمة المعادة:
NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_MAILBOX - فهرس صندوق بريد غير صالح ؛
NUSE_INVALID_POINTER - مؤشر فارغ لرسالة (
NULL ) ؛
NUSE_INVALID_SUSPEND - محاولة
للتعليق من سلسلة رسائل غير ذات صلة أو عندما يتم إلغاء تنشيط وظيفة حجب مكالمات واجهة برمجة التطبيقات ؛
NUSE_MAILBOX_FULL - صندوق البريد ممتلئ ، ولكن نوع التعليق غير محدد ؛
NUSE_MAILBOX_WAS_RESET - تم إعادة ضبط صندوق البريد أثناء تعليق المهمة.
تنفيذ إدخالات صندوق البريد في Nucleus SEتم تحديد إصدار رمز وظيفة واجهة برمجة التطبيقات
NUSE_Mailbox_Send () (بعد التحقق من المعلمات) باستخدام
الترجمة الشرطية ، اعتمادًا على ما إذا كان دعم مكالمات API قد تم تنشيطه لحظر (تعليق المهام) أم لا. فكر في كلا الخيارين.
إذا تم تعطيل تأمين المهام ، فإن منطق استدعاء API هذا بسيط جدًا ، ولا يتطلب الرمز أي تفسير:
if (NUSE_Mailbox_Status[mailbox]) /* mailbox full */ { return_value = NUSE_MAILBOX_FULL; } else /* mailbox empty */ { NUSE_Mailbox_Data[mailbox] = *message; NUSE_Mailbox_Status[mailbox] = TRUE; return_value = NUSE_SUCCESS; }
يتم تخزين الرسالة في العنصر المقابل
NUSE_Mailbox_Data [] ، وتم وضع علامة على صندوق البريد على أنه مستخدم.
إذا تم تنشيط تأمين المهام ، يصبح الرمز أكثر تعقيدًا:
do { if (!NUSE_Mailbox_Status[mailbox]) /* mailbox empty */ { NUSE_Mailbox_Data[mailbox] = *message; NUSE_Mailbox_Status[mailbox] = TRUE; if (NUSE_Mailbox_Blocking_Count[mailbox] != 0) { U8 index; /* check whether a task is blocked */ /* on this mailbox */ NUSE_Mailbox_Blocking_Count[mailbox]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_MAILBOX_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == mailbox)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } else /* mailbox full */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_MAILBOX_FULL; } else { /* block task */ NUSE_Mailbox_Blocking_Count[mailbox]++; NUSE_Suspend_Task(NUSE_Task_Active, (mailbox << 4) | NUSE_MAILBOX_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } } while (suspend == NUSE_SUSPEND);
قد تكون بعض التفسيرات مفيدة.
يتم تضمين الكود في حلقة
do ... while ، والتي تعمل في حين أن معلمة
الإيقاف المؤقت هي
NUSE_SUSPEND .
إذا كان صندوق البريد فارغًا ، يتم تسجيل الرسالة ، وتتغير حالة صندوق البريد للإشارة إلى امتلائها. التحقق من المهام المتوقفة مؤقتًا (التي تنتظر قراءتها) في صندوق البريد هذا. إذا كانت هناك مثل هذه المهام ، يتم استئناف أولها. يتم تعيين متغير التوقف المرحلي إلى
NUSE_NO_SUSPEND ، ويتم إنهاء استدعاء API وإرجاع
NUSE_SUCCESS .
إذا كان صندوق البريد ممتلئًا
والمعلق هو
NUSE_NO_SUSPEND ، فسوف تُرجع استدعاء API
NUSE_MAILBOX_FULL . إذا كان الإيقاف
المؤقت NUSE_SUSPEND ، تتوقف المهمة مؤقتًا. بعد انتهاء الوظيفة (على سبيل المثال ، عند استئناف المهمة) ، إذا كانت القيمة
المرجعة هي
NUSE_SUCCESS (مما يشير إلى أنه تم استئناف المهمة بسبب قراءة الرسالة ، وليس إعادة تعيين صندوق البريد) ، تبدأ الدورة من البداية.
اقرأ صندوق البريد
إن استدعاء الأداة المساعدة Nucleus RTOS API لقراءة صندوق بريد مرن للغاية ويسمح لك بإيقاف المهام مؤقتًا بشكل ضمني أو مع انتهاء المهلة إذا تعذر إكمال العملية على الفور (على سبيل المثال ، عند القراءة من صندوق بريد فارغ). يوفر Nucleus SE خدمة مماثلة ، فقط تعليق المهمة هو اختياري ، ولا يتم تنفيذ المهلة.
اتصل لقراءة صندوق بريد في Nucleus RTOSالنموذج الأولي لمكالمة الخدمة:
STATUS NU_Receive_From_Mailbox (صندوق بريد NU_MAILBOX * ، رسالة VOID ، تعليق غير موقَّع) ؛معلمات:
صندوق البريد - مؤشر لوحدة تحكم صندوق البريد المقدمة من قبل المستخدم ؛
message - مؤشر لتخزين الرسالة المستلمة ، والذي يساوي حجمه أربعة متغيرات من النوع
غير الموقع ؛
تعليق - مواصفات تعليق المهمة ، يمكن أن تأخذ القيم
NUSE_NO_SUSPEND أو
NUSE_SUSPEND أو قيمة المهلة.
القيمة المعادة:
NU_SUCCESS - تم إكمال المكالمة بنجاح ؛
NU_INVALID_MAILBOX - مؤشر صندوق البريد غير صالح ؛
NU_INVALID_POINTER - مؤشر فارغ لرسالة (
NULL ) ؛
NU_INVALID_SUSPEND - محاولة التعليق من دفق غير صحيح (غير مرتبط بمهمة الدفق) ؛
NU_MAILBOX_EMPTY - صندوق البريد فارغ ، ولم يتم تحديد نوع التعليق ؛
NU_TIMEOUT - صندوق البريد لا يزال فارغًا ، حتى بعد إيقاف المهمة مؤقتًا لقيمة المهلة المحددة ؛
NU_MAILBOX_DELETED - تم حذف صندوق البريد أثناء تعليق المهمة ؛
NU_MAILBOX_WAS_RESET - تم إعادة ضبط صندوق البريد أثناء تعليق المهمة.
اتصل لقراءة صندوق بريد في Nucleus SEيدعم اتصال API هذا الوظائف الأساسية لـ Nucleus RTOS API.
النموذج الأولي لمكالمة الخدمة:
STATUS NUSE_Mailbox_Receive (صندوق بريد NUSE_MAILBOX ، رسالة ADDR * ، تعليق U8) ؛معلمات:
صندوق البريد - فهرس
صندوق البريد (ID) ؛
message - مؤشر لتخزين الرسالة المستلمة ، هو أحد المتغيرات من نوع
ADDR ؛
تعليق - مواصفات تعليق المهمة ، يمكن أن تأخذ القيم
NUSE_NO_SUSPEND أو
NUSE_SUSPEND .
القيمة المعادة:
NUSE_SUCCESS - تم إكمال المكالمة بنجاح ؛
NUSE_INVALID_MAILBOX - فهرس صندوق بريد غير صالح ؛
NUSE_INDALID_POINTER - مؤشر فارغ لرسالة (
NULL ) ؛
NUSE_INVALID_SUSPEND - محاولة
للتعليق من دفق غير صحيح أو عندما يتم تعطيل مكالمات API لحظر المهام ؛
NUSE_MAILBOX_EMPTY - صندوق البريد فارغ ، ولم يتم تحديد نوع تعليق المهمة ؛
NUSE_MAILBOX_WAS_RESET - تم إعادة ضبط صندوق البريد أثناء تعليق المهمة.
تطبيق قارئ صندوق البريد في Nucleus SEيتم تحديد إصدار رمز وظيفة واجهة برمجة التطبيقات
NUSE_Mailbox_Receive () (بعد التحقق من المعلمات) باستخدام
الترجمة الشرطية ، اعتمادًا على ما إذا كانت مكالمات واجهة برمجة التطبيقات نشطة للحظر (تعليق المهام) أم لا. سننظر في كلا الخيارين.
إذا تم تعطيل تأمين المهام ، فإن منطق استدعاء API هذا بسيط جدًا ، ولا يتطلب الرمز أي تفسير:
if (!NUSE_Mailbox_Status[mailbox]) /* mailbox empty */ { return_value = NUSE_MAILBOX_EMPTY; } else { /* mailbox full */ *message = NUSE_Mailbox_Data[mailbox]; NUSE_Mailbox_Status[mailbox] = FALSE; return_value = NUSE_SUCCESS; }
تتم قراءة الرسالة من عنصر
NUSE_Mailbox_Data [] المقابل ،
وعلبة البريد فارغة.
إذا تم تنشيط تأمين المهام ، يصبح الرمز أكثر تعقيدًا:
do { if (NUSE_Mailbox_Status[mailbox]) /* mailbox full */ { *message = NUSE_Mailbox_Data[mailbox]; NUSE_Mailbox_Status[mailbox] = FALSE; if (NUSE_Mailbox_Blocking_Count[mailbox] != 0) { U8 index; /* check whether a task is blocked */ /* on this mailbox */ NUSE_Mailbox_Blocking_Count[mailbox]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_MAILBOX_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == mailbox)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } else /* mailbox empty */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_MAILBOX_EMPTY; } else { /* block task */ NUSE_Mailbox_Blocking_Count[mailbox]++; NUSE_Suspend_Task(NUSE_Task_Active, (mailbox << 4) | NUSE_MAILBOX_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } } while (suspend == NUSE_SUSPEND);
قد تكون بعض التوضيحات مفيدة.
يتم تضمين الكود في حلقة
do ... while ، والتي تعمل في حين أن معلمة
الإيقاف المؤقت هي
NUSE_SUSPEND .
إذا كان صندوق البريد ممتلئًا ، يتم إرجاع الرسالة المخزنة ، وتتغير حالة صندوق البريد للإشارة إلى أنها فارغة. التحقق من المهام المتوقفة مؤقتًا (التي تنتظر التسجيل) في صندوق البريد هذا. إذا كانت هناك مثل هذه المهام ، يتم استئناف أولها. يتم تعيين متغير التوقف المرحلي إلى
NUSE_NO_SUSPEND ، ويتم إنهاء استدعاء API وإرجاع
NUSE_SUCCESS .
إذا كان صندوق البريد فارغًا وكانت معلمة
التوقف المرحلي هي
NUSE_NO_SUSPEND ،
فسوف تُرجع استدعاء API
NUSE_MAILBOX_EMPTY . إذا كان الإيقاف
المؤقت NUSE_SUSPEND ، تتوقف المهمة مؤقتًا. إذا كانت قيمة الإرجاع في نهاية المكالمة هي
NUSE_SUCCESS ، مما يشير إلى أنه تم استئناف المهمة لأنه تم إرسال الرسالة (وليس إعادة ضبط صندوق البريد) ، تبدأ الدورة من البداية.
ستبحث المقالة التالية في مكالمات API الإضافية المرتبطة بصناديق البريد ، بالإضافة إلى بنيات البيانات المقابلة.
نبذة عن الكاتب: يعمل Colin Walls في صناعة الإلكترونيات لأكثر من ثلاثين عامًا ، ويكرس معظم وقته للبرامج الثابتة. وهو الآن مهندس برامج ثابتة في Mentor Embedded (قسم من Mentor Graphics). غالبًا ما يتحدث كولين وولز في المؤتمرات والندوات ، مؤلف العديد من المقالات الفنية وكتابين عن البرامج الثابتة. يعيش في المملكة المتحدة.
مدونة كولين المهنية ، البريد الإلكتروني: colin_walls@mentor.com.