لماذا يؤدي استخدام بنية في برنامج C إلى حدوث خطأ في الارتباط

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

  •  19-09-2019
  •  | 
  •  

سؤال

أنا أكتب برنامج C لشريحة معمارية 8051 ومترجم SDCC.

لدي هيكل يسمى FilterStructure؛

الكود الخاص بي يبدو مثل هذا ...

#define NAME_SIZE 8

typedef struct {
char Name[NAME_SIZE];
} FilterStructure;

void ReadFilterName(U8 WheelID, U8 Filter, FilterStructure* NameStructure);

int main (void)
{
    FilterStructure testStruct;
    ReadFilterName('A', 3, &testFilter);     
    ...
    ...
    return 0;
}

void ReadFilterName(U8 WheelID, U8 Filter, FilterStructure* NameStructure)
{    
    int StartOfName = 0;
    int i = 0;
    ///... do some stuff...
    for(i = 0; i < 8; i++)
    {
        NameStructure->Name[i] = FLASH_ByteRead(StartOfName + i);
    }
    return;
}

لسبب ما، تظهر لي رسالة خطأ في الارتباط "؟ASlink-Error-Could not get 29 بايت متتالية في ذاكرة الوصول العشوائي الداخلية لمنطقة DSEG"

إذا قمت بالتعليق على السطر الذي يقول FilterStructure testStruct; الخطأ يختفي.

ماذا يعني هذا الخطا؟هل أحتاج إلى التخلص من الهيكل عندما أنتهي منه؟

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

المحلول

الرسالة تعني أن المتغير المحلي الخاص بك testStruct لا يمكن تخصيصها في ذاكرة الوصول العشوائي (أو DSEG التي يجب أن تكون شريحة بيانات من الملف الثنائي الخاص بك)، نظرًا لأن مدير الذاكرة الخاص بك لم يتمكن من العثور على 29 بايت متتالية لتخصيصها.

هذا أمر غريب نظرًا لأن البنية الخاصة بك يجب أن يبلغ طولها 8 بايت ..لكن راجع للشغل لا علاقة له بتجاهل البنية، يبدو أن هذه مشكلة في إدارة الذاكرة..لا أعرف مواصفات 8051 جيدًا ولكن يجب أن تكون محدودة جدًا، أليس كذلك؟

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

نصائح أخرى

لقد نفدت الذاكرة .... من خلال نظراتها.

حاول نقلها كمتغير عالمي، راجع ما إذا كان ذلك يجعلها أفضل.

مجرد تخمين: 8051 لديه 128 أو 256 بايت فقط من "ذاكرة الوصول العشوائي الداخلية". ليس كثيرا ... يمكن أن تستخدم جزء منه كتكدس وجزء للسجلات. ربما لديك بنية "كبيرة" (8 بايت !!!) على المكدس يجبر المترجم لحجز مساحة أكبر بكثير داخل الذاكرة الداخلية. أقترح أن ألقي نظرة على ملف خريطة رابط، ربما يمكنك "إعادة ترتيب" قسم الذاكرة. يقول التدليك "بايت متتالية"، لذلك ربما لا يزال هناك مساحة كافية من المتوفر، لكنها مجزأة.

وداعا

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