我有一个 ATMega328 并且我正在使用 <avr/eeprom.h> 函数来使用内置的 EEPROM

我可以正确使用 EEPROM 但我不明白我传递给 EEPROM 函数的函数参数。

例如,要编写我可以使用的不同类型的数据

void eeprom_update_byte (uint8_t *addr, uint8_t value);
void eeprom_update_word (uint16_t *addr, uint16_t value);
void eeprom_update_dword (uint32_t *addr, uint32_t value);
void eeprom_update_float (float *addr, float value);
  • 但是为什么地址的指针类型(addr 参数)会根据所使用的函数而变化呢?如果 addr 只是指向一个有效的 EEPROM 地址,为什么每个函数中的类型都不同?
  • 另外,在下面的 void * 函数中使用 EEPROM 也让我感到困惑。我知道 void * 可以指向任何地址,所以我假设该函数只是将 src 中的数据逐字节写入,但我不确定这是否正确?
  • void eeprom_update_block (const void *src, void *dst, size_t n);

    最佳答案

    列出的前四个函数定义了正在写入的对象的类型。所以在内部函数可能是这样的:

    void eeprom_update_float (float *addr, float value)
    {
        *addr = value;
    }
    

    这通过确保目标指针与源变量相同来提供类型安全优势(例如,不能将 float 写入 uint16_t )。

    最终版本 void eeprom_update_block() 只是将任意内存块写入给定地址。它可能在下面使用类似 memcpy 的东西:
    void eeprom_update_block (const void *src, void *dst, size_t n)
    {
        memcpy(dst, src, n);
    }
    

    此版本的函数没有任何类型安全优势,但可用于将重要数据写入内存。例如,一个结构体可以这样写:
    eeprom_update_block(&myStruct, dst, sizeof(myStruct));
    

    关于c - 为什么这些函数使用不同的指针和空指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40976844/

    10-12 07:36
    查看更多