組み込み C では、いくつかの固定/汎用アルゴリズムを使用することは非常に自然ですが、複数の実装が可能です。これは、いくつかの製品プレゼンテーション、オプションの場合もあれば、オプションの RAM、さまざまな IP セット MCU、アップグレードされた周波数など、製品ロードマップ戦略の一部に過ぎないことによるものです。
私のプロジェクトのほとんどでは、外部の状態評価、時間管理、メモリ ストレージなどを実装する実際の関数から、コア部分、アルゴリズム、およびロジック アーキテクチャを分離することによって、それに対処しています。
当然のことながら、私は C 関数ポインター メカニズムを使用し、それらのポインターに意味のある名前のセットを使用します。例えば
unsigned char (*ucEvalTemperature)(int *);
それは温度を int に格納し、戻り値は OKness です。
ここで、製品の特定の構成について、私が持っていると想像してください
unsigned char ucReadI2C_TMP75(int *);
TMP75 デバイスから I2C バス上の温度を読み取る関数と、
unsigned char ucReadCh2_ADC(unsigned char *);
ADC によって読み取られるダイオードの電圧降下を読み取る関数。これは、非常に広範なストロークで温度を評価する方法です。
基本的な機能は同じですが、オプション セットの製品が異なります。
一部の構成では、ucEvalTemperature を ucReadI2C_TMP75 に設定しますが、他の構成では ucReadCh2_ADC を使用します。この軽度のケースでは、問題を回避するために、引数の型を int に変更する必要があります。ポインターは常に同じサイズですが、関数のシグネチャは同じサイズではなく、コンパイラーは文句を言うからです。わかりました... それは殺人者ではありません。
この問題は、異なる引数のセットが必要な関数で明らかになります。署名は決して正しくなく、コンパイラは Fpointers を解決できません。
だから、私は3つの方法があります:
- 引数のグローバル スタックを使用し、すべての関数は unsigned char Func(void); です。
 - 各実装にヘルパー関数を使用して、make/call への適切な割り当てをオンに切り替えます。
 - JMP / LCALL アセンブリ呼び出しを使用すると (もちろんこれは恐ろしいことです)、コール スタックで大きな問題が発生する可能性があります。
 
どちらもエレガントでもなければ、落ち着いてもいません...あなたのアプローチ/アドバイスは何ですか?