2013-09-16 32 views
2

我翻阅了微控制器的一些C头文件,并且我一直看到寄存器地址初始化为vuint。我之前没有遇到过这种数据类型,所以我做了一些搜索,没有得到真正的结果。我得到的最接近的是https://stackoverflow.com/a/12855989,它告诉我v代表“易失性”。所以,我有挥发性无符号整数保存硬件寄存器地址。如在,我有一个数据类型,明确指出“这个地址是可以改变的”,表示硬连线的寄存器,并且不能像以往那样改变。我对vuint的理解是否正确?如果不是,我们为什么用这种方式表示地址?什么是C中的vuint,为什么在我的微控制器中?

+2

某处会出现'typedef'。找到它,它可能会变得更清晰。 – marko

+0

找出该类型的一种方法是预处理源文件。例如,对于gcc,您可以使用“-E”选项仅进行预处理,输出将为预处理的源文件。然后,您可以搜索输出以查看vuint是typedef还是#define。 –

+0

很高兴看到它的正确/原始使用情况下的volatile的讨论,而不是关于线程,多处理器的长时间讨论..... – pm100

回答

5

内存映射寄存器被设置为易失性,因为它们中的值可能因编译器不知道的外部原因(硬件中断等)而改变。这意味着编译器应该避免某些优化,并确保实际读取地址(而不是针对缓存值进行优化等)。

快速示例,包含一些标志的内存映射寄存器。

read flags 
set bit in flags 
interrupt sets another bit 
<compiler optimizes and cached flags from before> 
read flags <contains incorrect cached value> 
+0

酷。我没有考虑到它的好意,不正确的优化。让我想知道现在是否有一些我第一次学习微软时遇到的错误可能是由于使用了普通的提示。 –

+0

这是可能的。这仅适用于内存映射硬件寄存器。除了一些RISC处理器上的缓存一致性和其他一些非常技术性的东西外,没有其他很多用例可用于volatile。 –

2

我认为你是曲解类型。它很可能是一个指向易失性无符号整数的指针,表示无符号整数是易失性的,而不是指针。在通过结构描述硬件寄存器时,这是典型的。每个结构成员将是一个易失性的无符号整数,并在某处定义一个基地址,用于指示寄存器在内存映射中的起始位置。

+0

你很正确。回头看看标题,这是一个指针。示例行:#define MCF_PIT0_PCSR(*(vuint16 *)(&__ IPSBAR [0x150000])) –

相关问题