وحدة تحكم لعبة stm32

عدد قليل من الرماة stm32 ؛ كيف ، لماذا ، ماذا حدث.



مقدمة


لكوني من المعجبين بمدرسة الرماة "القديمة" من جهة والمطور المضمن من جهة أخرى ، كنت أتساءل دائمًا عن كيفية ولماذا تمكن مؤلفو تلك الحقبة من تنفيذ نوع جديد يتطلب أساليب جديدة تمامًا على أجهزة "متواضعة" جدًا. وقررت أن أحاول إطلاق شيء مشابه باستخدام الحلول المستندة إلى MK الحديثة - هنا توجد موارد معدنية عارية و "متواضعة" وأداة تصحيح أخطاء قوية إلى حد ما (stm32 ، IMHO). وهكذا ، وقع اختياري على لوحة تطوير الاكتشاف stm32f769i.

ملاحظات


في الوقت الحالي ، لا يمكن التجميع إلا من بيئة Keil MDK (أداة تحميل التشغيل ، الألعاب) أو باستخدام arm-gcc + make (أداة تحميل التشغيل فقط). المنافذ المتوفرة حاليًا لـ Quake I (+ mods) و Doom (+ mods) و Duke Nukem (+ mods) و Hexen و Heretic. مع جميع التعديلات ، يمكن توسيع القائمة بشكل كبير.

لنبدأ


في هذه المقالة سأحاول أن أوجز بإيجاز الأفكار والمبادئ الرئيسية لتنفيذها على طريق إنشاء وحدة تحكم لعبة خاصة لاكتشاف stm32f769i. أيضًا ، سأحاول تجنب التفاصيل الفنية التفصيلية ، بل أفضل السعي إلى تقديم القارئ إلى خيار آخر لاستخدام MK الحديث. من خلال "وحدة التحكم في الألعاب" - أعني جهازًا مستقلاً لديه القدرة على تشغيل تطبيقات "المستخدم" دون تحديث البرنامج الرئيسي.

هندسة معمارية


نظرًا لأن التنفيذ النهائي يتطلب القدرة على تشغيل ألعاب مختلفة بشكل مستقل دون تحديث البرامج الثابتة لـ MK ، نشأت حاجة لبعض إصدارات "bootloader" ، لذلك:

  1. لودر العمل مع الذاكرة - "تثبيت" تطبيق (لعبة) ، إطلاق.
  2. سائق؛ خدمة مستوى نظام HAL والوظائف ذات الصلة ، نقل واجهة برمجة التطبيقات إلى التطبيق.
  3. تطبيق؛ لا يعيد البرنامج النهائي التحكم إلى أداة تحميل التشغيل.

1. برنامج Bootloader


يعتمد على نموذج IAP (In-Application-Programming) - برامج التشغيل باستخدام مثال من ST-microelectronics.

تكمن خصوصية هذا النهج في أنه لا توجد حاجة لتغيير تكوين التمهيد MK. إن
"جسم" محمل الإقلاع بالكامل موجود في الذاكرة الرئيسية ، وهذا بدوره يسمح باستخدام اكتشاف stm32f769i "خارج الصندوق".

الوظيفة الرئيسية لهذا المستوى هي قراءة ملف .bin ، وكتابة محتوياته إلى ذاكرة MK ونقل التحكم. في هذه المرحلة ، النقطة الأساسية هي قراءة عنوان نقطة الدخول وعنوان مؤشر المكدس ، والثاني غير مطلوب ، لأن التطبيق لا يعيد التحكم -
المكدس مشترك وليس هناك حاجة لإعادة كتابة المؤشر. يمكن إجراء مكالمة أيضًا من خلال مؤشر للدالة. وبالتالي ، ستكون النتيجة محمل "هجين" - يستمر جزء "برنامج التشغيل" الخاص به في خدمة التطبيق ، بينما يتم تفريغ موارد المحمل نفسه.

2. سائق


يتم صنع برنامج التشغيل على شكل "غلاف" أعلى من مستوى HAL ، مما يوفر الوصول إلى الموارد الضرورية - نظام الملفات ، الشاشة \ الشاشة ، الصوت ، جهاز التحكم في اللعبة / جهاز استشعار العرض. للاستخدام الإضافي ، يتم إرسال واجهة برمجة تطبيقات برنامج التشغيل في شكل بنية مؤشر من خلال "الذاكرة المشتركة" - جزء من الذاكرة محجوز لكل من أداة تحميل التمهيد وجانب الإرجاع. يتطلب مثل هذا التلاعب تكاليف الذاكرة ، وربما يكون الحل الأفضل هو استخدام SWI (مكالمة ناعمة ، svc call) ، ولكن في المقابل ، يجب أن تكون قادرًا على تغيير السياق - لأن لا يمكن معالجة جميع المكالمات في مقاطعة. أيضًا ، يتم استخدام الذاكرة "المشتركة" لتمرير حجج المستخدم (على سبيل المثال ، من خلال وحدة التحكم) ، والشرط المسبق هو إضافة السمة no-init لهذا القسم ،سيؤدي ذلك إلى تجنب الكتابة فوقها في مكتبة وقت التشغيل في وقت تهيئة تطبيق المستخدم.

3. التطبيق


ونتيجة لذلك ، فإن الشيء الوحيد الذي تحتاج إلى معرفته في وقت إنشاء التطبيق هو بنية قلب المعالج ، ولا توجد تبعيات من HAL ، ولا يوجد أيضًا جدول لمتجهات المقاطعة ، وتتم معالجة جميع المقاطعات بواسطة اللودر. ونتيجة لذلك ، يستخدم التطبيق مساحة أقل بكثير في ذاكرة البرنامج - ويرجع ذلك إلى حقيقة أن جزءًا من الوظيفة "محمي" جنبًا إلى جنب مع برنامج تحميل / برنامج التشغيل ، مما يسمح لك بتثبيته في منطقة بيانات SRAM (ذاكرة الوصول العشوائي الداخلية). وهذا بدوره يمكن أن يقلل بشكل كبير من عدد دورات الكتابة في ذاكرة الفلاش ويسرع أيضًا عملية التصحيح والتنفيذ بشكل عام. من السلبيات - في وقت التصحيح ، من الممكن استدعاء التطبيق فقط من الخارج ، على سبيل المثال ، باستخدام أمر من وحدة التحكم (منفذ COM عبر ST-Link ، VCOM) ، لهذا يتم استخدام نسخة مبسطة جدًا من سطر الأوامر.

الموارد:

لودر ، هال ، سائق

ميزات التطوير


ذاكرة


أول شيء تعاملت معه كان مشكلة تخصيص مورد ذاكرة خارجي (SDRAM). ويرجع ذلك إلى حقيقة أن بعض الألعاب تتطلب ذاكرة أكبر لقسم .bss (duke nukem ~ 5.5mbytes). وضع مثل هذا الحجم ممكن فقط في sdram ، ولكن لأنه يتم استخدام نفس الذاكرة من قبل برنامج bootloader لتخزين البيانات المؤقتة - الصور والصوت ومحتويات الملف ، وما إلى ذلك .. ، وهي ضرورية فقط قبل بدء التطبيق - تقرر تقسيم إدارة هذا الجزء من الذاكرة - على كل جانب يوجد malloc / مجاني خاص به. بعد البدء - يستخدم برنامج التشغيل مؤشرات إلى وظائف malloc \ free ، والتي ، إذا لزم الأمر ، يتم تمريرها كمعلمة لوظيفة الاستدعاء. أي ، بعد بدء اللعبة ، لا يمكن للسائق إجراء التخصيص مباشرة من sdram.حقيقة مثيرة للاهتمام حول D-Cache و I-Cache - نظرًا لخصائص معالجة الذاكرة الخارجية - يجب عليك إيقاف تشغيل كلا الخطين قبل البدء ، لأن تمت إعادة تهيئة sdram ، كل شيء سيكون على ما يرام ، ولكن هناك "ولكن" واحد - يجب عليك دائمًا إبطال ذاكرة التخزين المؤقت ، وإلا ، فهي تحافظ افتراضيًا على الحالة الصالحة لجميع الأسطر ، بينما تم استبدالها في الفاصل الزمني عندما تم إيقاف ذاكرة التخزين المؤقت.
ميزة أخرى - يتم وضع جميع بيانات محمل الإقلاع في قسم DTCM ، وهذا يسمح بعدم استخدام ذاكرة التخزين المؤقت عند الوصول إلى الذاكرة (يسمح MPU بالشيء نفسه) ونتيجة لذلك - يتم حل مشاكل التماسك عند العمل مع DMA ؛
بالتزامن - CPU -> D-Cache -> Memory <- DMA

الفنون التصويرية


بالنسبة للجزء الأكبر ، هذه العديد من وظائف تحجيم الصور (2x2 ، 3x3) ،
ووظيفة التهيئة وتحميل اللوحة. النقطة الأساسية هي الإشارة الصحيحة لسمات ذاكرة الإطار (تتم من خلال تكوين MPU) - بالنسبة إلى أداة تحميل التشغيل ، سيكون "إعادة الكتابة ، عدم تخصيص الكتابة" ، لإزالة تأثير الوميض ، كما يتم استخدام وضع المخزن المؤقت الفردي ، بينما يستخدم التطبيق "الكتابة من خلال ، عدم تخصيص الكتابة" ، مما يحقق أعلى FPS (Doom ~ 28-40).

تعمل جميع منافذ الألعاب الحالية مع رسومات 8 بت ، ولكن من الممكن أيضًا التبديل إلى وضع الألوان الحقيقية 16 بت (يتطلب التعديل من جانب اللعبة).
من الممكن قياس صورة 8 بت باستخدام DMA2D ، لكن هذا النهج لم يؤتي ثماره - يكلف ~ 1000 مقاطعة مطلوبة لمعالجة صورة بدقة نهائية 640 × 480 بكسل ، كما أنه يولد الكثير من القطع الأثرية في الألعاب - صور فردية (sprites ، المضلعات) لن يتم تقديمها بالكامل ، لأن في هذه الحالة ، ستحدث عملية العرض بالكامل في اللعبة بالتوازي مع رسم الشاشة.

صوت


هذا الجزء مصنوع على شكل برنامج بسيط 16 بت ، خلاط 16 قناة استنادًا إلى أمثلة من ST-microelectronics ، يتم استخدام وحدة تحكم I2S أيضًا. في الوقت الحالي ، لا توجد طريقة لتحويل تنسيقات الصوت فيما بينها - يتم تنفيذ هذا الجزء على مستوى اللعبة اعتمادًا على المتطلبات. ديوك نوكيم ، في رأيي ، لديه أغنى مجموعة من الأدوات للعمل مع الصوت ، بما في ذلك والصدى.

أدخل


يتم تصنيع برنامج تشغيل عصا التحكم أيضًا باستخدام فئة usb-hid (في الواقع ، سيتم تعريف لوحة الألعاب على أنها ماوس كمبيوتر ..). مستشعر العرض - مثل لوحة الألعاب ، يستخدم نفس القناة لإرسال الأحداث ، وهو أمر غير مريح للغاية.

ألعاب


الموت


و stm32doom اتخذ الميناء باعتباره أساس ،
واضاف لدعم الصوت، مصححة مع أحدث الشوكولاته العذاب التغييرات ، وأضيفت بعض التصويبات بسبب Killough، من prBoom. تسمح لك اللعبة باستخدام جميع التعديلات والخرائط المتاحة لموت الشوكولاتة ، بما في ذلك تمت إضافة مشهد وصوت من إصدارات 3DO و PS1 من اللعبة. تمت إضافة تحسين الرسومات - يعتمد دقة عرض النسيج على المسافة ، والحل هو ذلك في مواقع مختلفة - مكاسب + 3-7 إطارات في الثانية. متاح. يضيف الإصدار الأخير أيضًا دعمًا للعفاريت "الشفافة" - كل شيء مبني على الجدول الذي تم إنشاؤه من مجموعات عناصر لوحة الألوان - يتم استخدام شيء مشابه في Quake II والألعاب المستندة إلى محرك البناء. مدفوع اللعبة. التعديلات يمكن أن تكتمل بالكامل.

مصادر:

stm32doom ، 3DO doom ، شوكولاتة الموت ، الإصدار الحالي

دوق نوكيم


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

الموارد:

دوق الشوكولاتة ، الإصدار الحالي

الزلزال


لسوء الحظ ، لم يتم حفظ الرابط إلى المستودع الأصلي ولا يمكنني العثور عليه ،
تم تنفيذ المنفذ تحت اسم sdl الزلزال. من بين الميزات ، تجدر الإشارة إلى وجود بنية خادم عميل ، مكدس "شجاع" للغاية (~ 700 كيلوبايت) بسبب العديد من المواقف المثيرة للاهتمام التي ظهرت لأول مرة (لا يراقب armcc استخدامه حقًا) ، مشاكل واسعة النطاق مع المحاذاة - ربما هذه المخاوف فقط armcc للمترجم ، ولكن في كل مكان تقريبًا حيث يكون هناك جاذبية لعنصر من الهيكل أكبر من بايت واحد في الحجم - تحتاج إلى استخدام وظيفة المجمع لقراءة / كتابة بايت خلاف ذلك - استثناء خطأ صعب. اللعبة جيدة جدا "الذهاب" ، بمتوسط ​​fps ~ 15. يمكن أيضًا إكمال العديد من الحلقات ، أكثر أو أقل راحة فقط عند مستوى الصعوبة الأول :)

الموارد:

الإصدار الحالي

هكسين ، زنديق


بالنسبة للجزء الأكبر ، يرثون محرك Doom ، لذلك من وجهة نظر النقل ، فإنهم متطابقون تقريبًا (IMHO). في hexen أضاف القدرة على بدء اللعبة في الموقع المحدد ، لا يمكن إكمال الألعاب بالكامل.

الموارد:

hexen stm32 و heretic stm32

نتيجة


Doom ، Duke Nukem ، Quake

شكرًا لك على اهتمامك.

All Articles