كيف يمكن لإضافة البيانات إلى مقطع ما في ذاكرة الفلاش أن يؤدي إلى إفساد توقيت البرنامج؟

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

سؤال

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

الأشياء التي حيرتني في هذا الأمر:

  • أنا ولا حتى الوصول إلى البيانات الجديدة, ، مجرد الإعلان عن مجموعة تمت تهيئتها.
  • يعتمد الأمر على الحجم - تظهر المشكلة فقط إذا كان المصفوفة أكبر من 40 كلمة.
  • أعلم أنني لا أتجاوز أي شرائح بيانات في خريطة الارتباط.
  • لا يوجد تخزين مؤقت للبيانات، لذلك لا يرجع ذلك إلى تعطيل تناسق ذاكرة التخزين المؤقت.

هل لديك أي أفكار حول كيفية تأثير زيادة حجم مقطع .cinit في الفلاش على توقيت الكود الخاص بك؟

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

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

المحلول 5

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

فيصبح السؤال:كيف يؤدي تخزين البيانات الإضافية في ذاكرة الفلاش، دون الوصول إليها، إلى تنفيذ تعليمات إضافية؟

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

نصائح أخرى

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

ربما تدفع المصفوفة الجديدة المخصصة بشكل ثابت البيانات الموجودة إلى مناطق ذاكرة أبطأ، مما يؤدي إلى إبطاء الوصول إلى تلك البيانات؟

هل تتكرر المشكلة إذا كانت المصفوفة هي آخر شيء في مساحة العنوان الخاصة بها؟إذا لم يكن الأمر كذلك، فابحث في خريطتك، فحاول نقل إعلان المصفوفة بحيث يتم خلط الأشياء الموضوعة بعده واحدًا تلو الآخر لتكون قبله بدلاً من ذلك.بهذه الطريقة يمكنك تحديد الكائن ذي الصلة والبدء في معرفة سبب تسبب نقله في التأخير.

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

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

يمكن أن يكون هناك تعارض في البنك أو الصفحة أيضًا.ربما يكون لديك روتينان يتم استدعاؤهما كثيرًا (معالجات المقاطعة أو نحو ذلك) وكانا موجودين في نفس الصفحة وتم تقسيمهما الآن إلى صفحتين.

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