مقارنة بين المجمعين ARMCC و IAR و GCC

صورة

أنا أعمل على مشروع واحد لا يكاد يتناسب مع 64 كيلو بايت من ذاكرة متحكم. وأعتقد أن الوقت قد حان للنظر في المجمعين المختلفين من أجل اختيار أي واحد يمكنه تقليل حجم البرنامج بشكل أكثر قوة.



أقدم انتباهكم إلى مقارنة صغيرة.



بالنسبة للاختبار ، قمت بإنشاء مشروع في Cube MX يتضمن USB_DEVICE وفئة التخزين كبيرة السعة. هذه مكتبات كبيرة جدًا للاختبار.



يبدو main.c الناتج شيئًا كالتالي:



int main() 
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
}


تعريف USBD_DEBUG_LEVEL مضبوط على 0 بحيث لا تتطلب رسائل تصحيح أخطاء مكدس USB



compilers المضمنة للطباعة :



  • IAR EWARM 8.32.1
  • arm-none-eab-gcc 7-2018-q2-update (STM32 Cube IDE 1.4.2)
  • ARMCC v5.06 التحديث 7 (Keil uVision 5.32 Environment)
  • ARMCC الإصدار 6.14.1 (بيئة Keil uVision 5.32)


إعدادات IAR:



  • الأمثل للحجم
  • مكتبة وقت التشغيل NORMAL
  • لا يوجد مستوى منخفض IO (printf معطل)
  • تم تمكين تحسينات الرابط: إجراءات صغيرة مضمنة ، دمج الأقسام المكررة


إعدادات مجلس التعاون الخليجي:



  • مكتبة وقت تشغيل مخفضة - الأنواع = nano.specs
  • تحسين لحجم -Os
  • ضع الوظائف في أقسامها الخاصة - أقسام الوظائف
  • ضع البيانات في أقسامها الخاصة - أقسام البيانات -
  • تجاهل المقاطع غير المستخدمة - Wl ، - gc- المقاطع


إعدادات Armcc5:



  • استخدم ميكرو ليب
  • استخدم التحسين عبر الوحدات
  • التحسين -O3
  • قسم ELF واحد لكل وظيفة - تقسيمات


إعدادات Armcc6:



  • استخدم ميكرو ليب
  • تحسين حجم الصورة -Oz
  • قسم ELF واحد لكل وظيفة - تقسيمات




مجلس التعاون الخليجي armcc5 IAR armcc6
حجم البرنامج الثابت 14036 13548 12997 12984






يحتوي UPD IAR على خيار تجميع متعدد الملفات. إذا قمت بتشغيله ، فإن IAR يمضي قدما بهامش كبير. تم تقليل حجم البرنامج الثابت إلى 12746 بايت.



كما ترى ، فإن armcc6 أفضل قليلاً من IAR. يليه armcc5 ، بنسبة 4٪ ، وخليجية بنسبة 8٪ خلف المتصدر.



وتجدر الإشارة إلى أن خيار KEIL "استخدام تحسين الوحدات المتقاطعة" زاد بشكل كبير من وقت التجميع ، ولكنه لم يقلل حجم الشفرة تقريبًا.



All Articles