AVR XMEGA 上的 EEPROM 内存管理

Posted

技术标签:

【中文标题】AVR XMEGA 上的 EEPROM 内存管理【英文标题】:EEPROM Memory management on AVR XMEGAs 【发布时间】:2013-10-25 14:14:18 【问题描述】:

我在理解如何管理 EEPROM 地址空间时遇到了一些困难。 事实是(据我了解):

可以在 EEPROM 上有 本地 变量(例如,使用 avr-gcc 的 EEMEM 宏) 可以进行递归函数调用 因此我可以使用驻留在 EEPROM 内存空间中的局部变量的递归函数 这意味着(在这种情况下)在编译时未知我将使用多少 EEPROM 空间

那么,这是如何管理的? EEPROM上是否有类似堆栈的东西?

另外,如果有这样的事情:它如何处理用户强制的固定地址变量? 假设我强制编译器在地址 0x0FFF 处给我一个变量 x。如果EEPROM堆栈(假设有这样的东西)从0x000开始,它如何避免覆盖x?

这可能不是人们通常担心的问题,但我只是好奇并想了解细节......

干杯! 菲利普

【问题讨论】:

【参考方案1】:

你错过了事实清单中的一个关键点。

EEMEM 宏确实可以导致变量被放入 EEPROM

#define EEMEM __attribute__((section(".eeprom")))

section attribute 仅适用于全局变量,而不是递归函数中使用的局部变量。所以,不,EEPROM 中没有堆栈。堆栈始终在 SRAM 中。

由于 EEPROM 仅用于全局变量,因此在编译时就知道使用了多少。如果您还强制使用内存位置,则不会导致问题。编译器会确保它为其他全局变量选择的地址不会发生冲突。

【讨论】:

以上是关于AVR XMEGA 上的 EEPROM 内存管理的主要内容,如果未能解决你的问题,请参考以下文章

arduino编程时候如何利用winavr的库文件??如:#include <avr/EEPROM.h>

一种避免 pgm_read 访问闪存的方法(avr 微控制器)

avr-gcc:如何将 __attribute__((address)) 与 EEMEM 一起使用?

将默认值写入 eeprom

AVR开发 Arduino方法(附二) 故障排除:烧录引导程序

Linux / Windows Arduino IDE 上的 avr-gcc Atmel AVR 微控制器