将volatile数组传递给strncpy

时间:2012-01-20 15:17:01

标签: arrays volatile argument-passing strncpy

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

volatile uint8_t RxBuffer1[BUFFER_LENGTH];

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

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

strncpy(Data, RxBuffer1, len);

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

  

传递'strncpy'的参数2,从指针目标类型

中丢弃'volatile'限定符

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

我认为我没有做任何没有做过标准练习的事情。我该如何正确地做到这一点?

3 个答案:

答案 0 :(得分:1)

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

语法类似于strncpy:

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

在你的情况下:

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

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

答案 1 :(得分:1)

转换传递给const char *

的参数

答案 2 :(得分:-1)

抛出易失性几乎肯定是安全的,但技术上它是编译器特定的。

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

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

你几乎肯定不关心memcpy在一次调用memcpy中优化同一内存的子序列副本。