مرحبا اصدقاء!نيكولاي معك مرة أخرى ، في المقالة الأخيرة "
DevBoy - كيف أنشأت مشروع جهاز مفتوح المصدر وأطلقت مشروعًا على Kickstarter " ، كان التركيز أكثر على المظهر والأجهزة ، اليوم سنتحدث عن كيفية القيام بذلك "في
الداخل " ونحلل جزء البرنامج.

من يهتم - أطلب قطة.
كما ذكرنا سابقًا ، يعتمد المشروع على متحكم
دقيق STM32F415RG من STMicroelectronics على نواة ARM Cortex-M4. هناك العديد من IDEs المختلفة لتطوير المتحكمات الدقيقة لهذه المتحكم الدقيق ، ومع ذلك ، بالنسبة لمشروع مفتوح المصدر ، تحتاج على الأقل إلى IDE مجاني ، ويفضل أن يكون مفتوح المصدر. بالإضافة إلى ذلك ، لا يزال يجب دعم IDE في
STM32CubeMX . في الوقت الذي بدأت فيه العمل في هذا المشروع ، كان هناك IDE واحد فقط استوفى جميع هذه المتطلبات -
System Workbench لـ STM32 .
في الوقت الحالي ، هناك Atollic TrueStudio ، الذي أصبح مجانيًا بعد أن اشترته STMicroelectronics.
البرنامج التالي المستخدم هو
STM32CubeMX . هذا البرنامج هو أداة لتكوين الأجهزة الطرفية متحكم باستخدام واجهة رسومية.

والنتيجة هي رمز يتضمن
H ardware
A bractionion
L ayer (HAL). العديد من المبرمجين لا يحبون هذا "
الخلق " حقًا ، فهو لا يخلو من الأخطاء ، ولكنه مع ذلك يبسط إلى حد كبير تطوير ويحسن قابلية نقل البرامج بين وحدات التحكم الدقيقة المختلفة من STMicroelectronics.
بالإضافة إلى ذلك ، أثناء التكوين ، يمكنك تحديد استخدام بعض برامج الجهات الخارجية مفتوحة المصدر مثل
FreeRTOS و
FatFS وبعض البرامج الأخرى.
لقد انتهينا من وصف البرنامج المستخدم ،
فلننتقل الآن إلى الجزء الأكثر إثارة للاهتمام -
DevCore . يأتي الاسم من "
التنمية الأساسية " فلنذهب بالترتيب.
بادئ ذي
بدء ، هو
C ++ RTOS Wrapper (
FreeRTOS في هذه الحالة ). مطلوب Vrapper لسببين:
- من الأفضل إنشاء كائن ، ثم استدعاء كائن المزامنة () ، على سبيل المثال ، بدلاً من إنشاء مقبض ، واستدعاء وظيفة الإنشاء ، ثم تمرير هذا المقبض إلى جميع وظائف كائن المزامنة
- إذا كان من الضروري استبدال RTOS ، يكفي استبدال الغلاف ، وليس كل المكالمات إلى وظائف RTOS من التعليمات البرمجية
ليس من المنطقي إحضار كود الغلاف هنا ، من يهتم -
نحن ننظر إلى GitHub ،
وننتقل .
الجزء التالي هو
إطار التطبيق . هذه هي الفئة الأساسية لجميع المهام. نظرًا لأن هذين ملفين صغيرين نسبيًا فقط ، فمن المنطقي إدراجهما بالكامل:
يمكن للفصول الموروثة تجاوز 4 وظائف افتراضية:
- Setup () هي وظيفة يتم استدعاؤها قبل بدء المهمة. يتم ضمان اكتمال الرمز في جميع هذه الوظائف لجميع المهام قبل تنفيذ الدورات الرئيسية.
- Loop () - دورة المهمة الرئيسية ، حيث تنظم المهمة نفسها ما تريد. لا يمكن استخدامها مع الدالتين التاليتين.
- TimerExpired () - دالة تسمى بشكل دوري بفاصل زمني معين. مناسب لتنفيذ اقتراع جهاز استشعار على سبيل المثال.
- ProcessMessage () - وظيفة لمعالجة الرسائل من المهام الأخرى.
تقوم الدالتان الأوليان بتنفيذ "
Arduino-Style " للمهام.
يقوم الاثنان التاليان بتنفيذ نظام "
الحدث " الذي يبسط تفاعل المهام. باستخدام هذا النهج ، تنفذ المهمة واجهة خارجية في شكل وظائف ترسل بيانات لإرسالها إلى المهمة من خلال صندوق بريد داخلي. باستخدام هذا النهج ، لا يحتاج المستخدم الذي يستخدم هذه الواجهة إلى القلق في أي سياق يتم تنفيذ الإجراءات. صحيح ، هذا ممكن فقط للمستوطنين أو الفرق. بالنسبة إلى getters ، من الأفضل استخدام نسخ المزامنة ونسخ البيانات لمنع التقاطها لفترة طويلة.
تم رصد هذا النهج عندما كنت أقوم بتطوير برنامج للمعدات الطبية. يحتوي المتحكم الدقيق على جهاز
مراقبة واحد
، وفي حالة العديد من المهام ، تحتاج إلى تتبعها جميعًا. لهذا ، كانت هناك مهمة منفصلة تخدم المراقبة وتلقى رسائل من المهام الأخرى المرسلة من وظيفة TimerExpired (). إذا لم تكن هناك رسائل خلال الفترة الزمنية للمهمة * ، ماتت المهمة ،
نطفئ الضوء ونتخذ إجراءات لإيقاف جميع الغدد التي تؤثر على المريض.
جميع المهام فردية ، لا يمكنك إنشاؤها مباشرة ، ولكن يمكنك الحصول على رابط للمهمة. للقيام بذلك ، تطبق كل مهمة أسلوب
GetInstance () ثابت:
تتضمن أيضًا مهام
إخراج الصوت ووحدات الإدخال وصيانة الشاشة.إن مهمة
إخراج الصوت بسيطة للغاية - فهي تتلقى مجموعة من الترددات والمدد وتغيير إعدادات المؤقت بشكل دوري لتوليد نبضات مستطيلة لتردد معين.
إن مهمة صيانة
وحدات المياه بسيطة للغاية. من النقاط المثيرة للاهتمام ، يتم اكتشاف الوحدة تلقائيًا: أولاً ، باستخدام ADC ، نقوم بقياس الجهد ، إذا كان في النطاق من 25 ٪ إلى 75 ٪ من جهد الإمداد ، يتم إدخال عصا التحكم التناظرية ، وإلا الأزرار أو التشفير. إذا لم يكن عصا التحكم ، تحقق من السطر الرابع من وحدة الإدخال / الإخراج: إذا كانت على مستوى عالٍ ، فهذه الأزرار (
يتم سحب جميع الأزرار حتى التشغيل ، وعند الضغط على الأزرار ، يتم إغلاقها على الأرض ) ، إذا كانت منخفضة ، فهي أداة ترميز (
يتم سحب زر صغير لأعلى) على الأرض وعندما تضغط على السلطة ).
مهمة صيانة الشاشة هي المهمة الأكثر إثارة للاهتمام. بادئ ذي بدء ، تبلغ الشاشة 320 × 240 × 16 بت ، لذلك تحتاج إلى 153600 بايت لـ Framebuffer. هذا ليس كثيرًا فحسب ، بل إنه ضخم للغاية - في وحدة التحكم الدقيقة هذه يوجد 192 كيلو فقط من ذاكرة الوصول العشوائي ، وفي وحدات التحكم الدقيقة قد يكون من الأسهل ألا يكون لديك الحجم المناسب على الإطلاق. كيف تكون؟ الجواب بسيط: ارسم الشاشة في أجزاء! ولكن يمكنك رسم شيء بطرق مختلفة ...الحل الذي تقدمت به لهذه المهمة هو مثل كل عبقري. يحتوي على مخزن مؤقت على خطين للشاشة. في سطر واحد ، نرسم كل ما يجب أن يكون ، نرسله إلى الشاشة عبر SPI في وضع DMA ، وفي هذا الوقت يمكننا إعداد خط آخر.كيف تعرف المهمة ما يجب أن يكون في السطر وكيف ترسمه؟ لكنها لا تعرف!ولكن لديها قائمة من الأشياء التي تعرف كيف ترسم نفسها. كل كائن من هذا القبيل موروث من فئة VisObject .تمر مهمة صيانة الشاشة لكل سطر من خلال قائمة الكائنات وتستدعي وظيفة DrawInBufW () ، وتمريرها إلى المخزن المؤقت ، وعدد النقاط ، والخط المراد رسمه وموضع البداية ( حتى تم استخدام فكرة استخدام وضع وحدة تحكم الشاشة لتحديث النافذة ). في الواقع ، كل كائن يرسم نفسه فوق الكائنات الأخرى المرسومة بالفعل ومن السهل ترتيب الكائنات بالترتيب المطلوب ببساطة عن طريق وضعها في الموضع المطلوب في القائمة.بالإضافة إلى ذلك ، فإن هذا النهج يجعل من السهل دمج معالجة الكائنات النشطة - بعد تلقي الإحداثيات من وحدة تحكم الشاشة التي تعمل باللمس ، يمكن لمهمة صيانة الشاشة الانتقال من خلال ورقة العمل من النهاية بحثًا عن الكائن النشط الذي يقع في إحداثيات الضغط. إذا تم العثور على مثل هذا الكائن ، يتم استدعاء الوظيفة الافتراضية Action () للكائن المحدد.في الوقت الحالي ، هناك كائنات للخطوط والبدائية ( الخط والمربع والدائرة ) والصور وخرائط البلاط ( لإنشاء الألعاب ).أيضا في DevCore يدخل رمز آخر لبعض عناصر واجهة المستخدم ( مثل قائمة )، واجهة للسائق I2C، سائق I2C والمكتبات للعمل مع جهاز استشعار BME280 وEEPROM 24S256، ولكنها ليست مثيرة للاهتمام لذلك، وبعد وأنا لن وصف - واتضح كبيرة جدا .الكود الكامل متاح بدون تسجيل ورسائل نصية قصيرة على GitHub : https://github.com/nickshl/devboyPS يبدو أن الشركة تذهب إلى Epic Fail. في الأسبوع الأول ، ثلاثة خبازين فقط ، بما في ذلك دولار من نوع ما من " صندوق الابتكار ""، 180 دولارًا من شخص ربما تعلم عن هذا المشروع من مقال عن حبري ( شكرًا لك ، أندري! ) والباقي من زميلي من مكعب مجاور.عدم جمع المال ليس مشكلة. المشكلة هي عدم الاهتمام بالمشروع ...