在我的ISR中,我有一个从USART填充的缓冲区,所以我将缓冲区声明为volatile:
volatile uint8_t RxBuffer1[BUFFER_LENGTH];
好的,那里没问题。我相信这是标准做法。
在main()中的某处我需要复制该数组的一部分,因为该数组是一个循环缓冲区,并且将来某个时候会被删除:
strncpy(Data, RxBuffer1, len);
哦,但这不是不!我的编译器尽职尽责地告诉我:
传递'strncpy'的参数2,从指针目标类型
中丢弃'volatile'限定符
因为strncpy使's2'成为一个const char *
我认为我没有做任何没有做过标准练习的事情。我该如何正确地做到这一点?
答案 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中优化同一内存的子序列副本。