एम्बेडेड प्रोग्रामिंग के प्रकार में, मैं चल रहा कोड की निर्धारणा और पारदर्शिता अत्यधिक मूल्यवान हूं। पारदर्शिता द्वारा मेरा मतलब है, उदाहरण के लिए, स्मृति के मनमानी वर्गों को देखने में सक्षम होना और पता है कि वहां कौन सा चर संग्रहीत किया जाता है। इसलिए, जैसा कि मुझे यकीन है कि एम्बेडेड प्रोग्रामर उम्मीद करते हैं, यदि संभव हो तो नए से बचा जाना चाहिए, और अगर इसे टाला नहीं जा सकता है, तो प्रारंभिक तक सीमित है।एम्बेडेड प्रोग्रामिंग में वैश्विक चर से बचना
मैं इसकी आवश्यकता को समझता हूं, लेकिन मेरे सहकर्मियों ने ऐसा करने के तरीके से सहमत नहीं है, और न ही मुझे एक बेहतर विकल्प पता है।
हमारे पास संरचनाओं के कई वैश्विक सरणी हैं, और कुछ वैश्विक वर्ग हैं। म्यूटेक्स के लिए structs की एक सरणी है, एक सेफफोर्स के लिए, और संदेश कतारों के लिए एक (इन्हें मुख्य में प्रारंभ किया जाता है)। प्रत्येक थ्रेड जो चलता है, उसके लिए जिस वर्ग का मालिक है वह वैश्विक चर है।
मेरे साथ सबसे बड़ी समस्या इकाई परीक्षण में है। जब मैं कक्षा #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 के निर्माता में तर्कों का एक अलग सेट? मुझे लगता है कि मुझे एक अलग बार.h और bar.cpp होना होगा, जो आवश्यकतानुसार बहुत अधिक काम की तरह लगता है।
मुझे लगता है तुम्हारा मतलब 'और foo1' और नहीं '% foo1' (मापांक ऑपरेटर)? – DaveR
धन्यवाद। कॉपी/पेस्ट –