Consulting Services
تدوينات مصغرةلغة سي و متحكمات

وثيقة تطبيقيّة: نصائح وحيل لتحسين كود السي لمتحكمات الـ 8 بت الصغريّة

بعكس تطوير البرمجيات – الذي يتوفر فيه نسبيّاً كمية جيدة من الذاكرة وقوّة المعالجة – إنّ كل بايت في تطوير الإلكترونيات مهم وذلك لمحدوديّة الذاكرة ومقدرة المعالجة. لذلك يجب اتباع قواعد لتحسين الكود من أجل توفير مساحة الذاكرة وأداء أسرع.

شركة ATMEL قامت بتجميع 11 نصيحة من هذا النوع في وثيقة تطبيقيّة Application Note تستحق المشاركة. بدأت الوثيقة بتعريف ببنية معالج الـAVR و مترجم الجي سي سي AVR GCC compiler والذي لديه 5 سويات من التحسين optimization -O0, -O1, -O2, -O3 and -Os.

نصائح وحيل لتخفيض استهلاك الذاكرة

إن البيئة التطويريّة المستخدمة لإنجاز هذه الوثيقة تحتوي:

  • IDE: Atmel AVR Studio 5.
  • Toolchain: AVR_8_bit_GNU_Toolchain_3.2.1_292.
  • Hardware: Atmel ATmega88PA.

تذكّر أن: في نص نتيجة الترجمة باستخدام المترجم GCC يحوي على ثلاث أماكن في الذاكرة:
“text” وتحوي الجزء الذي سيتم تخزينه في الذاكرة فلاش Flash و “data” وتحوي المتحولات العامة Global التي لها قيم أوليّة غير صفريّة و “bss” وتحوي المتحولات Global دون قيم أوليّة. إن المكانين الأخيرين يتواجدان في الذاكرة SRAM. لمعلومات أكثر اطلع على مقالة MCUoneclipse.

استخدم نوع المعطيات المناسب. لا تهدر الذاكرة

optimize c code: Use right variable length

هذا مثال واضح على إهدار الذاكرة وذلك من خلال استخدام متحول بحجم أكبر من المطلوب أصلاً. إن السجل ADCH هو سجل بطول 8 بت فقط.

المتحولات العامّة Global مقابل المتحولات المحليّة Local

optimize c code: global vs local variables

إن المتحولات العامّة Global لديها مكان محجوز في الذاكرة SRAM بينما المتحولات المحليّة Local فإنه يتم استخدام سجلات أو مكان في المكدّس Stack عند تعريف هذه المتحولات وبعد أن ينتهي تنفيذ التابع function الذي تم تعريف هذه المتحولات المحليّة فيه فإنه يمكن حذفها. لذلك يتم تآكل المساحات في الذاكرة SRAM عند استخدام المتحولات العامّة.

يتم تنفيذ كود إضافي في حال وجود المتحولات العامّة من أجل تهيئتها بقيمها عن بداية كل إقلاع للمتحكم الصغري (بعد إعادة التشغيل).

تخزين الثوابت في ذاكرة البرنامج Flash

Optimize C code: Contants in program space

وجود الكثير من المتحولات العامّة أو المحليّة بقيم بدائية غير صفرية يعني تآكل في المساحات في الذاكرة SRAM حيث يتم تخزين هذه القيم في الذاكرة SRAM من أجل تهيئة المتحولات بهذه القيم لاحقاً. حالة أخرى: Serial.print(“Hello World\n”). إن الجملة Hello World سيتم تخزينها في الذاكرة SRAM. لذلك وجود متحولات وتوابع بوسطاء arguments ثابتة كثيرة تؤدي في النهاية لتآكل المساحات الحرّة في الذاكرة.

المزيد من النصائح يمكن متابعة قراءتها في الوثيقة التطبيقية application note.

Yahya Tawil

مؤسس عتاديات وأسعى لدعم المحتوى العربي عن النظم المضمنة في الويب العربي. خبرتي في مجال النظم المضمّنة تتركز في كتابة البرامج المضمنة وتصميم الدارات المطبوعة والمخططات وإنشاء المحتوى.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.

زر الذهاب إلى الأعلى