سؤال

أحاول برمجة ARM باستخدام Eclipse + CDT + yagarto (gnu Toolchain) + OpenOCD.في العديد من نماذج المشاريع (من موقع yagarto على سبيل المثال) وجدت نصوص رابط (*.ld) حيث تم تحديد الكثير من معلومات الارتباط (جنبًا إلى جنب مع تعريفات الأقسام).في الواقع، لم أواجه هذه الملفات من قبل (IAR لا يحتاج إليها)، وأجد صعوبة في فهمها من النظرة الأولى.لذلك سؤالي هو هل يمكنني استخدام ملف نصي واحد من هذا القبيل للمعالج المستهدف (STR710FZ2T6) مع جميع مشاريعي أو يجب أن أتعرف على كتابة هذه البرامج النصية وكتابتها لكل مشروع.إذا كان بإمكاني استخدام ملف واحد لجميع المشاريع لمعالج مستهدف معين، فهل يمكنك تقديم المشورة أين يمكنني العثور على مثل هذا الملف العالمي.

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

المحلول

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

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

أحد البرامج النصية التي أحب استخدامها هو:

MEMORY
{
    bob (RX) : ORIGIN = 0x0000000, LENGTH = 32K
    joe (WAIL) : ORIGIN = 0x2000000, LENGTH = 256K
}

SECTIONS
{
    JANE : { startup.o } >bob
}

عادةً ما أستخدم ram وrom كأسماء بدلاً من bob وjoe ولكنني أوضح هنا أنه لا يهم ما هي الأسماء، فهي مجرد تسميات.

اختلاف آخر حول الموضوع:

MEMORY
{
    rom(RX)   : ORIGIN = 0x00000000, LENGTH = 0x8000
    ram(WAIL) : ORIGIN = 0x20000000, LENGTH = 0x2000
}

SECTIONS
{
    .text : { *(.text*) } > rom
}

الأول يسمح لك بوضع الملفات على سطر أوامر الرابط بأي ترتيب ولكن يجب أن يكون لديك جدول المتجهات في ملف start.o.يتيح لك الأخير استخدام أي أسماء ملفات ولكن الملف الأول في البرنامج النصي للرابط يحتاج إلى جدول المتجهات.

arm-thumb-elf-gcc -Wall $(COPS) vectors.o putget.o blinker2.c -T memmap -o blinker2.elf

أو مع ld مباشرة

arm-thumb-elf-ld vectors.o putget.o blinker2.o -T memmap -o blinker2.elf

يخبر RX الرابط بوضع أشياء القراءة والتنفيذ في قسم الذاكرة هذا ويكون WAIL في الأساس كل شيء آخر.إذا كان لديك ذاكرة الوصول العشوائي واحدة فقط على سبيل المثال، يمكنك وضع جميع إشارات RXWAIL على الخط الذي يوضح مكان ذاكرة الوصول العشوائي.اعتمادًا على المُحمل الخاص بك، في هذه الحالة، يمكنك الاعتماد على ملف elf الذي يخبر المُحمل بمكان التفرع للبدء أو يمكنك ببساطة جعل نقطة الإدخال هي بداية الملف الثنائي ويمكن أن يكون المُحمل أكثر بساطة.تحتوي الأذرع (وليس cortex-m3) على تعليمات فرعية باعتبارها المتجه الأول لمتجه إعادة التعيين، لذا يمكنك فقط التظاهر ببناء جدول متجه على أي حال لحل ذاكرة الوصول العشوائي وستعمل فقط.

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

هذا

int rx;

int main ( void )
{
  rx = 7;

بدلاً من

int rx=7;

int main ( void )
{

كما أنني لا أفترض أبدًا أن المتغير هو صفر عندما يبدأ الكود، فأنا دائمًا أقوم بتهيئته لشيء ما قبل أن أبدأ.يمكن لرمز بدء التشغيل الخاص بك بالإضافة إلى البرنامج النصي للرابط كفريق العمل معًا لتسهيل أتمتة إعادة تعيين رمز bss ونسخ بيانات init غير الصفرية من ذاكرة الوصول العشوائي إلى ذاكرة الوصول العشوائي عند التمهيد.(ذلك int rx=7;يتطلب أعلاه بعض التعليمات البرمجية التي تنسخ القيمة 7 من مكان ما في rom وتكتبها في موقع الذاكرة في ذاكرة الوصول العشوائي المخصصة للمتغير rx بحيث عندما يبدأ main() تكون القيمة 7 موجودة.

يعد رمز التمهيد الخاص بي أيضًا بسيطًا جدًا نتيجة لهذه الطريقة:

.globl _start
_start:
    b reset
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang

hang : b hang

reset:
    ldr sp,=0x10004000
    bl main
    b hang

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

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

نصائح أخرى

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

وهناك وثيقة لطيفة عن STR7xx يسمى "استخدام أدوات مفتوحة المصدر لSTR7xx الصليب التنمية ". يمكنك العثور على رابط في الصفحة الرئيسية yagarto. أوصي بأن لديك نظرة على ذلك ومحاولة فهم كيفية عمل ملفات رابط. وهناك أيضا بعض ملفات التكوين الأخرى التي تحتاج إلى أن يكون بعض الفهم.

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