Pergunta

Abaixo está um exemplo de uma pergunta dada no meu último teste em um curso de engenharia de computadores. Alguém se importa me explicando como obter os endereços de início/final de cada um? Eu listei as respostas corretas na parte inferior ...

O dispositivo MSP430F2410 possui um espaço de endereço de 64 KB (a arquitetura básica do MSP430). Preencha a tabela abaixo se soubermos o seguinte. Os primeiros 16 bytes do espaço de endereço (começando no endereço 0x0000) são reservados para registros de funções especiais (IE1, IE2, IFG1, IFG2, etc.), os próximos 240 bytes são reservados para dispositivos periféricos de 8 bits e os próximos 256 bytes são reservados para dispositivos periféricos de 16 bits. A capacidade de memória RAM é de 2 kbytes e começa no endereço 0x1100. Na parte superior do espaço de endereço, há 56kb de memória flash reservada para o código e a tabela vetorial de interrupção.

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
Foi útil?

Solução

Para iniciantes, não se afaste pelo que é armazenado em cada segmento - isso só vai confundi -lo. O problema é apenas pedir para você descobrir a numeração hexadecimal, e isso não é muito difícil. Aqui estão os requisitos:

  • 64 kb de memória total
  • O primeiro 16 bytes do espaço de endereço (começando no endereço 0x0000) é reservado para registros de funções especiais (IE1, IE2, IFG1, IFG2, etc.)
  • Nas próximas 240 bytes é reservado para dispositivos periféricos de 8 bits
  • Nas próximas 256 bytes é reservado para dispositivos periféricos de 16 bits
  • A capacidade de memória RAM é 2 Kbytes E começa no endereço 0x1100
  • No topo do espaço de endereço está 56kb da memória flash reservada para o código e a tabela vetorial de interrupção.

Como cada dígito hexadecimal no seu endereço de memória pode lidar com 16 valores (0-F), você precisará de 4 dígitos para exibir 64kb de memória (16 ^ 4 = 65536 ou 64k).

Você começa com 16 bytes, e isso cobre 0x0000 - 0x000F (um dígito completo do seu endereço). Isso significa que o próximo segmento, que começa imediatamente após ele (dispositivos de 8 bits), começa em 0x0010 (o próximo byte) e, como tem 240 bytes de comprimento, termina no byte 256 (240 + 16) ou 0x00ff.

O próximo segmento (dispositivos de 16 bits) começa no próximo byte, que é 0x0100, e tem 256 bytes de comprimento - que coloca o final em 0x01ff.

Em seguida, vem 2kb (2048 bytes) da RAM, mas começa em 0x1100, como afirma a descrição, em vez de imediatamente após o segmento anterior, então esse é o seu endereço de partida. Adicione 2048 a isso e você obtém 0x18ff.

O último segmento cobre a seção superior da memória; portanto, você terá que trabalhar para trás, sabe que termina em 0xffff (o final da memória disponível) e tem 56kb de comprimento. Se você converter o 56KB em hexadecimal, é 0xdfff. Se você imagina que esse segmento começa em 0, isso deixa 2000 não utilizado (0xe000-0xefff e 0xf000-0xffff), para que você saiba que esse segmento precisa começar em 0x2000 para terminar na extremidade superior do espaço de memória.

Espero que esteja mais claro, embora, quando eu leio, não sei se é alguma ajuda :( Talvez seja por isso que vou deixar esse conceito a alguém mais qualificado ...

Outras dicas

#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];
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top