Sto sviluppando il firmware per un'applicazione incorporata con vincoli di memoria. Ho una serie di comandi che devono essere elaborati appena ricevuti. Ogni comando rientra in "bucket" diversi e ogni "bucket" ottiene un intervallo di numeri di comando validi. Ho creato due ENUM come mostrato di seguito per raggiungere questo obiettivo.Utilizzo di ENUM come bitmap, come convalidare in 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
Quando la mia funzione di gestore di comando riceve un codice di comando, si ha la necessità di controllare se il comando è abilitato prima di elaborarlo. Ho intenzione di usare una bitmap per questo. I comandi possono essere abilitati o disabilitati dall'elaborazione durante l'esecuzione. Posso usare un int per ogni gruppo (dandomi 32 comandi per gruppo, mi rendo conto che 0xN00 a 0xN20 sono codici di comando validi e che gli altri codici nell'intervallo sono sprecati). Anche se i codici dei comandi sono sprecati, la scelta di progettazione ha il vantaggio di indicare facilmente il gruppo del codice di comando durante la visualizzazione dei dati non elaborati su una console.
Poiché molti sviluppatori possono aggiungere comandi all'enum 'cmd_codes' (possono essere aggiunti anche nuovi bucket in base all'esigenza per l'enum 'cmd_buckets'), voglio assicurarmi che il numero di codici di comando in ciascun bucket non superi 32 (bitmap è int). Voglio prendere questo in fase di compilazione piuttosto che in fase di esecuzione. A parte il controllo di ogni valore di BUCKET_N_CMD_MAX come di seguito e l'invio di un errore di compilazione, esiste una soluzione migliore?
#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
Si prega di suggerire inoltre se esiste un modo più elegante per progettare questo.
Grazie, apprezzo il tempo e la pazienza.
I commenti possono essere fatti; tuttavia, penso che la tua domanda sia più adatta al forum _Code Review_ di Stack Overflow. Qualcuno può spostarlo al codice Review? –
@PaulOgilvie La domanda sembra più adatta per Stack Overflow. La revisione del codice richiede esempi di codice completi e funzionanti. – Lundin
Questo esempio non ha alcun senso. Si dispone di un costante 'BUCKET_1 = 0x100' che poi assegna' CMD_BUCKET_1_START = BUCKET_1'. Le enumerazioni finali saranno quindi ottenere i valori 0x101, 0x102, ... e 'BUCKET_1_CMD_MAX' saranno 0x106. Poiché 0x106 è sempre maggiore di 0x20, l'assert statico verrà sempre attivato. Si prega di inviare un esempio di lavoro. – Lundin