C字符串标准库、memset和丢弃的volatile关键字
我在xc32编译器(基于gcc的微控制器编译器,不是开源的)上收到这样的警告 modem_uart.c:66:5:警告:传递'memset'丢弃的参数1 指针目标类型的“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
#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)…也许我会在反汇编程序窗口中检查它。