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

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

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

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
    .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__ = .
....

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

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

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

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

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

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

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

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

 

Exit mobile version