C字符串标准库、memset和丢弃的volatile关键字

C字符串标准库、memset和丢弃的volatile关键字,c,volatile,xc32,C,Volatile,Xc32,我在xc32编译器(基于gcc的微控制器编译器,不是开源的)上收到这样的警告 modem_uart.c:66:5:警告:传递'memset'丢弃的参数1 指针目标类型的“volatile”限定符[默认启用] 代码如下: #include <string.h> // (...) volatile char rxbuf[MODEM_UART_RXBUF_SIZE]; // (...) void some_function(void) { // (...) mem

我在xc32编译器(基于gcc的微控制器编译器,不是开源的)上收到这样的警告

modem_uart.c:66:5:警告:传递'memset'丢弃的参数1 指针目标类型的“volatile”限定符[默认启用]

代码如下:

#include <string.h>
// (...)
volatile char rxbuf[MODEM_UART_RXBUF_SIZE];
// (...)

void some_function(void)
{    
    // (...)
    memset(rxbuf, 0, MODEM_UART_RXBUF_SIZE); // <- warning here
    // (...)
}
#包括
// (...)
易失性字符rxbuf[MODEM_UART_rxbuf_SIZE];
// (...)
void某些函数(void)
{    
// (...)

memset(rxbuf,0,MODEM_UART_rxbuf_SIZE);//您的平台没有提供
memset
函数,该函数保证遵守它为
volatile
提供的任何保证。因此,为了调用
memset
,编译器必须放弃
rxbuf
上的
volatile
限定符


您可能应该编写自己的
memset
实现,该实现尊重您期望
volatile
为您提供的任何保证。包括一个
memcpy
来解决类似问题。如果没有这样的保证,那么就去掉
volatile

您的平台不提供
memset
函数,该函数保证遵守它为
volatile
提供的任何保证。因此,为了调用
memset
,编译器必须放弃
rxbuf
上的
volatile
限定符


您可能应该编写自己的
memset
实现,该实现尊重您期望
volatile
为您提供的任何保证。包括一个用于
memcpy
的实现,以解决类似的问题。如果没有这样的保证,则删除
volatile

标准中的规范以下声明:

void *memset(void *s, int c, size_t n);
第一个参数未声明为
volatile void*s
。因此,它不能保证遵守访问
volatile
数据的额外限制。每次调用
memset()
都会将目标视为是volatile,这会造成不必要的性能影响

如果您需要这些保证,应该用显式循环替换
memset()
调用

for (int i = 0; i < MODEM_UART_RXBUF_SIZE; i++) {
    rxbuf[i] = 0;
}
for(int i=0;i

如果您在代码中的多个位置需要它,可以将其放入
volatile_memset()
函数中。

标准中的规范具有以下声明:

void *memset(void *s, int c, size_t n);
第一个参数未声明为
volatile void*s
。因此,它不能保证遵守访问
volatile
数据的额外限制。每次调用
memset()
都会将目标视为是volatile,这会造成不必要的性能影响

如果您需要这些保证,应该用显式循环替换
memset()
调用

for (int i = 0; i < MODEM_UART_RXBUF_SIZE; i++) {
    rxbuf[i] = 0;
}
for(int i=0;i

如果您在代码中的多个位置需要它,可以将其放入
volatile\u memset()
函数中。

因为
memset()的声明
在第一个参数上没有
volatile
。库函数没有放弃
volatile
,此代码尝试通过调用放弃
volatile
,编译器明智地发出警告。@Fredrason是的,实际上这与我正在做的非常相似。感谢链接,它也解释了我的其他问题。因为
memset()的eclaration
在第一个参数上没有
volatile
。库函数没有丢弃
volatile
,此代码尝试通过调用丢弃
volatile
,编译器明智地发出警告。@Fredrarson是的,实际上这与我正在做的事情非常相似。感谢链接解释了我的其他问题。我可以添加register
i
修改
内部
修改以使其更快?好吧,这可能是另一个问题的主题…这几乎是不需要的。编译器擅长找出哪些变量将从寄存器中获得最大的好处。@Kamil如何强迫编译器做它已经做过的事情呢如果它是最快的选项,你的代码可能会更快吗?@Kamil一般来说,
寄存器
修饰符被认为是过时的。多年前,当优化器不如现在聪明时,它很有用。@Barmar哦,这是微控制器编译器,我不知道它基于哪个gcc版本,可能有自定义的optimizer代码(不是由人群编写的,可能很少有人使用微芯片)…也许我会在反汇编程序窗口中检查它。我可以在
I
for
中添加
register
修饰符以使其更快吗?好吧,这可能是另一个问题的主题…这几乎是不需要的。编译器擅长找出哪些变量会从寄存器中获得最大的好处。@Kamil如果它是最快的选项,那么强制编译器做它已经能做的事情怎么可能让你的代码更快呢?@Kamil一般来说,
register
修饰符被认为是过时的。多年前,当优化器不如现在聪明时,它很有用。@Barmar好吧,这是微控制器编译器,我不知道它基于哪一个gcc版本,可能有定制的优化器代码(不是由crowd编写的,可能很少有人使用Microchip)…也许我会在反汇编程序窗口中检查它。