在我进入的嵌入式编程类型中,运行代码的确定性和透明度受到高度重视。例如,我所说的透明度是指能够查看内存的任意部分并知道那里存储了哪些变量。因此,正如我确信嵌入式程序员所期望的那样,如果可能的话,应该避免使用 new,如果无法避免,那么就仅限于初始化。
我理解这样做的必要性,但不同意我的同事这样做的方式,我也不知道更好的选择。
我们拥有的是几个全局结构数组和一些全局类。有一组结构用于互斥体,一组用于信号量,一组用于消息队列(这些在 main 中初始化)。对于每个运行的线程,拥有它的类是一个全局变量。
我遇到的最大问题是单元测试。#include
当我想测试我不想测试的全局变量的类时,如何插入模拟对象?
这是伪代码中的情况:
foo.h
#include "Task.h"
class Foo : Task {
public:
Foo(int n);
~Foo();
doStuff();
private:
// copy and assignment operators here
}
酒吧.h
#include <pthread.h>
#include "Task.h"
enum threadIndex { THREAD1 THREAD2 NUM_THREADS };
struct tThreadConfig {
char *name,
Task *taskptr,
pthread_t threadId,
...
};
void startTasks();
酒吧.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,这似乎比必要的工作要多得多。