メモリの制約がある組み込みアプリケーションのファームウェアを開発しています。私は受け取ったときに処理する必要のある一連のコマンドを持っています。各コマンドは異なる「バケット」の下にあり、各「バケット」は有効なコマンド番号の範囲を取得します。これを実現するために、以下に示す2つのENUMを作成しました。私のコマンドハンドラ関数は、コマンドコードを受信ENUMをビットマップとして使用してCで検証する方法
enum
{
BUCKET_1 = 0x100, // Range of 0x100 to 0x1FF
BUCKET_2 = 0x200, // Range of 0x200 to 0x2FF
BUCKET_3 = 0x300, // Range of 0x300 to 0x3FF
...
...
BUCKET_N = 0xN00 // Range of 0xN00 to 0xNFF
} cmd_buckets;
enum
{
//BUCKET_1 commands
CMD_BUCKET_1_START = BUCKET_1,
BUCKET_1_CMD_1,
BUCKET_1_CMD_2,
BUCKET_1_CMD_3,
BUCKET_1_CMD_4,
//Add new commands above this line
BUCKET_1_CMD_MAX,
//BUCKET_2 commands
CMD_BUCKET_2_START = BUCKET_2,
BUCKET_2_CMD_1,
BUCKET_2_CMD_2,
BUCKET_2_CMD_3,
//Add new commands above this line
BUCKET_2_CMD_MAX,
//BUCKET_3 commands
...
...
...
//BUCKET_N commands
CMD_BUCKET_N_START = BUCKET_N
BUCKET_N_CMD_1,
BUCKET_N_CMD_2,
BUCKET_N_CMD_3,
BUCKET_N_CMD_4,
//Add new commands above this line
BUCKET_N_CMD_MAX,
}cmd_codes
は、それはコマンドがそれを処理する前に有効になっているかどうかを確認する必要があります。私はこのためにビットマップを使用する予定です。実行時に処理からコマンドを有効または無効にすることができます。私は各グループにintを使うことができます(グループごとに32のコマンドを与えます、私は0xN00から0xN20が有効なコマンドコードであり、範囲内の他のコードは無駄であることに気づきます)。コマンドコードが無駄になっても、デザインデータの選択は、コンソール上で生データを見るときにコマンドコードのグループに簡単に伝えるという利点があります。
多くの開発者が 'cmd_codes'列挙型にコマンドを追加できます(必要に応じて新しいバケットを 'cmd_buckets'列挙型に追加することもできます)ので、各バケットのコマンドコードの数が32(ビットマップはintです)。私は実行時間ではなくコンパイル時にこれをキャッチしたい。以下のように各BUCKET_N_CMD_MAXの値をチェックし、コンパイル時エラーを投げる以外に、よりよい解決法がありますか?
#if (BUCKET_1_CMD_MAX > 0x20)
#error ("Number of commands in BUCKET_1 exceeded 32")
#endif
#if (BUCKET_2_CMD_MAX > 0x20)
#error ("Number of commands in BUCKET_2 exceeded 32")
#endif
#if (BUCKET_3_CMD_MAX > 0x20)
#error ("Number of commands in BUCKET_3 exceeded 32")
#endif
...
...
...
#if (BUCKET_N_CMD_MAX > 0x20)
#error ("Number of commands in BUCKET_N exceeded 32")
#endif
これをよりうまく設計する方法もありますか?
ありがとう、私はあなたの時間と忍耐を感謝します。
コメントは作成できます。しかし、私はあなたが質問Stack Overflowの_Code Review_フォーラムのためのより適切であると思う。コードレビューに誰もこれを移すことができますか? –
@PaulOgilvie質問は、スタックオーバーフローに適しているようです。コードレビューには、完全で実用的なコード例が必要です。 – Lundin
この例は意味をなさない。 'BUCKET_1 = 0x100'という定数があり、' CMD_BUCKET_1_START = BUCKET_1'を割り当てます。したがって、末尾のenumは0x101、0x102、...を取得し、BUCKET_1_CMD_MAXは0x106になります。 0x106は常に0x20より大きいので、静的なアサートは常にトリガします。実例を投稿してください。 – Lundin