首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__eeprom和EEMEM

__eeprom和EEMEM
EN

Stack Overflow用户
提问于 2022-07-28 19:55:01
回答 1查看 172关注 0票数 0

我正在尝试将一个代码库从iar移植到avr。在其他必须替换的东西中,iar eeprom内存属性__eeprom必须替换为avr-gcc友好属性。AFAIK替换的是EEMEM,但用法不同,我无法找到如何以最干净的方式替换__eeprom。

代码语言:javascript
复制
../src/myfunc.h:35:46: error: section attribute not allowed for 'src'
     UBYTE *strcpye(UBYTE *dest, UBYTE EEMEM *src);

此错误不限于指针,而是一般的所有变量。我认为EEMEM的使用是正确的,我哪里出错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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提供的函数/宏(如

代码语言:javascript
复制
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*,而charsigned charunsigned char是C中的3种不同类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73158506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档