2010-05-10 2 views
4

Ниже приведен пример вопроса, заданного в моем последнем тесте на курсе «Компьютерная инженерия». Любой разум объясняет мне, как получить начальные/конечные адреса каждого из них? Я вернул правильные ответы внизу ...Как правильно рассчитать адресные пространства?

Устройство MSP430F2410 имеет адресное пространство 64 КБ (базовую архитектуру MSP430). Заполните приведенную ниже таблицу, если мы знаем следующее. Первые 16 байтов адресного пространства (начиная с адреса 0x0000) зарезервированы для специальных регистров функций (IE1, IE2, IFG1, IFG2 и т. Д.), Следующие 240 байтов зарезервированы для 8-битных периферийных устройств, а следующий 256 байтов зарезервировано для 16-разрядных периферийных устройств. Объем оперативной памяти составляет 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 

ответ

4

Для начала, не получают скинул тем, что хранится в каждом сегменте - это только собирается сбить вас с толку. Проблема заключается в том, чтобы просто попросить вас указать нумерацию шестнадцатеричных чисел, и это не слишком сложно. Ниже приведены требования:

  • 64 Кб общий объем памяти
  • Первые 16 байт адресного пространства (начиная с адреса 0x0000) зарезервировано для регистров специального назначения (IE1, IE2, IFG1, IFG2, и т.д.)
  • следующий 240 байт зарезервирован для 8-битных периферийных устройств
  • следующие 256 байт зарезервирован для 16-разрядных периферийных устройств
  • Объем памяти ОЗУ 2 Кбайт и он начинает по адресу 0x1100
  • В верхней части адресного пространства 56KB флэш-памяти, зарезервированной для кода и прерывания таблицы векторов.

Поскольку каждая шестнадцатеричная цифра в вашем адресе памяти может обрабатывать 16 значений (0-F), вам потребуется 4 цифры для отображения 64 Кбайт памяти (16^4 = 65536 или 64 КБ).

Вы начинаете с 16 байтов и покрываете 0x0000 - 0x000F (одна полная цифра вашего адреса). Это означает, что следующий сегмент, который начинается сразу после него (8-разрядные устройства), начинается с 0x0010 (следующий байт), а так как он имеет длину 240 байтов, он заканчивается байтом 256 (240 + 16) или 0x00FF.

Следующий сегмент (16-разрядные устройства) начинается с следующего байта, который равен 0x0100, и имеет длину 256 байтов, что положит конец на 0x01FF.

Затем идет 2 КБ (2048 байт) ОЗУ, но начинается с 0x1100, как описано в описании, а не сразу после предыдущего сегмента, так что это ваш начальный адрес. Добавьте к этому 2048, и вы получите 0x18FF.

Последний сегмент охватывает верхнюю часть памяти, поэтому вам придется работать в обратном направлении, вы знаете, что оно заканчивается на 0xFFFF (конец доступной памяти), а длина его составляет 56 КБ. Если вы преобразуете 56KB в шестнадцатеричный, это 0xDFFF. Если вы представляете, что этот сегмент начинается с 0, это оставляет 2000 неиспользуемых (0xE000-0xEFFF и 0xF000-0xFFFF), поэтому вы знаете, что этот сегмент должен начинаться с 0x2000, чтобы заканчиваться в верхнем конце пространства памяти.

Я надеюсь, что это более ясно, хотя, когда я прочитал над ним, я не знаю, что это любая помощь вообще :(Может быть, поэтому я оставлю преподаю эту концепцию для кого-то более квалифицированного ...

+0

Это объяснение - именно то, что мне нужно. Не стесняйтесь приходить, чтобы научить наш класс. Будьте гораздо полезнее, чем нынешний учитель! Очень ценим. – Nedlinin

0
#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]; 
} 
Смежные вопросы