2009-06-06 4 views
23

के लिए यूनिट परीक्षण पैटर्न हालांकि सी का समर्थन करने वाले यूनिट टेस्ट फ्रेमवर्क के बहुत सारे हैं, हालांकि मैं माइक्रो कंट्रोलर कोड (मेरे मामले में पीआईसी) के लिए यूनिट परीक्षण लिखने के बारे में थोड़ा सा स्टंप हूं, लेकिन मुझे लगता है कि सवाल है उससे अधिक सामान्य)।माइक्रोकंट्रोलर सी कोड

माइक्रो नियंत्रकों के लिए लिखे गए अधिकांश कोड रजिस्टरों को कॉन्फ़िगरेशन और डेटा मान लिखने, रजिस्टरों से आने वाले डेटा पढ़ने और ईवेंट को बाधित करने के जवाब में घूमते हैं। मैं सोच रहा हूं कि कोई भी इस पर सबसे अधिक प्रभावी तरीके से कुछ पॉइंटर्स प्रदान कर सकता है।

+0

पर्याप्त प्रतिनिधि के साथ किसी को इस सवाल का "एम्बेडेड" टैग को जोड़ने कर सकते हैं? धन्यवाद। –

उत्तर

29

आप लिखते हैं;

"माइक्रो नियंत्रकों के लिए लिखे गए अधिकांश कोड रजिस्टरों को कॉन्फ़िगरेशन और डेटा मान लिखने, रजिस्टरों से आने वाले डेटा पढ़ने और ईवेंट को बाधित करने के जवाब में घूमते हैं।"

मैं मानता हूं कि यह अक्सर अभ्यास में मामला है, लेकिन मुझे नहीं लगता कि यह वास्तव में एक अच्छी बात है, और मुझे लगता है कि चीजों पर पुनर्विचार करने से आपके परीक्षण लक्ष्यों में मदद मिलेगी।

शायद क्योंकि माइक्रोकंट्रोलर प्रोग्रामर तक पहुंचने और हार्डवेयर वे भी चाहें, स्पर्श कर सकते हैं, कई (सबसे?) उनमें से, सिर्फ इतना है कि कर अपने कोड भर की आदत में मिला है। अक्सर इस आदत को निर्विवाद रूप से पालन किया जाता है, शायद इसलिए कि इस तरह के काम करने वाले बहुत से लोग ईईएस प्रशिक्षण और झुकाव से कंप्यूटर वैज्ञानिक नहीं हैं। मुझे पता है, मैंने खुद को इस तरह से शुरू किया।

जिस बिंदु को मैं बनाने की कोशिश कर रहा हूं, वह यह है कि माइक्रोकंट्रोलर परियोजनाएं किसी भी अन्य सॉफ्टवेयर प्रोजेक्ट की तरह अच्छी तरह डिज़ाइन की जा सकती हैं। अच्छी डिजाइन का एक महत्वपूर्ण हिस्सा हार्डवेयर ड्राइवरों तक हार्डवेयर पहुंच को प्रतिबंधित करना है! रजिस्ट्रार लिखने वाले सभी कोड से विभाजन, मॉड्यूल में इंटरप्ट इत्यादि का जवाब देता है जो आपके बाकी सॉफ़्टवेयर को हार्डवेयर के लिए अच्छी, साफ, सारणी पहुंच प्रदान करता है। तर्क विश्लेषकों, ऑसिलोस्कोप, कस्टम टेस्ट रिग या जो भी कुछ भी समझ में आता है, लक्ष्य पर उन ड्राइवर मॉड्यूल का परीक्षण करें।

एक वास्तव में महत्वपूर्ण बात यह है कि अब आपके बाकी सॉफ़्टवेयर, उम्मीद है कि इसमें से अधिकांश बहुमत, अब केवल सी कोड है जिसे आप होस्ट सिस्टम पर चला सकते हैं और परीक्षण कर सकते हैं। मेजबान सिस्टम पर हार्डवेयर मॉड्यूल को इस तरह से बाहर रखा जाता है जो परीक्षण के तहत कोड क्या कर रहा है में दृश्यता प्रदान करता है। आप इस कोड पर मुख्यधारा इकाई परीक्षण दृष्टिकोण का उपयोग कर सकते हैं। इसके लिए कुछ तैयारी और काम की ज़रूरत है, लेकिन यदि आप अच्छी तरह व्यवस्थित हैं तो आप एक पुन: प्रयोज्य प्रणाली बना सकते हैं जो आपकी सभी परियोजनाओं पर लागू हो सकती है। संभावित लाभ भारी हैं। मैंने यहां इन विचारों के बारे में कुछ और लिखा है;

[http://discuss.joelonsoftware.com/default.asp?joel.3.530964.12][1]

+4

अच्छा बिंदु। क्या मैं जोड़ सकता हूं: uint16_t, uint8_t और आगे (केवल int, char के बजाय) का उपयोग करने के लिए उपयोग करें ताकि एम्बेडेड प्लेटफ़ॉर्म से पीसी तक कूदने पर और विभिन्न एम्बेडेड प्लेटफ़ॉर्म के बीच आपके प्रकार अधिक अनुमानित हों। –

+3

इस उत्तर में समस्याएं: हार्डवेयर ड्राइवर अबास्ट्रक्शन महत्वपूर्ण ओवरहेड बनाता है, अक्सर अस्वीकार्य, जब तक कि असेंबलर में लिखा न हो। लेकिन सी और असेंबलर मिश्रण एक बड़ा सिरदर्द है - न केवल पीआईसी आर्किटेक्चर के साथ काम करने के लिए एक पीआईटीए है, कंपेलर रजिस्ट्रार के विभिन्न बैंकों को जॉगलिंग करने वाले हुप्स के माध्यम से कूदता है जो एक गंभीर रूप से विशाल पिटा है जो इसके साथ असेंबलर लिखने के लिए है। – Jodes

0

क्या शायद कोई भी प्रकार का लूपबैक मोड है ताकि आप नियंत्रक का उपयोग उन घटनाओं को उत्पन्न करने के लिए कर सकें जिनके खिलाफ आप परीक्षण कर सकते हैं?

3

इस पर एक दृष्टिकोण एक एमुलेटर का उपयोग करना हो सकता है। मैं एक एवीआर एमुलेटर पर काम कर रहा हूं और इसका उपयोग करने के लिए विचारों में से एक वास्तव में इकाई परीक्षण कोड है। एम्यूलेटर सीपीयू और रजिस्टर्स, इंटरप्ट्स और विभिन्न परिधीय उपकरणों को लागू करता है, और (मेरे मामले में) नकली यूएआरटी को लिखे गए बाइट्स एम्यूलेटर के नियमित stdout पर जाते हैं। इस तरह, यूनिट टेस्ट कोड एमुलेटर में चलाया जा सकता है और इसके परीक्षण परिणामों को कंसोल पर लिख सकता है।

बेशक, किसी को यह भी सुनिश्चित करना चाहिए कि एमुलेटर वास्तविक CPU के व्यवहार को सही ढंग से कार्यान्वित कर रहा है, अन्यथा इसके ऊपर इकाई परीक्षणों पर भरोसा नहीं किया जा सकता है।

2

अपने रजिस्टर एक्सेस फ़ंक्शंस/मैक्रोज़ के नकली संस्करण लिखें। ध्यान दें कि यह मानता है कि आपका कोड रजिस्टर एक्सेस फ़ंक्शंस के एक सामान्य सेट का उपयोग करता है, और विज्ञापन-प्रसार सामग्री जैसे *(volatile int*)0xDEADBEEF = 0xBADF00D हर जगह।

अपने परीक्षण कोड से सीधे अपने बाधा संचालकों कॉल, एक (कुछ आर्किटेक्चर ¹ पर समस्याग्रस्त किया जा सकता है) "सॉफ्टवेयर बाधा" यदि उपलब्ध हो, या एक टाइमर व्यवधान हैंडलर से अगर आप उन्हें जरूरत एसिंक्रोनस रूप से निष्पादित करने के लिए। इसके लिए आपके इंटरप्ट को फ़ंक्शन/मैक्रोज़ में कोड को सक्षम/अक्षम करने की आवश्यकता हो सकती है जिसे आप नकल कर सकते हैं।

¹ 8051 दिमाग में आता है: कम से कम किल 8051 कंपाइलर के साथ, आप सीधे इंटरप्ट फ़ंक्शंस को कॉल नहीं कर सकते हैं। हालांकि सी प्रीप्रोसेसर के साथ यह काम किया जा सकता है।