MCU (ARM Cortex-M3) のファームウェアに取り組んでいます。これらのデバイスには大量の RAM が搭載されていないため、データをコンスタント メモリ (フラッシュ) に格納するようにしてください。
問題は次のようになります: デバイスは、インターフェイス (MODBUS) によって読み取られる「レジスタ」を提供する必要があるため、オペレーターは「アドレス」10 を読み取って数値を取得し、「アドレス」101 に「書き込み」、何百ものこれらの「アドレス」があり、それらへのアクセスは何らかのアクションを引き起こします-たとえば、1-10 からの読み取りはセンサー 1 から 10 の温度の測定を引き起こし、11-20 からの読み取りは読み取りを引き起こします。一部のキャリブレーション値のうち、これらのアドレスへの書き込みにより、これらのキャリブレーション値が不揮発性メモリなどに保存されます。さまざまな機能がたくさんあります (;
現在、次のように実装しています。
読み取りと書き込みのためにアドレスをコールバック関数にバインドする配列が 1 つあります。1 つのコールバック関数を複数のアドレスにバインドできます (上の例のように、同じコールバックが 1 ~ 10 に使用されます)。
コールバックのパラメーターにアドレスをバインドする別の配列があります。パラメーターのタイプ/サイズが異なる可能性があるため、そのような配列が多数あります。上記の例では、構造体 {int address; の配列が 1 つあります。int sensor;} 1 ~ 10 および構造体の配列 {int address;} 整数 ID; int サイズ; 整数分; 整数最大; int デフォルト;} 11 ~ 20 の場合。
各コールバックは現在のアドレスを取得し、その配列で関連する構造体を見つけ、必要なパラメーターを取得できます
アドレスを複数回指定する必要があるため、このアプローチは少し反復的です。メイン配列にエントリ {1, readSensor, writeSensor} があり、配列またはセンサー {1, 0x5423} にアドレス 1 の別のエントリがあります。 DRYの原則には当てはまりません(;
私が考えた 1 つの解決策は、ポリモーフィック オブジェクトの配列でしたが、次のようになりました。
a. 仮想関数によりオブジェクトが RAM に配置されます (ROMable ではありません) 。編集:これは GCC のバグが原因のようです。4.6 では constexpr コンストラクターによりオブジェクトが RAM に配置されますが、4.7 では機能します!
b. オブジェクトを「どこかに」作成し、そのアドレスを配列に配置する必要があるため、これはまだ少し面倒です (配列は実際にはフラッシュに配置されます)。
完全にRAMに配置されるため、ベクターなどのSTLのものは使用できません。
テンプレート マジックについて考えたことがありますが、それはむしろブラック マジック (;
リンクされたリストについても考えましたが、それを読み取り可能で連続した形式 (配列 [; など) で宣言する「良い」方法は見当たりませんが、いくつかの良い解決策に慣れていない可能性があります。この問題。
最も簡単な解決策は、コールバックが別の「void *」パラメーターを受け入れ、それを内部で必要なものにキャストすることですが、それは「良くない」ものであり、パラメーターを使用して構造体を「どこか」で作成し、それらをメインにバインドする必要があります。配列。
エレガントなソリューションのアイデアはありますか? これは ROM にある必要があり、何百ものエントリがあり、それぞれが複数の異なるパラメータを持つことができます。