0

我正在对来自 Altera 的 Nios II 软核处理器进行编程,下面是其中一个教程中的代码,我设法通过在硬件(DE2 板)上对其进行测试来使代码正常工作,但是,我无法理解代码。

#define Switches (volatile char *) 0x0003000
#define LEDs (char *) 0x0003010
void main()
{ while (1)
*LEDs = *Switches;
}

我所知道#define的是,它要么用于定义常量,要么用于定义,但是

  1. 为什么在上面的代码中,有像(char *) 0x0003010,,在#define
  2. 为什么是 2 个常量,Switches并且LEDs像一个变量而不是一个常量?
4

4 回答 4

4

看起来SwitchesLEDs表示到实际输入(在 的情况下Switches)和输出(在 的情况下LEDs)的内存映射。

所以你的答案包括:

  1. 输入开关的字节被内存映射到地址 0x0003000。为了以字节的形式访问它,您需要告诉编译器地址 0x0003000 处的任何内容都是 a char(实际上,您告诉它该地址处的值是 a volatile char,以便编译器不会优化这一事实该地址的值可能随时更改)。

  2. 它们常量,但它们是常量指针。也就是说,地址是恒定的,但那些地址所包含的值不是恒定的。

发生的情况是,每个时钟周期(左右),从内存地址 0x0003000 读取的任何内容都会被写入地址 0x0003010。这给人一种开关立即切换 LED 的错觉。

于 2010-06-10T01:53:35.267 回答
4

1) 为什么在上面的代码中,#define 中有类似 (char *) 0x0003010 的类型转换?

预处理器宏是文本替换。所以代码出来为

while (1) {
  *(char *) 0x0003010 = *(volatile char *) 0x0003000
}

它重复将映射在 0x3000 的输入(开关)的内容分配给映射在 0x3010 的输出(led)。

2) 为什么 2 个常量、开关和 LED 的行为就像一个变量而不是一个常量?

请注意,这些是指针。所以它们总是指向同一个地方(恰好是几个内存映射的 IO 引脚或类似的东西),但不能保证这些常量位置的内容是常量,并且*出现在每个预处理器符号之前的是指针取消引用运算符。

于 2010-06-10T02:03:06.620 回答
3

在 C 中,宏是简单的替换。

每次编译器LEDs在您的代码中看到它都会将其替换为(char *) 0x0003010.

因此,您的代码实际上与此相同:

void main()
{
    while (1)
        *(char *) 0x0003010 = *(volatile char *) 0x0003000;
}
于 2010-06-10T01:55:57.603 回答
0

如果没有 #defines 的类型转换,它们将不会被视为 char* 和 volatile char*。*Switches 中的内容被复制到 *LEDs 中。

于 2010-06-10T01:57:45.370 回答