سؤال

ولست بحاجة لاستخدام الخدمات المصرفية التعليمات البرمجية في متحكم 8051 لتناسب كافة التعليمات البرمجية. يقول SDCC انها تؤيد ذلك، ولكن أواجه مشكلة في خطوة ربط.

ولدي مشروع اختبار مع 3 ملفات: main.c، func1.c، وbank.asm. وتتمثل المهمة الرئيسية يجب استدعاء func1 () ومن ثم الجلوس في حلقة من الوقت. لكن func1 () في أحد البنوك رمز مختلف.

// main.c
int func1(void) banked;

void main()
{
    int i = func1();

    while(i)
    {
    }
}

// func1.c
#pragma codeseg BANK1

int func1(void) {
    return 99; }

//bank.asm
    .area HOME    (CODE)
    .area GSINIT0 (CODE)
    .area GSINIT1 (CODE)
    .area GSINIT2 (CODE)
    .area GSINIT3 (CODE)
    .area GSINIT4 (CODE)
    .area GSINIT5 (CODE)
    .area GSINIT  (CODE)
    .area GSFINAL (CODE)
    .area CSEG    (CODE)
    .area HOME    (CODE)

__sdcc_banked_call::
    ret             ;make the call

__sdcc_banked_ret::
    ret         ;return to caller

ولدي ملف بناء دفعة لتجميع كل شيء، وربط كل ذلك معا.

sdcc -c func1.c
sdcc -c main.c
asx8051 -ol bank.asm
sdcc "-Wl -b BANK1=0x018000" main.rel func1.rel bank.rel

وأحصل على هذا الخطأ رابط:

?ASlink-Error-Insufficient ROM/EPROM/FLASH memory.

وكيف يمكنني الحصول على هذا الربط؟

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

المحلول

ومن دليل SDCC:

<اقتباس فقرة>   يمكن وضع

والقطاعات في أي مكان في   مساحة العنوان 4 ميج باستخدام المعتاد   - * - خيارات الموضع. لاحظ أنه إذا توجد أي قطاعات فوق 64K، و-r   يجب أن يتم تمرير العلم إلى رابط ل   توليد هذا الجزء السليم   الترحيل، وإخراج إنتل HEX   يجب استخدام الشكل. العلم -r يمكن   تمريرها إلى رابط باستخدام   الخيار -Wl-r على سطر الأوامر SDCC.   ومع ذلك، لا يمكن حاليا رابط   التعامل مع أجزاء التعليمات البرمجية> 64K.

وهكذا، إضافة -Wl-r لخط رابط.

نصائح أخرى

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

هل تحتاج لوضع الرمز الصحيح لوضع سجلات البنك أو ما يحدد من أي وقت مضى بنك الذاكرة في:

__sdcc_banked_call::
    ret                 ;make the call

__sdcc_banked_ret::
    ret                 ;return to caller

والروتين؟

وعلى الرغم من أن هذا قد لا يكون مشكلة رابط.
هل تحتاج إلى تحديد SEG رمز ل: BANK1

وهذا يبدو وكأنه هو إنشاء مقاطع التعليمات البرمجية:

//bank.asm
    .area HOME    (CODE)
    .area GSINIT0 (CODE)
    .area GSINIT1 (CODE)
    .area GSINIT2 (CODE)
    .area GSINIT3 (CODE)
    .area GSINIT4 (CODE)
    .area GSINIT5 (CODE)
    .area GSINIT  (CODE)
    .area GSFINAL (CODE)
    .area CSEG    (CODE)
    .area HOME    (CODE)

ولكن لا يوجد BANK1 محددة. هناك ملف رابط، وأنه لا تعيين كافة مساحة الذاكرة / فلاش لهذه القطاعات مدونة؟

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