【发布时间】:2014-09-04 21:49:18
【问题描述】:
我是中小型内存型号 CPU 编程的新手。我正在使用一个嵌入式处理器,它在地址 0x00000 到 0x3FFFF 中包含 256KB 的闪存代码空间,在地址 0xF0000 到 0xFFFFF 中包含 20KB 的 RAM。有编译器选项可以在小型、中型或大型内存模型之间进行选择。我选择了中等。我的问题是,编译器如何区分代码/闪存地址和 RAM 地址?
例如,我在 RAM 地址 10 有一个 1 字节变量,我在实际地址 10 有一个 const 变量。我做了类似的事情:
value = *((unsigned char *)10);
编译器将如何在实际地址 10 或(虚拟?)地址 10 之间进行选择。我想如果我想在实际地址 10 处指定值,我会使用:
value = *((const unsigned char *)10);
?
另外,您能否解释一下我认为与答案相关的以下代码:
uint32_t var32; // 32 bit unsigned integer.
unsigned char *ptr; // 2 byte pointer.
ptr = (unsigned char *)5;
var32 = (uint32_t)ptr;
printf("%lu", var32)
代码打印 983045(0xf0005 十六进制)。看起来不太现实,一个16位的变量怎么能返回一个大于16位可以存储的值呢?
【问题讨论】:
-
首先,细节可能是特定于平台的(我不知道“中等内存模型”可能是什么)。但听起来闪存和 RAM 都映射到同一个地址空间;
10属于您所说的闪存映射到的范围,因此它从闪存读取。 -
次要:应使用
printf("%" PRIu32, var32)或printf("%lu", (unsigned long) var32)。 -
我的编译器不支持 PRIu32。事实上,它甚至不包括 uint32_t 的
,我只是为了清楚起见而举了一个例子。实际类型是无符号长整数,在我的编译器上是一个 32 位变量。 -
中内存模型意味着 2 字节指针用于 RAM/变量和 4 字节指针用于代码。
-
你能澄清一下你的意思是x86 medium memory model还是别的什么?
标签: c compiler-construction embedded memory-address memory-model