실행중인 코드의 결정론과 투명성을 높이려는 임베디드 프로그래밍 유형이 있습니다. 제가 투명성을 의미한다는 것은 예를 들어 메모리의 임의 섹션을보고 거기에 어떤 변수가 저장되어 있는지를 알 수 있다는 것입니다. 따라서 임베디드 프로그래머가 기대하는대로 new는 가능한 한 피해야합니다. 피할 수없는 경우 초기화로 제한됩니다.임베디드 프로그래밍에서 전역 변수 사용하지 않기
이 문제에 대한 필요성을 이해하고 있지만 동료가이 작업을 수행하는 방식에 동의하지 않으며 더 나은 대안을 알지 못합니다.
우리는 구조의 전역 배열과 일부 글로벌 클래스를 가지고 있습니다. mutex를위한 하나의 구조체 배열, 하나는 세마포어를위한 배열, 다른 하나는 메시지 대기열을위한 구조체 (main에서 초기화 됨)입니다. 실행되는 각 스레드에 대해 스레드를 소유하는 클래스는 전역 변수입니다.
내가 가진 가장 큰 문제는 단위 테스트입니다. 테스트 할 클래스가 모의 객체를 삽입하려면 어떻게해야합니까? #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
감사합니다. 그게 내가 복사/붙여 넣기 대신 재 작성을 위해 얻는 것입니다. –