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

أسهل طريقة لحساب حجم تابع في لغة سي

إن حساب حجم تابع function ليس بسهولة استخدام العملية خلال compile-time وقت الترجمة ()sizeof . هناك طرق متعددة لحساب حجم التابع خلال التنفيذ run-time ولكن لكي نبقي الأمور سهلة فمن الأفضل التحقق من حجم التابع من الرابط linker والذي يجب أن تتوفر لديه هذه المعلومة.

 

لنتعرف على الأدوات التي سنستخدمها:

 

1- الملف “map.”المولّد بواسطة GCC/G++ linker:

 

يحتوي هذا الملف على الرموز symbols التي لدينا في الكود/الفيرموير سواءً في الفلاش أو الرام أو أي منطقة ذاكرة معرّفة أخرى. إن الاقتباس التالي هو من ترجمة compiling واحد من الأمثلة الموجودة في nRF52 SDK. إذا كنت تريد التجريب كل ما عليك فعله هو استخدام الأمر make default من المسار التالي examples\peripheral\gpiote\pca10040\blank\armgcc. سنجد في العمود الأول عنوان البدء وفي العمود الثاني الحجم بالنظام الست عشري وفي العمود الثالث اسم الملف الغرض object file الذي يحوي هذا الرمز.

يمكنك البحث في هذا الملف على اسم الرمز حتى نجده، مثلاً نجد أن التابع bsp_board_led_invert بطول 36 بايت.

 

2- الملف “out.”المولّد بواسطة GCC/G++ linker:

 

قد من الصعب أحياناً أن نجد رمز معيّن في الملف “map.” وهنا تأتي الأداة nm الموجودة في GCC tool-chain والتي تعرض جدولاً بجميع الرموز ولأجل هذا الغرض يجب استعمال الملف “out.” أو “elf.”. هذه الأداة بإمكانها عرض الرموز وترتيبها حسب الحجم أيضاً. لدينا الملف “out.” من خرج ترجمة المشروع المشار له سابقاً ولعرض الرموز وأحجامها بالترتيب فإنه يمكننا استخدام التعليمة التالية (انتبه لاستخدام التعليمة بناءً على حالتك، أستخدم ARM GCC في حالتي)

وهذا اقتباس من الخرج

في العمود الأول العنوان بشكل عشري وثم الحجم أيضاً بشكل عشري وثم اسم الرمز.

 

أسماء للرموز غريبة؟

 

لو وجدت أسماء غريبة للرموز وهي غالباً مجموعة من المحارف التي تسبق وتلي اسم الرمز المعروف لديك فهذا ما يسمى بـ mangling  على سبيل المثال إن تابع مثل get_event سيصبح كالتالي:

لماذا؟ هذا لأن المترجم يحتاج لأن تكون أسماء التوابع والمتغيرات فريدة خاصة عندما نستعمل المتحولات والتوابع الـstatic والتي قد تستخدم نفس الاسم ولكن بتوابع مختلفة أو ملفات مختلفة فعلى المترجم أن يميّز بينها. ونفس الفكرة تنطبق على الـ overloading في ++C كذلك.

لاستعادة الاسم الاصلي de-mangle تستخدم الأداة c++filt

AD Space

Yahya Tawil

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

اترك تعليقاً

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

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