Как правильно рассчитать адресные пространства? - PullRequest
4 голосов
/ 10 мая 2010

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

Устройство 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

Ответы [ 2 ]

4 голосов
/ 10 мая 2010

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

  • 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 КБ. Если вы конвертируете 56КБ в гекс, это 0xDFFF. Если вы представите, что этот сегмент начинается с 0, то 2000 не используются (0xE000-0xEFFF и 0xF000-0xFFFF), так что вы знаете, что этот сегмент должен начинаться с 0x2000 до конца в верхнем конце пространства памяти.

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

0 голосов
/ 10 мая 2010
#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];
}
...