3

在我的 ISR 中,我有一个从 USART 填充的缓冲区,因此我将缓冲区声明为 volatile:

volatile uint8_t RxBuffer1[BUFFER_LENGTH];

好的,那里没有问题。我相信这是标准做法。

在 main() 中的某处,我需要复制该数组的一部分,因为该数组是一个循环缓冲区,并且将来某个时候会被删除:

strncpy(Data, RxBuffer1, len);

哦,但这是不,不!我的编译器尽职尽责地告诉我:

传递“strncpy”的参数 2 从指针目标类型中丢弃“volatile”限定符

因为 strncpy 使 's2' 成为 const char *

我不认为我在做任何没有按照标准做法做的事情。我该如何正确地做到这一点?

4

3 回答 3

2

将参数传递给const char *

于 2012-01-20T17:06:13.553 回答
2

我认为在这种情况下使用 memcpy 会更好。strcpy 和 strncpy 针对字符串(字符数组)进行了优化。

语法类似于 strncpy:

void* memcpy (void* dest, void* src, size_t bytes);

在你的情况下:

memcpy (Data, RxBuffer1, sizeof(uint8_t) * len);

(你可以省略 sizeof(uint8_t) 因为它是 1)。

于 2012-01-20T15:24:59.537 回答
-1

将 volatile 丢弃几乎可以肯定是安全的,但从技术上讲,它是特定于编译器的。

Volatile 只是告诉编译器不要应用任何优化,它将一些内存的副本放在寄存器中,并使用它而不是每次都返回并读取内存。

在您正在谈论的应用程序中,您关心的是 memcpy 不应返回与上次调用它时相同的数据,因为它没有重新读取缓冲区。但在实践中,以这种方式实现的可能性极小,因为这意味着编译器将跨函数调用的内容存储在寄存器中。理论上是可以的,但是意义不大。

而且您几乎肯定不会关心 memcpy 在一次调用 memcpy 中优化同一内存的后续副本。

于 2013-10-04T10:44:11.587 回答