【发布时间】:2016-08-12 06:32:12
【问题描述】:
我有一个 volatile char * start_address; 指向寄存器部分(可能会因硬件行为而改变)。我需要阅读它并且我正在使用:
memcpy (
result_p, // starting address of destination
start_address, // starting address of source
result_len // for the length of the payload
);
我收到此警告:
传递 '
memcpy' 的参数 2 会丢弃 'volatile' 限定符 指针目标类型
阅读这些部分是一种更安全的方式,还是使用 memcpy 并防止出现此警告的更好方式?
【问题讨论】:
-
result_len的典型值是多少?寄存器都是 8 位的,寄存器之间没有间隙吗?就个人而言,在处理硬件寄存器时,使用memcpy不是我的首选。但是如果没有关于硬件的更多信息,就很难回答您的问题。 -
检查:您想一次读取多个寄存器吗?
-
如何同步此内存以避免竞争条件?如果你确定它是同步的,为什么不直接扔掉 volatile 修饰符呢?
-
在大多数情况下你真的不想使用
volatile。标准严重低估了它,它并没有使事情变得线程安全(尽管许多人似乎相信这一点),它主要只是用来阻止优化器对你的代码做聪明的事情。你确定你真的不想要一个原子变量吗? -
@JesperJuhl:这是一个嵌入式项目,标准中存在公认的缺陷,幸运的是,任何实现都没有实现该缺陷。相反,他们实现了应有的方式。对于硬件寄存器,
volatile是正确的限定符。