我在 Fujitsu 16 位微 Controller 的 EEPROM 中存储数据时遇到问题。 向 EEPROM 写入字节不是问题,我可以按字节写入和读取数据,没有问题。
我们使用 dword
的枚举在 EEPROM 中存储不同的变量,它们都是 4 个字节长。对于每个变量,我们要存储最多 4 个字节的空间。这不太好,因为当我只想存储一个标志(一位)或一个只有一个字节长的变量时,它仍然会占用四个字节。
我们使用这种四字节技术的原因是我们知道我要访问的变量存储在哪个地址上。这工作正常,但它有很多缺点。
一个是浪费的空间,另一个是我在使用结构体时出现的问题。
例如我有一个类似的结构
typedef struct {
attenuator_whichone_t attenuator;
char* attenuatorname;
servo_whichone_t associated_servo;
ad_ad7683_whichone_t associated_adconverter;
word item_control;
word item_mode;
word item_position;
} attenuator_info_t;
并像这样初始化它:
static attenuator_info_t constinfo[_NUM_ATTENUATOR_WHICHONE_] = {...}
使用我们现在使用的代码,我们需要单独保存每个值。 因此打破了结构。我真的很想按原样存储该结构。 (还有一些我们在代码中有)。
据我所知,我需要一个文件系统。谷歌搜索给了我一些例子,比如 microFAT所以。在我看来,这是矫枉过正。
用 sizeof 存储结构并遍历所有字节会很好,但是,我该如何处理知道结构在 EEPROM 中的位置的问题? 所以可能需要某种文件系统。没有更小的东西吗?还是什么把戏?无论如何,变量都是固定长度的。所以这就是为什么我想知道是否有一些简单好用的方法来存储这些结构。
我希望我能详细说明我的问题。
最佳答案
From my understanding I would need a filesystem for that. A Google search gave me some examples like the microFAT and so. This is, in my opinion, overkill.
不,文件系统与您描述的任务无关。文件系统定义了文件名称 和文件 之间的映射,可以任意创建、访问、删除和调整大小。您没有提到运行时修改的名称或要求。这似乎有些矫枉过正,因为定义文件系统的基本服务是您不需要的。
We are using an enum of
dword
s to store different variables in the EEPROM and they are all 4 bytes long.
我想你的意思是 dword
的数组。
如果这导致了问题,为什么不考虑改变它呢?
听起来你只知道如何用表格的定义来初始化EEPROM
static attenuator_info_t constinfo[_NUM_ATTENUATOR_WHICHONE_] = {...}
EEPROM 没有要求这样做的技术限制。 struct
是字节序列,就像 array
一样。大多数嵌入式编译器还允许您将一系列 struct
、数组和其他定义视为字节序列,方法是用适当的 #pragma
包围它们。
我对 EEPROM 一无所知,也不知道 constinfo
在您构建程序后是否会发生变化,我无法告诉您如何写入它。但看起来你真的想要将一堆命名变量映射到一个字节序列。这可能需要文件格式,但不需要文件系统。
如果 EEPROM 是内存映射的,那么您可以将指针编译到其中:
extern struct foo_info_type foo_info;
extern struct bar_info_type bar_info;
/* EEPROM table of contents */
struct foo_info_type *foo_ptr = & foo_info;
struct bar_info_type *bar_ptr = & bar_info;
/* ... more pointers ... */
/* Actual data in EEPROM, pointers point here */
struct foo_info_type foo_info;
struct bar_info_type bar_info;
关于c - 使用某种文件分配表将结构存储在 EEPROM 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7190405/