Nel tipo di programmazione incorporata, il determinismo e la trasparenza del codice di esecuzione sono molto apprezzati. Ciò che intendo per trasparenza è, ad esempio, essere in grado di guardare sezioni arbitrarie della memoria e sapere quale variabile è memorizzata lì. Quindi, dato che sono sicuro che i programmatori incorporati si aspettano, il nuovo deve essere evitato, se possibile, e se non può essere evitato, quindi limitato all'inizializzazione.Come evitare le variabili globali nella programmazione integrata
Capisco la necessità di questo, ma non sono d'accordo con il modo in cui i miei colleghi hanno fatto questo, né conosco un'alternativa migliore.
Quello che abbiamo sono diversi array globali di strutture e alcune classi globali. C'è una matrice di strutture per mutex, una per i semafori e una per le code di messaggi (queste sono inizializzate in main). Per ogni thread che viene eseguito, la classe che lo possiede è una variabile globale.
Il problema più grande che ho con questo è nei test unitari. Come posso inserire un oggetto fittizio quando la classe che voglio testare le variabili globali #include
s non lo faccio?
Ecco la situazione in pseudo-codice:
foo.h
#include "Task.h"
class Foo : Task {
public:
Foo(int n);
~Foo();
doStuff();
private:
// copy and assignment operators here
}
bar.h
#include <pthread.h>
#include "Task.h"
enum threadIndex { THREAD1 THREAD2 NUM_THREADS };
struct tThreadConfig {
char *name,
Task *taskptr,
pthread_t threadId,
...
};
void startTasks();
bar.cpp
#include "Foo.h"
Foo foo1(42);
Foo foo2(1337);
Task task(7331);
tThreadConfig threadConfig[NUM_THREADS] = {
{ "Foo 1", &foo1, 0, ... },
{ "Foo 2", &foo2, 0, ... },
{ "Task", &task, 0, ... }
};
void FSW_taskStart() {
for (int i = 0; i < NUMBER_OF_TASKS; i++) {
threadConfig[i].taskptr->createThread();
}
}
Cosa succede se voglio più o meno attività? Un diverso insieme di argomenti nel costruttore di foo1? Penso che dovrei avere un bar.h e un bar.cpp separati, il che sembra molto più lavoro del necessario.
suppongo che voi dire '& foo1' e non '% foo1' (l'operatore modulo)? – DaveR
Grazie. Questo è quello che ottengo per riscrivere invece di copiare/incollare –