如何正确计算地址空间?

时间:2010-05-10 14:09:27

标签: memory-address spaces cpu-registers msp430

以下是我在计算机工程课程中的最后一次测试中提出的问题示例。有人介意向我解释如何获取每个的开始/结束地址?我在底部列出了正确答案......

MSP430F2410器件的地址空间为64 KB(基本MSP430架构)。如果我们知道以下内容,请填写下表。地址空间的前16个字节(从地址0x0000开始)保留用于特殊功能寄存器(IE1,IE2,IFG1,IFG2等),接下来的240个字节保留给8位外围设备,下一个256位字节保留给16位外围设备。 RAM存储器容量为2 KB,从地址0x1100开始。在地址空间的顶部是为代码和中断向量表保留的56KB闪存。

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 个答案:

答案 0 :(得分:4)

对于初学者来说,不要被每个片段中存储的内容所抛弃 - 这只会让你感到困惑。问题只是要求你弄清楚十六进制编号,这并不太难。以下是要求:

  • 64 KB总内存
  • 地址空间的第一个 16字节(从地址0x0000开始)保留用于特殊功能寄存器(IE1,IE2,IFG1,IFG2等)
  • 下一个 240字节保留给8位外围设备
  • 下一个 256字节保留给16位外围设备
  • RAM内存容量 2 Kbytes ,它从地址0x1100开始
  • 地址空间的顶部是为代码和中断向量表保留的 56KB 闪存。

由于内存地址中的每个十六进制数字都可以处理16个值(0-F),因此您需要4位数才能显示64KB内存(16 ^ 4 = 65536或64K)。

从16个字节开始,包含0x0000 - 0x000F(地址的一个完整数字)。这意味着紧随其后的下一个段(8位器件)从0x0010(下一个字节)开始,由于它长240个字节,因此它以字节256(240 + 16)或0x00FF结束。 / p>

下一个段(16位器件)从下一个字节开始,即0x0100,长度为256个字节 - 将结束位于0x01FF。

然后是2KB(2048字节)的RAM,但它从0x1100开始,如描述所示,而不是紧接在前一段之后,因此这是你的起始地址。添加2048,你得到0x18FF。

最后一段覆盖了内存的上半部分,所以你必须向后工作,你知道它以0xFFFF(可用内存的结尾)结束,并且它的长度为56KB。如果将56KB转换为十六进制,则为0xDFFF。如果你想象这个段从0开始,那就留下了2000个未使用的(0xE000-0xEFFF和0xF000-0xFFFF),所以你知道这个段必须从0x2000开始到内存空间的上端结束。

我希望这更清楚,但是当我读完它时,我不知道它有任何帮助:(也许这就是为什么我会把这个概念教给更有资格的人......

答案 1 :(得分: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];
}