В качестве встроенного программирования я вхожу, детерминизм и прозрачность работающего кода высоко ценятся. То, что я подразумеваю под прозрачностью, - это, например, возможность просматривать произвольные разделы памяти и знать, какая переменная хранится там. Таким образом, как я уверен, встроенные программисты ожидают, нового следует избегать, если это вообще возможно, и если его не избежать, то он ограничен инициализацией.Избегание глобальных переменных во встроенном программировании
Я понимаю необходимость в этом, но не согласен с тем, как мои коллеги уже занимались этим, и я не знаю лучшей альтернативы.
У нас есть несколько глобальных массивов структур и некоторые глобальные классы. Существует один массив структур для мьютексов, один для семафоров и один для очередей сообщений (они инициализируются главным образом). Для каждого потока, который выполняется, классу, который его владельцем, является глобальная переменная.
Самая большая проблема, с которой я столкнулся, заключается в модульном тестировании. Как я могу вставить макет-объект, когда класс, я хочу проверить глобальные переменные #include
, которых у меня нет?
Вот ситуация в псевдокоде:
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();
}
}
Что делать, если я хочу больше или меньше задач? Разный набор аргументов в конструкторе foo1? Я думаю, что мне придется иметь отдельный bar.h и bar.cpp, который кажется намного больше работы, чем необходимо.
Я предполагаю, что вы имеете в виду '& foo1', а не '% foo1' (оператор модуля)? – DaveR
Спасибо. Это то, что я получаю для переписывания вместо копирования/вставки. –