الهدف من هذه الدورة هو شرح كيفية برمجة المعالجات التحكمية بالاعتماد على المكتبة Syra uOS .
تم تطوير المكتبة لتسهيل برمجة المعالجات التحكمية ، بحيث يصبح تركيز المبرمج على الهدف المطلوب منه بدلاً من الإنشغال بكتابة الأوامر المتكررة والكثيرة والمتشعبة .
هذه المكتبة مكتوبة بلغة البرمجة C ويمكن استخدامها في أي بيئة برمجة تستخدم GCC أو GNU C Compiler .
قبل البدء في شرح الدورة يجب أن يكون لدى القارئ معلومات أساسية عن المعالجات التحكمية و عن البرمجة بلغة البرمجة C .
أيضا للملاحظة نحن نستخدم بيئة البرمجة Microchip Studio ، لكن يمكن استخدام هذه المكتبة مع أي بيئة برمجة أخرى تعتمد على المترجم أو الكومبايلر GNU C Compiler .
لمحة عن البرمجة التقليدية للمعالجات التحكمية
عادة يقوم المبرمجين بكتابة البرامج بالاعتماد على لغة البرمجة C , بالطريقة التقليدية البسيطة بحيث يكون البرنامج عبارة عن سلسلة من الأوامر متتالية فوق بعضها البعض ضمن الدالة الرئيسية main . بحيث يبدأ البرنامج ببعض عمليات التهيئة ، مثل إعدادات وحدة الاتصال التسلسلي USART . أو ضبط إعدادات المحول التماثلي الرقمي ADC . و تحديد الأطراف المستخدمة من المعالج ، وتخصيص أي منها دخل وخرج وهكذا …
ثم بعدها القسم الرئيسي من البرنامج , الذي يتضمن الأوامر المطلوب تنفيذها خلال التطبيق.
وهذا مثال عن برنامج بسيط مكتوب بلغة البرمجة C . لمعالج تحكمي من نوع AVR XMega :
#include <avr/io.h> #include <util/delay.h> void main() { PORTB_DIRSET = PIN0_bm; while(1) { PORTB_OUTTGL = PIN0_bm; _delay_ms(500); } }
في المثال السابق نرى في البداية الأمر
PORTB_DIRSET = PIN0_bm
وظيفته تحديد الطرف الأول PIN0 من البوابة PORTB على أنه خرج ، مثلا للتحكم بتشغيل وإطفاء ضوء .
ثم بعدها نجد الحلقة while . وهي في هذه الحالة حلقة لانهائية متكررة .
عادةً تمثل هذه الحلقة نواة البرنامج , وفي هذاالمثال في كل دورة منها يقوم المعالج بتنفيذ أمرين :
الأمر الأول : PORTB_OUTTGL = PIN0_bm
يقوم بتغيير حالة الطرف PIN0 من البوابة PORTB ، الذي بدوره يتحكم بتشغيل الضوء المتصل مع هذا الطرف .
والأمر الثاني : delay_ms , أن ينتظر المعالج 500 ميلي ثانية قبل اعادة تنفيذ الحلقة من جديد .
هذا كان مثال بسيط جدا عن برنامج لتشغيل ضوء بشكل متقطع يومض مرة كل ثانية .
ولكن ماذا لو أردنا التحكم بأكثر من ضوء بشكل منفصل تماما وبفترات زمنية مختلفة ومتغيرة .
أو ماذا لو أردنا أيضاً أن نرسم على شاشة نقطية Graphic .
أو نقرأ قيم بعض الحساسات ، ونجري بعض الحسابات الرياضية في نفس الوقت بدون أن تتأخر باقي العمليات .
عندها سوف نضطر للقيام بحسابات دقيقة لحلقات التأخير ، وتوزيع التعليمات البرمجية بشكل معقد وغير منظم . وربما نستخدم العدادات ومقاطعاتها لحل هذه المشكلة .
ربما نستطيع تنفيذ المطلوب في النهاية . ولكن المشكلة تكمن عندما تزداد الأسطر في البرنامج وتصبح كثيرة كفاية ، عندها من الصعب التمييز بين الأوامر، من حيث الأولوية . ومن حيث الأهمية الزمنية , وكذلك تكثر الاخطاء البرمجية .
والأهم من ذلك . أن البرنامج سوف يكون غير منظّم . ويصعب على المبرمج بعد فترة من الزمن أن يتذكر ماذا فعل عندما كان يكتب البرنامج . وسيضطر لقرائة جميع أسطر البرنامج ليتذكر بعضاً منه وهذا من أجل ربما تعديل صغير لا يستحق كل هذا العناء .
من هنا تنطلق فكرة استخدام المكتبة Syra uOS . التي تتعامل مع البرنامج على أنه أجزاء منفصلة كل منها يعمل لوحده وكأنه برنامج مستقل أو مهمة مستقلة ، لها عملياتها وحساباتها الزمنية الخاصة بها ، دون أن يؤثر على عمل باقي المهام في البرنامج .
فإذا أردنا التعديل في مهمة معينة , لا داعي لقرائة باقي المهام أو التفكير العميق في تسلسل العمليات في كامل البرنامج .
الحل باستخدام المكتبة Syra uOS
عند استخدام هذه المكتبة يتم التعامل مع أجزاء البرنامج على أنها مهام .
كل مهمة نسميها Task ، وهو عبارة عن تابع عادي نكتب فيه الأوامر التي نريد من هذا التاسك أن ينفذها .
وتقوم نواة النظام بإدارة هذه المهام وتنفيذها بشكل متتابع ، مهمة تلو الأخرى ضمن حلقة لا نهائية .
الشكل التالي يبين مخطط تسلسل تنفيذ العمليات من المعالج عند استخدام هذه المكتبة :
حيث بعد توصيل الكهرباء للمعالج يقوم النظام الخاص بالمكتبة ببعض عمليات التهيئة .
ثم ينتقل التنفيذ لنواة النظام . حيث تقوم بتنفيذ المهام المكتوبة واحدة تلو الأخرى .
ثم يتم اعادة تنفيذ المهام بشكل متكرر . حتى يتم الطلب من النظام الخروج من حلقة تنفيذ المهام .
طبعا هذا مخطط مختصر للتبسيط والتوضيح . وهناك الكثير لنتعلمه عن هذه المكتبة في المراحل القادمة .
ملاحظة مهمة
يجب أن يتم الانتباه بعدم استخدام الحلقات الغير منتهية . وعدم استخدام توابع التأخير الزمني delay إلا عند الضرورة .
وإذا اضطر الأمر لاستخدامها يجب الأخذ بعين الاعتبار أن جميع المهام متوقفة بانتظار هذه الحلقة حتى تنتهي .
قلنا في البداية أن هذه المكتبة هي عبارة عن نظام غير متزامن تعتمد على مبدأ الأحداث . أي أن تتابع عمليات البرنامج تتم على أساس وجود حدث معين . ومن يقوم بإدارة هذه الأحداث هو نواة النظام .
لذلك يجب عدم تأخير نواة النظام عن معالجة الأحداث وإدارة باقي العمليات في المشروع .
وما تقدمه المكتبة من ميزات وتسهيلات ومرونة . يتم القضاء عليه بالاستخدام الخاطئ والإكثار من حلقات التأخير الغير مبررة .
فالمكتبة توفر بديل أفضل لإدارة الزمن . مما يسمح باستخدام موارد المعالج بالشكل الأمثل .
في الخطوة التالي نتعلم عن مكونات هذه المكتبة , وكيفية إنشاء مشروع جديد . وكتابة المهام .
المكتبةSyra uOS للمعالجات التحكمية – الأساسيات