المكتبة Syra uOS للمعالجات التحكمية – المقدمة

الهدف من هذه الدورة هو شرح كيفية برمجة المعالجات التحكمية بالاعتماد على المكتبة  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 للمعالجات التحكمية – الأساسيات