Memory ATmega32 SRAM和EEPROM的差异

Memory ATmega32 SRAM和EEPROM的差异,memory,embedded,microcontroller,ram,non-volatile,Memory,Embedded,Microcontroller,Ram,Non Volatile,所以从我读到的来看,SRAM是易失性的,EEPROM是非易失性的。如果SRAM是易失性的,为什么我在使用*ptr时有时会得到值(随机值和垃圾值,但仍然是值) 例如,对于ptr=&x,*ptr可能会给我一个值。我不应该得到NULL,因为它是易失性的,并且SRAM在每次断电时都会被擦除吗?易失性,在内存方面,意味着在一次电源循环后,值不会被保留。鉴于RAM的性质,它可能在通电时包含任何垃圾值。硬件中没有任何东西可以将RAM初始化为零 因此,如果需要,您必须手动将RAM初始化为零 C标准实际上要求对所

所以从我读到的来看,SRAM是易失性的,EEPROM是非易失性的。如果SRAM是易失性的,为什么我在使用*ptr时有时会得到值(随机值和垃圾值,但仍然是值)


例如,对于ptr=&x,*ptr可能会给我一个值。我不应该得到NULL,因为它是易失性的,并且SRAM在每次断电时都会被擦除吗?

易失性,在内存方面,意味着在一次电源循环后,值不会被保留。鉴于RAM的性质,它可能在通电时包含任何垃圾值。硬件中没有任何东西可以将RAM初始化为零

因此,如果需要,您必须手动将RAM初始化为零

C标准实际上要求对所有具有静态存储持续时间的变量进行初始化,但仅限于这些变量。在执行
main()。但是局部C变量永远不会自动初始化


请注意,C中的
volatile
关键字与volatile内存几乎没有关系。不要混淆这两个不同的术语。

在内存方面,Volatile意味着在一次电源循环后,值不会被保留。鉴于RAM的性质,它可能在通电时包含任何垃圾值。硬件中没有任何东西可以将RAM初始化为零

因此,如果需要,您必须手动将RAM初始化为零

C标准实际上要求对所有具有静态存储持续时间的变量进行初始化,但仅限于这些变量。在执行
main()。但是局部C变量永远不会自动初始化


请注意,C中的
volatile
关键字与volatile内存几乎没有关系。不要混淆这两个不同的术语。

不。你需要混合上下文。一个是内存的波动性,它涉及到内存的物理结构。另一个是您的代码读取随机内存地址

有时硬件可以在通电时擦除SRAM,有时不能,您不能指望它


如果您在代码中读取RAM的未占用地址,您将读取垃圾,或者是在通电过程中生成的位,或者是在同一通电周期中已处理且不再使用的旧数据

不,你需要混合上下文。一个是内存的波动性,它涉及到内存的物理结构。另一个是您的代码读取随机内存地址

有时硬件可以在通电时擦除SRAM,有时不能,您不能指望它


如果您在代码中读取RAM的未占用地址,您将读取垃圾,或者是在通电过程中生成的位,或者是在同一通电周期中已处理且不再使用的旧数据

SRAM和EEPROM指的是特定的内存技术,但问题适用于所有内存技术,可大致分为易失性和非易失性。SRAM和EEPROM指的是特定的内存技术,但问题适用于所有内存技术,可大致分为易失性和非易失性。