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

معرفة معلومات دقيقة عن استهلاك الذاكرة في المتحكمات من ملف map.

يحوي الملف map. المولّد من GCC-toolchain معظم المعلومات التفصيلية اللازمة لمعرفة استهلاك الذاكرة في المتحكمات. فالرموز symbols والتي تشمل التوابع والمتحولات مذكورة في هذا الملف إلى جانب عنوان الذاكرة وحجمها وفي أي قسم section من الذاكرة تقع.

نستطيع أن نجد في هذا الملف على سبيل المثال:

  •  memory configuration أو خريطة الذاكرة memory map

Memory Configuration

Name             Origin             Length             Attributes
FLASH            0x0001f000         0x00055ffc         xr
FIRTRUN          0x00074ffc         0x00000004         r
RAM              0x20002560         0x0000d7a0         xrw
NOINIT           0x2000fd00         0x00000300         xrw
*default*        0x00000000         0xffffffff

  • المنطقة المستهلكة من منطقة الذاكرة المعرّفة في linker script .ld مثلاً في الاقتباس التالي تعريف للقسم bss. يُعرّف السكربت linker script كيفيّة تنظيم وتقسيم الذاكرة ويمكن تعريف متحولات يمكن استخدامها في الكود مثل __bss_start__

    .bss :
    {
        . = ALIGN(4);
        __bss_start__ = .;
        *(.bss*)
        *(COMMON)
        . = ALIGN(4);
        __bss_end__ = .;
    } > RAM

يعني الكود السابق أن يضع الرّابط قيمة عدّاد البرامج Programme Counter PC في المتحول __bss_start__  ثم يضع المتحولات ليضع أخيراً قيمة العدّاد في المتحول __bss_end__ . سوف نجد ذلك في الملف map. ولكن سنجد العنوان مع المتحول.
....
0x20002ca4 __bss_start__ = .
....
0x2000e7a8 __bss_end__ = .
....

  • حتى لو لم تطلب من الرّابط linker أن يضع قيمة عدّاد البرامج في رمز فإنه بالإمكان معرفة حجم منطقة من الذاكرة باعتبار أن الملف map. يقدم بالإضافة إلى حجم الرمز إلى أي منطقة ينتمي.

بناءً على النقط أعلاه وجدت أن الملف map. يحوي الكثير من المعلومات التي يمكن الاستفادة منها لذلك قمت بإنشاء سكربت بايثون يقوم بمسح الملف map. ويستخلص المعلومات المفيدة حول كميّة استهلاك الذاكرة. بدأت الفكرة معي عندما كنت أبحث عن أحجام التوابع باستخدام الأداة nm وشعرت حينها أن المعلومات الأكثر يمكن الحصول عليها في map.

إن السكربت يقوم بالبحث عن معلومات تتعلق بكمية استهلاك الذاكرة وعلى المستخدم تعديل الملف “map_settings.txt” المرفق كالتالي:

  • رابط المسار إلى الملف map
  • الأقسام التي لديها رمز بداية ونهاية واضحين مثل  __bss_start__
  • الأقسام التي ليس لها رمز بداية واضح، ولهذا يجب ذكر اسم القسم الذي يليها.

....
*(.dtors)
*(.rodata*)

KEEP(*(.eh_frame*))
....

الاقتباس السابق من linker script . إن الرمز eh_frame يجعل السكربت البايثون يعلم مكان نهاية القسم rodata.

تشغيل السكربت

لتحميل السكربت من المستودع في Github.

ملاحظة: هناك أدوات تحليل أكثر قوّة مثل MapViewer و AMAP .

 

Yahya Tawil

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

اترك تعليقاً

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

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

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