AVR XMEGA上的EEPROM存储器管理

时间:2013-10-25 14:14:18

标签: memory-management avr avr-gcc atmel eeprom

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

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

那么,这是如何管理的? EEPROM上有堆栈式的东西吗?

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

这可能是人们通常不担心的事情,但我只是好奇并希望了解细节......

干杯! 菲利普

1 个答案:

答案 0 :(得分:2)

您错过了事实清单中的关键点。

EEMEM宏确实可以将变量放在EEPROM

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

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

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