ما هو الحل للذاكرة الصغيرة المحايدة استثناء الوصول على ARM9 باستخدام C؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

والعمارة ARM9. لغة البرمجة C.

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

         ((uint16 *)pBuffer)[index] = value;

وحيث value هو من نوع uint16 وindex هو حدود فحص والفهارس pBuffer. هذا يؤدي إلى استثناء ذاكرة الوصول محاذاتها. نقاط pBuffer إلى char * على كومة.

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

وأريد أن أفهم إذا كان هناك عمل حول هذا. كيف يمكنني أداء الواجب أعلاه دون انتهاك وصول محاذاتها؟ ما هو أفضل نهج لحل هذه المشاكل.

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

المحلول

ونسخ بايت القيمة بايت. ألقها إلى (غير الموقعة) مؤشر شار، ثم قم بنسخ بايت في المرة الواحدة.

وانها ليست جميلة، ولكن لا يبدو أن يكون لديك العديد من الخيارات.

نصائح أخرى

وهناك ثلاثة احتمالات، وأنا لا يمكن تحديد من سؤالك حتى الآن كما هو الحال.

وحالة 1: المؤشر هو دائما غريبة. الحل: memmove () pBuffer أكثر من 1 بايت الحالة 2: المؤشر هو الغريب في بعض الأحيان، ويمكنك التنبؤ مقدما متى سيكون. الحل: memmove () pBuffer أكثر من 1 بايت عندما تعلم أن المؤشر يكون غريبا. حالة 3: المؤشر هو الغريب في بعض الأحيان، وأنت لا يمكن التنبؤ متى سيكون. وهذا أمر مؤسف، لأن التعليمات البرمجية <م> سوف خطأ.

إذا كنت في السيطرة على pBuffer، كما عمل حول، هل يمكن أن نعلن على أنها مجموعة من uint32_t (أو ما يطابق محاذاة العمارة الخاص بك). مع إعلان المخزن المؤقت كما uint32_t، فإن المترجم اختيار المحاذاة الصحيحة. يمكنك يطرح للuint8_t * عندما استدعاء الدالة التي تستهدفها.

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

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