سؤال

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

يحتوي جهاز MSP430F2410 على مساحة عنوان 64 كيلو بايت (بنية MSP430 الأساسية). املأ الجدول أدناه إذا كنا نعرف ما يلي. يتم حجز أول 16 بايت من مساحة العنوان (بدءًا من العنوان 0x0000) لسجلات الوظائف الخاصة (IE1 ، IE2 ، IFG1 ، IFG2 ، إلخ) ، يتم حجز البايتات الـ 240 التالية للأجهزة الطرفية 8 بت ، والآخر 256 بايت محجوز للأجهزة الطرفية 16 بت. تبلغ سعة ذاكرة RAM 2 كيلو بايت وتبدأ في العنوان 0x1100. في الجزء العلوي من مساحة العنوان هو 56 كيلو بايت من ذاكرة الفلاش المحجوزة للرمز وجدول ناقلات المقاطعة.

What                            Start Address End Address
Special Function Registers (16 bytes) 0x0000 0x000F
8-bit peripheral devices (240 bytes)  0x0010 0x00FF
16-bit peripheral devices (256 bytes) 0x0100 0x01FF
RAM memory (2 Kbytes)                 0x1100 0x18FF
Flash Memory (56 Kbytes)              0x2000  0xFFFF
هل كانت مفيدة؟

المحلول

بالنسبة للمبتدئين ، لا يتم إلقاؤها بما يتم تخزينه في كل جزء - فهذا سيخلط بينك فقط. المشكلة هي فقط طلب منك معرفة ترقيم السداسي ، وهذا ليس صعبًا للغاية. فيما يلي المتطلبات:

  • 64 كيلو بايت إجمالي الذاكرة
  • الأول 16 بايت من مساحة العنوان (بدءًا من العنوان 0x0000) مخصصة لسجلات الوظائف الخاصة (IE1 ، IE2 ، IFG1 ، IFG2 ، إلخ)
  • التالي 240 بايت محجوز للأجهزة الطرفية 8 بت
  • التالي 256 بايت محجوز للأجهزة الطرفية 16 بت
  • سعة ذاكرة الكبش هي 2 kbytes ويبدأ على العنوان 0x1100
  • في الجزء العلوي من مساحة العنوان 56 كيلو بايت من ذاكرة فلاش محفوظة للكود وجدول ناقلات المقاطعة.

نظرًا لأن كل رقم سداسي في عنوان الذاكرة الخاص بك يمكنه التعامل مع 16 قيمًا (0-F) ، ستحتاج إلى 4 أرقام لعرض 64 كيلو بايت من الذاكرة (16 ^ 4 = 65536 ، أو 64k).

تبدأ بـ 16 بايت ، والتي تغطي 0x0000 - 0x000F (رقم واحد كامل من عنوانك). هذا يعني أن الجزء التالي ، الذي يبدأ مباشرة بعد ذلك (أجهزة 8 بت) ، يبدأ في 0x0010 (البايت التالي) ، ولأنه يبلغ طوله 240 بايت ، فإنه ينتهي عند البايت 256 (240 + 16) ، أو 0x00ff.

يبدأ الجزء التالي (أجهزة 16 بت) من البايت التالي ، وهو 0x0100 ، ويبلغ طوله 256 بايت - مما يضع النهاية عند 0x01ff.

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

يغطي الجزء الأخير القسم العلوي من الذاكرة ، لذلك سيتعين عليك العمل للخلف ، أنت تعلم أنه ينتهي عند 0xffff (نهاية الذاكرة المتاحة) ، ويبلغ طوله 56 كيلو بايت. إذا قمت بتحويل 56 كيلو بايت إلى Hex ، فهو 0xDFFF. إذا كنت تتخيل أن هذا القطاع يبدأ من 0 ، فإن ذلك يترك 2000 غير مستخدم (0xE000-0XEFFF و 0XF000-0XFFFF) ، لذلك تعلم أن هذا الجزء يجب أن يبدأ من 0x2000 لإنهاء في الطرف العلوي من مساحة الذاكرة.

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

نصائح أخرى

#define NUM_SIZES 5
uint16_t sizes[5] = {16, 240, 256, 2 * 1024, 56 * 1024};
uint16_t address = 0;
printf("Start   End\n");
for (int i = 0; i < NUM_SIZES; i++)
{
    printf("0x%04X 0x%04X\n", address, address + sizes[i] - 1);
    address += sizes[i];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top