ما هي التقنيات المتاحة لتحسين الذاكرة في لغة التجميع 8051؟

StackOverflow https://stackoverflow.com/questions/335540

سؤال

أحتاج إلى تحسين التعليمات البرمجية لإفساح المجال لبعض التعليمات البرمجية الجديدة.ليس لدي مساحة لجميع التغييرات.لا يمكنني استخدام تبديل بنك الرموز (80c31 مع 64 كيلو بايت).

هل كانت مفيدة؟

المحلول

لم تقدم الكثير لتفعله هنا، ولكن هناك مستويين رئيسيين من التحسينات التي يمكنك وضعها في الاعتبار:

التحسينات الدقيقة:على سبيل المثال.XOR A بدلاً من mov a ، 0 لقد غطى آدم بعضًا من هذه الأشياء في وقت مبكر.

تحسينات الماكرو:انظر إلى بنية برنامجك، وهياكل البيانات والخوارزميات المستخدمة، والمهام المنجزة، وفكر مليًا في كيفية إعادة ترتيبها أو حتى إزالتها.هل هناك أجزاء كاملة من التعليمات البرمجية لم يتم استخدامها فعليًا؟هل الكود الخاص بك مليء ببيانات إخراج التصحيح التي لا يراها المستخدم أبدًا؟هل هناك وظائف محددة لعميل واحد يمكنك استبعادها من الإصدار العام؟

للتعامل بشكل جيد مع هذا الأمر، ستحتاج إلى معرفة أين يتم استخدام ذاكرتك.تعد خريطة Linker مكانًا جيدًا للبدء بهذا.التحسينات الكلية هي المكان الذي يمكن فيه تحقيق المكاسب الكبيرة.

جانبًا، يمكنك - بجدية - محاولة إعادة كتابة أجزاء من التعليمات البرمجية الخاصة بك باستخدام مترجم C جيد ومحسّن.قد تندهش من مدى إحكام الكود.قد يكون أحد المبرمجين المحترفين قادرين على تحسينه، لكنه يمكن أن يكون بسهولة أفضل من معظم المبرمجين.لقد استخدمت IAR واحدة منذ حوالي 20 عامًا، وقد فجرت جواربي.

نصائح أخرى

ومع لغة التجميع، سيكون لديك لتحسين باليد. وفيما يلي بعض الأساليب:

ملاحظة: IANA8051P (أنا لست مبرمج 8501 لكنني فعلت الكثير من التجمع على غيرها من رقائق 8 بت)

والذهاب من خلال رمز تبحث عن أي بت المكررة، مهما كانت صغيرة وجعلها الوظائف.

وتعلم بعض الإرشادات أكثر غرابة ومعرفة ما إذا كان يمكنك استخدامها لتحسين، على سبيل المثال. خدعة لطيفة لاستخدام XOR A لمسح تراكم بدلا من MOV A، 0 - أنه يوفر بايت

وخدعة متقنة أخرى هي حالة استدعاء وظيفة قبل أن تعود، لمجرد القفز إليها على سبيل المثال، بدلا من:

CALL otherfunc
RET

ومجرد القيام به:

JMP otherfunc

ودائما تأكد من تقومون به يقفز النسبية وفروع حيثما كان ذلك ممكنا، فإنها تستخدم ذاكرة أقل من القفزات المطلقة.

وهذا كل ما يمكنني أن أفكر في من على قمة رأسي لحظة.

وعذرا أنا قادم إلى هذا في وقت متأخر، ولكن كان لي مرة واحدة بالضبط نفس المشكلة، وأصبح مشكلة المتكررة التي ظلوا يترددون بالنسبة لي. في حالتي كان المشروع الهاتف، على معالج 8051 عائلة، وكنت قد بلغوا الحد الاقصى تماما خارج ROM (رمز) ذاكرة. ذلك ظلوا يترددون بالنسبة لي لإدارة أبقت طلب الميزات الجديدة، حتى صارت كل ميزة جديدة وهي عملية من خطوتين. 1) تحسين الاشياء القديمة لإفساح المجال 2) تنفيذ ميزة جديدة، وذلك باستخدام تلك الحجرة لقد قدمت.

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

وشيء أتذكر عملت بالنسبة لي، ويمكن أن تعمل من أجلك؛

ونظرة على جوهر ما لديها التعليمات البرمجية الخاصة بك القيام به، ومحاولة استخلاص بعض العمليات البدائية مرنة قوية حقا. ثم إعادة بناء أكبر رمز مستوى بحيث أنه يفعل شيئا مستوى منخفض في كل ما عدا مكالمة على الأوليات. ومن الناحية المثالية استخدام نهج جدول استنادا الجدول الخاص بك يحتوي على أشياء من هذا القبيل. حالة الإدخال، الحدث، دولة الإخراج، البدائيون .... وبعبارة أخرى عندما يحدث حدث، ابحث عن خلية في الجدول لهذا الحدث في الحالة الراهنة. تلك الخلية يخبرك ما حالة جديدة لتغيير (اختياريا) وما بدائية (ق) (إن وجدت) لتنفيذه. قد تحتاج عدة مجموعات من الدول / الأحداث / الجداول / البدائيون لمختلف الطبقات / الأنظمة الفرعية.

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

وعذرا انا أشهر في وقت متأخر وربما كنت لم يكن لديك الوقت لنفعل شيئا هذا المتطرف على أي حال. للجميع وأنا أعلم أنك بالفعل باستخدام نهج مماثل! ولكن جوابي قد تساعد شخص آخر في يوم من الأيام من يدري.

في قسم-مضروب بها، هل يمكن أن تنظر أيضا في ضغط جزء من شفرة الخاص بك والاحتفاظ فقط بعض الجزء الذي بنشاط المستخدمة ضغط في أي لحظة معينة من الزمن. لدي صعوبة في الاعتقاد بأن رمز المطلوبة لنظام / فك ضغط ضغط ستكون صغيرة بما يكفي جزء من ذاكرة صغيرة من 8051 لجعل هذا جديرة بالاهتمام، ولكن عملت عجائب على أنظمة أكبر قليلا.

ولكن نهج آخر هو تحويل إلى تنسيق رمز بايت أو هذا النوع من الشفرات الجدولية أن بعض الدول آلات الانتاج - وجود آلة فهم ما التطبيق يقوم به وتولد التنفيذ غير مفهومة تماما يمكن أن تكون كبيرة طريقة لانقاذ غرفة واحدة:)

وأخيرا، إذا تم ترجمة التعليمات البرمجية الواقع في C، أود أن أقترح ترجمة مع مجموعة واسعة من الخيارات المختلفة لنرى ماذا سيحدث. أيضا، كتبت قطعة على الترميز C المدمجة لESC في عام 2001 الذي لا يزال التيار جميلة. نرى أن النص عن غيرها من الحيل لآلات صغيرة.

1) حيثما أمكن حفظ المتغيرات الخاصة بك في IDATA ليس في xdata
2) انظر في تصريحات أحزاب اللقاء المشترك الخاص بك - الاستفادة من SJmp وAJmp

أفترض أنك تعلم أنه لن يكون مناسبًا لأنك كتبت/امتثلت وحصلت على خطأ "نفاد الذاكرة".:) يبدو أن الإجابات تتناول سؤالك بدقة شديدة؛قصيرة من الحصول على أمثلة التعليمات البرمجية.

ومع ذلك، أود أن أوصي ببعض الأفكار الإضافية؛

  1. تأكد من أن كل الكود موجود حقًاقيد الاستخدام - اختبار تغطية الكود؟الفرع غير المستخدم هو فوز كبير - هذه خطوة صعبة - إذا كنت المؤلف الأصلي ، فقد يكون الأمر أسهل - (حسنًا ، ربما) :)
  2. تأكد من مستوى "التحقق" والتهيئة - في بعض الأحيان يكون لدينا ميل إلى أن نكون متحمسين في التأكد من أننا قمنا بتهيئة المتغيرات/الذاكرة والتأكد من ذلك بشكل صحيح ، كم مرة تعرضنا للعض.لا تقل لا تهيئة (duh) ، ولكن إذا قمنا بتحرك ذاكرة ، فإن الوجهة لا يحتاج أن تكون صفرًا أولاً - هذا التوابل مع

    1 --

  3. قم بتقييم الميزات الجديدة - هل يمكن تعزيز الفرعية الموجودة لتغطية كلتا الوظيفتين أو ربما يتم استبدال ميزة موجودة؟
  4. قم بتفكيك الرمز الكبير إذا كان يمكن حفظ قطعة من الكود الكبير خلق رمز صغير جديد.

أو ربما هناك حجة لإصدار الأجهزة 2.0 مطروحة الآن ...:)

يعتبر

وبالإضافة إلى التي سبق ذكرها (أكثر أو أقل) تحسينات واضحة، وهنا هو غريب حقا (ويكاد يكون من المستحيل تحقيق) واحد: قانون إعادة استخدامها. ومع رمز إعادة أنا لا أعني إعادة استخدام العادي، ولكن لأ) إعادة استخدام التعليمات البرمجية عن بيانات أو ب) إعادة استخدام التعليمات البرمجية كما رمز آخر. ربما يمكنك إنشاء طرفية (أو أيا كان بيانات ثابتة) أنه يمكن أن يمثله أكواد العمليات ASM عرافة (هنا لا بد من النظر هارفارد مقابل العمارة نيومان فون).

وقال إن البعض إعادة استخدام التعليمات البرمجية عن طريق إعطاء كود معنى مختلف عند معالجة الأمر مختلفا. هنا مثال لتوضيح ما أعنيه. إذا كان بايت التعليمات البرمجية تبدو مثل هذا: AABCCCDDEEFFGGHH في عنوان X حيث يقف كل حرف لشفرة تشغيل واحد، تخيل أنك سوف تقفز الآن إلى X + 1. ربما تحصل على وظائف مختلفة كاملة حيث الآن من الفضاء بايت فصل تشكل أكواد العمليات الجديدة: ABC CCD DE EF GH.

ولكن حذار: هذه ليست صعبة فقط لتحقيق (ربما من المستحيل)، ولكن من الرعب للمحافظة عليه. حتى إذا لم تكن رمز العرض (أو شيء مماثلة الغريبة)، أود أن أوصي إلى استخدام الطرق المذكورة أعلاه أخرى بالفعل لحفظ ذاكرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top