volatile uint8_t reset_mask[768] = {0}
现在我在一个内部操作期间将此数组元素的值设置为1.
在另一个函数调用中,我需要将此数组的所有元素设置为0.一种方法是使用for循环,但我相信更好的方法来分配数组的所有元素是使用memset
memset(reset_mask, 0, sizeof(reset_mask));
但我收到此错误: - “从类型'volatile uint8_t * {aka volatile unsigned char *}'转换为'void *'类型”抛弃限定符“
如果我们不能在这里使用memset,有没有更好的方法一次性设置这个volatile数组的所有元素?
答案 0 :(得分:6)
你可以“memset
使用const_cast
来消除易变性,但它会删除易失性语义。所以,除非你没问题,否则你会遇到循环版本。除非您的实现为您提供了一个memset版本,该版本需要使用volatile *并且已记录下来以完成您的工作。 (我认为在嵌入式系统之外不太可能,即使在那里也会让我感到惊讶。)
答案 1 :(得分:3)
正如Balog Pal所说,抛弃volatile
来调用memset
会破坏volatile
语义。整个memset
可能会被优化掉,或者发生未定义的行为不良。
编写自己的循环以将数组清零,或使用此memset_volatile
:
void memset_volatile(volatile void *s, char c, size_t n)
{
volatile char *p = s;
while (n-- > 0) {
*p++ = c;
}
}
真实memset
也会返回s
而c
又是int
,但此版本对我来说更清晰。
目前还不清楚是否允许编译器优化此函数以一次写入多个字节,因此如果数组非常大,则可能会有点慢。