如何正确计算地址空间?

问题描述 投票:0回答:2

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

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

什么 起始地址 结束地址
特殊功能寄存器(16 字节) 0x0000 0x000F
8 位外围设备(240 字节) 0x0010 0x00FF
16 位外围设备(256 字节) 0x0100 0x01FF
RAM 内存(2 KB) 0x1100 0x18FF
闪存(56 KB) 0x2000 0xFFFF
memory-address spaces cpu-registers msp430
2个回答
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 字节,因此它以字节 255 (240 + 15) 或 0x00FF 结束。

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

然后是 2KB(2048 字节)的 RAM,但正如描述所述,它从 0x1100 开始,而不是紧接在上一个段之后,所以这就是您的起始地址。添加 2048,您将得到 0x18FF。

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

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


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];
}
© www.soinside.com 2019 - 2024. All rights reserved.