c - 何らかのファイルアロケーションテーブルを使用してEEPROMに構造体を保存する

原文 c microcontroller eeprom

富士通の16ビットマイクロコントローラーのEEPROMにデータを保存する際に問題があります。
EEPROMへのバイトの書き込みは問題ではありません。問題なくバイト単位でデータを読み書きできます。

列挙型のdwordを使用して、EEPROMにさまざまな変数を格納しています。これらの変数はすべて4バイト長です。変数ごとに、最大4バイトのスペースを格納します。フラグ(1ビット)または長さが1バイトしかない変数のみを格納したい場合でも、最大4バイトを使用するため、これはかなり良くありません。

この4バイトの手法を使用する理由は、アクセスしたい変数が格納されているアドレスを知るためです。これは問題なく動作しますが、いくつかの欠点があります。

1つは無駄なスペースで、もう1つは構造体で作業するときに発生する問題です。

たとえば、私は次のような構造体を持っています

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_] = {...}


現在使用しているコードでは、すべての値を個別に保存する必要があります。
したがって、構造をバラバラにします。その構造をそのまま保存したいです。 (そして、コードにいくつかあります)。

私の理解から、そのためのファイルシステムが必要になります。 Google検索でmicroFATなどの例が得られました。私の意見では、これはやり過ぎです。

sizeofを使用して構造体を格納し、すべてのバイトを反復処理することは問題ありませんが、構造体がEEPROMのどこにあるかを知るという問題にどのように対処しますか?
そのため、おそらく何らかのファイルシステムが必要になります。もっと小さいものはありませんか?またはトリック?変数はとにかく固定長です。だからこそ、これらの構造体を格納するための素晴らしくシンプルな方法があるのか​​と思いました。

私は自分の問題の詳細について詳しく説明できればと思います。
答え
私の理解から、そのためのファイルシステムが必要になります。 Googleの検索で、microFAT​​などの例が得られました。私の意見では、これはやり過ぎです。


いいえ、ファイルシステムは、記述したタスクとは無関係です。ファイルシステムは、ファイル名と、任意に作成、アクセス、削除、サイズ変更できるファイルとの間のマッピングを定義します。実行時に変更するための名前や要件について言及していません。ファイルシステムを定義する重要なサービスは不要なものなので、やり過ぎのようです。


列挙型のdwordを使用して、EEPROMにさまざまな変数を格納しています。これらの変数はすべて4バイト長です。


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 - Ansi CのSOAPリクエストメッセージ

c - Solarisスレッドの最大数

c - Autotoolsを使用してライブラリをプログラムにリンクするには、Makefile.amとソースに何を表示する必要がありますか?

c++ - 十分に文書化されたオープンソースおよび高速C / C++画像操作ライブラリ。 「サイズ変更」のように、回転、色の変更、切り抜き[終了]

mysql - MySql dbと対話するCプログラムのコンパイルの問題

c - libcurl(7.19,7)がO​​SX(10.6.8)で_mdns_query_callbackを使用してクラッシュする

c - この構造のサイズが4バイトになる方法

python - ctypesで関数に構造体ポインタを渡す

c - ロスレスURL短縮を実装する方法

c - Cのポインターと配列