如何使用memset将volatile数组设置为零?

时间:2013-06-17 09:43:21

标签: c++ arrays volatile memset

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数组的所有元素?

2 个答案:

答案 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也会返回sc又是int,但此版本对我来说更清晰。

目前还不清楚是否允许编译器优化此函数以一次写入多个字节,因此如果数组非常大,则可能会有点慢。