我正在尝试将一个代码库从iar移植到avr。在其他必须替换的东西中,iar eeprom内存属性__eeprom必须替换为avr-gcc友好属性。AFAIK替换的是EEMEM,但用法不同,我无法找到如何以最干净的方式替换__eeprom。
../src/myfunc.h:35:46: error: section attribute not allowed for 'src'
UBYTE *strcpye(UBYTE *dest, UBYTE EEMEM *src);此错误不限于指针,而是一般的所有变量。我认为EEMEM的使用是正确的,我哪里出错了?
发布于 2022-07-31 13:41:52
在avr-gcc工具链中,avr-libc在avr/eeprom.h中定义了宏avr/eeprom.h。
#define EEMEM __attribute__((section(".eeprom")))
这意味着它只是一个属性,它决定了具有此属性的对象所在的部分。特别是,EEMEM只对静态存储中的变量有意义。此外,对位于EEMEM中的对象的访问必须使用avr/eeprom.h提供的函数/宏(如
void eeprom_read_block (void *dst, const void *src, size_t n);
void eeprom_write_byte (uint8_t *p, uint8_t value);
void eeprom_update_word (uint16_t *p, uint16_t value);还请注意,EEMEM只是一个属性,而不是限定符(例如,__flash )。这意味着,即使可以使用属性标记指针(目标),也不会以任何方式更改访问。更确切地说,任何通过指针访问属性为EEMEM的访问都将指向RAM,而不是eeprom。
在您的示例中,strcpye的原型将读取
char* strcpye (char *dest, const char *src);
该函数的实现将在src++上应用src++并将其写入dest++,直到读取终端\0为止。注意,您可能需要一个显式指针强制转换,因为eeprom_read_byte需要[const] uint8_t*,而char、signed char和unsigned char是C中的3种不同类型。
https://stackoverflow.com/questions/73158506
复制相似问题