इकाई 3 / 9

एंबेडेड सिस्टम और माइक्रोकंट्रोलर कोड

लाभ:

  • स्पष्ट संकेत के साथ माइक्रोकंट्रोलर के लिए रजिस्टर, इंटरप्ट और टाइमिंग आवश्यकताओं को परिभाषित करने की क्षमता
  • रजिस्टर सेटिंग्स, बफर ओवरफ्लो और वास्तविक समय की कमी के संदर्भ में एआई द्वारा उत्पादित सी/अरुडिनो कोड की जांच करने की क्षमता
  • उत्पन्न कोड को हार्डवेयर (ऑसिलोस्कोप, सीरियल पोर्ट) पर मापकर सत्यापित करने की आदत लागू करने की क्षमता

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

आवश्यकता को स्पष्ट रूप से परिभाषित करना: रजिस्टर, कटिंग, समय

एआई को "एलईडी जलाने" के लिए कहने से काम नहीं चलेगा; कौन सा कार्ड, कौन सा पिन, कौन सी घड़ी की आवृत्ति, कौन सा समय? AI को एक एम्बेडेड कार्य सौंपते समय, इस ढांचे का उपयोग करें: हार्डवेयर (MCU परिवार, घड़ी, पिन), फ़ंक्शन (क्या होगा), बाधा (समय, शक्ति, मेमोरी), और इंटरफ़ेस (रजिस्टर, HAL, Arduino लाइब्रेरी)।

कमजोर संकेत/मजबूत संकेत

कमज़ोर: "STM32 के साथ PWM का उत्पादन करें।" (परिणाम: कौन सा टाइमर, कौन सी आवृत्ति, कौन सा पिन स्पष्ट नहीं है; सामान्य, संभवतः गलत रजिस्टर नाम कोड।) मजबूत: "STM32F103 (72 मेगाहर्ट्ज सिस्टम क्लॉक) के लिए TIM3 CH1 (PA6) पर 20 kHz, 0-100% समायोज्य ड्यूटी PWM का उत्पादन करें। रजिस्टर स्तर पर लिखें (HAL नहीं)। - 20 kHz के लिए प्रीस्केलर और ARR मान गणना करें और टिप्पणी पंक्ति में गणना दिखाएं। - सेट करें 0-100 के बीच फ़ंक्शन पैरामीटर के साथ कर्तव्य - आपके द्वारा उपयोग किए जाने वाले प्रत्येक रजिस्टर बिट पर टिप्पणी करें कि यदि आपकी घड़ी की धारणा गलत है तो मान बदल जाएंगे।

अंतर यह है कि शक्तिशाली संकेत मॉडल को गणना दिखाता है और घड़ी की धारणा को प्रकट करता है। तो आप प्रीस्केलर/एआरआर मानों को स्वतंत्र रूप से जांच सकते हैं:

20 किलोहर्ट्ज पीडब्लूएम (72 मेगाहर्ट्ज घड़ी) के लिए: टाइमर_क्लॉक = 72 मेगाहर्ट्ज यदि हम प्रीस्केलर चाहते हैं = 72-1 → काउंटर क्लॉक = 1 मेगाहर्ट्ज एआरआर = (1 मेगाहर्ट्ज / 20 किलोहर्ट्ज) - 1 = 50 - 1 = 49 सत्यापन: 1e6 / (49+1) = 20 000 हर्ट्ज ✓

ऑडिटिंग एआई कोड: क्या देखना है?

सिर्फ इसलिए कि जेनरेट किया गया कोड संकलित है इसका मतलब यह नहीं है कि यह सही ढंग से काम करता है। इस चेकलिस्ट का पालन करें:

नियंत्रण क्षेत्र

क्या देखना है

रजिस्टर/बिट सेटिंग्स

डेटाशीट के साथ बिल्कुल संगत, सही बिट मास्क

व्यवधान (आईएसआर)

क्या यह छोटा है? कोई अवरोधक विलंब नहीं? क्या अस्थिर का प्रयोग किया जाता है?

बफ़र/सरणी

क्या सीमा पर नियंत्रण है? अतिप्रवाह का खतरा?

समय

देरी या टाइमर के साथ? क्या वास्तविक समय की बाधा पूरी हो गई है?

प्रकार और चौड़ाई

8/16/32-बिट अतिप्रवाह, हस्ताक्षरित/अहस्ताक्षरित भ्रम

शक्ति/प्रहरी

अनंत लूप फीडिंग वॉचडॉग?

इंटरप्ट सर्विस रूटीन (आईएसआर) त्रुटियों का सबसे आम स्रोत हैं। एआई कभी-कभी आईएसआर के अंदर देरी() या लंबा लूप डालता है। इससे अन्य व्यवधान छूट जाते हैं और वॉचडॉग रीसेट हो जाता है। नियम: ISR यथासंभव छोटा होना चाहिए; मुख्य कार्य एक ध्वज स्थापित करना और उसे मुख्य लूप में ले जाना होना चाहिए।

// कमजोर (AI कभी-कभी इसे उत्पन्न करता है): ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // इसमें काफी समय लग सकता है - BAD CASE_Delay(10); // आईएसआर में देरी - बहुत खराब }}// मजबूत: आईएसआर छोटा; कार्य मुख्य लूपवोलेटाइल uint8_t टिक_फ्लैग = 0 पर चला जाता है; // अस्थिर स्थितिशून्य TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; टिक_फ्लैग = 1; //बस ध्वज सेट करें }}// मुख्य लूप में: यदि (टिक_फ्लैग) { टिक_फ्लैग = 0; read_sensor(); }

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

बफ़र अतिप्रवाह और प्रकार त्रुटियाँ

एआई बिना सीमा जांच के सीरियल पोर्ट से डेटा को एक निश्चित आकार के सरणी में कॉपी कर सकता है। एक एम्बेडेड सिस्टम में, इसका मतलब सन्निहित मेमोरी और अस्पष्टीकृत क्रैश को कुचलना है। सुनिश्चित करें कि प्रत्येक स्ट्रैपी, ऐरे इंडेक्स और डीएमए बफर पर सीमा की जाँच की गई है। इसी तरह, 8-बिट काउंटर 255 के बाद रीसेट हो जाता है; एआई इसे नजरअंदाज कर सकता है और अतिप्रवाहित खाते पर भरोसा कर सकता है।

हार्डवेयर में सत्यापन: "कार्य" को मापा जाता है, माना नहीं जाता

एक एम्बेडेड सिस्टम में, सबसे विश्वसनीय सबूत मीटर है, कंपाइलर नहीं। जनरेट किए गए कोड को इन तीन तरीकों से सत्यापित करें:

  1. ऑसिलोस्कोप/तर्क विश्लेषक: पीडब्लूएम आवृत्ति, सिग्नल समय और संचार तरंग को मापें। यदि आप 20 किलोहर्ट्ज़ चाहते हैं, तो स्क्रीन पर 20 किलोहर्ट्ज़ देखें।
  2. सीरियल पोर्ट (यूएआरटी) लॉग: परिवर्तनीय मान, राज्य परिवर्तन और त्रुटि काउंटर प्रिंट करें और अपेक्षित व्यवहार के साथ तुलना करें।
  3. बाउंड और स्ट्रेस परीक्षण: परीक्षण करें कि क्या सिस्टम उच्चतम लोड, सबसे तेज़ डेटा और सबसे खराब समय के तहत काम करता है।

यदि मापा गया मान गणना से सहमत नहीं है, तो घड़ी की धारणा, प्रीस्केलर मान या रजिस्टर सेटिंग गलत है; पीछा करना।

मिनी केस

छात्रों की एक टीम के पास एआई ने एचसी-एसआर04 अल्ट्रासोनिक सेंसर के साथ दूरी माप कोड प्रिंट किया है। कोड संकलित होता है लेकिन दूरी हमेशा हास्यास्पद मान देती है। जब वे इसे ऑसिलोस्कोप से जोड़ते हैं, तो वे देखते हैं कि इको लेग अपने समय की गणना माइक्रोसेकंड के बजाय मिलीसेकंड में करता है; एआई ने माइक्रोज़() के बजाय मिलिस() का उपयोग किया। इस एक-शब्द की त्रुटि ने पूरे माप को 1000 के कारक से भ्रमित कर दिया। जब वे कच्चे इको समय को सीरियल लॉग में प्रिंट करते हैं और इसकी तुलना वास्तविक शासक से करते हैं, तो वे त्रुटि ढूंढते हैं और इसे ठीक करते हैं। पाठ: संकलित कोड सही कोड नहीं है; हार्डवेयर में मापन से त्रुटि का तुरंत पता चल जाता है।

सामान्य गलतियाँ

  • डेटाशीट के साथ तुलना किए बिना रजिस्टर नाम और बिट मास्क स्वीकार करना।
  • आईएसआर के भीतर अवरोधन विलंब या लंबी प्रसंस्करण की अनुमति देना।
  • साझा चर पर अस्थिरता को भूल जाना।
  • बाईपास बफ़र और सरणी सीमा की जाँच; अतिप्रवाह नहीं देख रहा हूँ.
  • घड़ी की आवृत्ति और समय संबंधी मान्यताओं को सत्यापित किए बिना उन पर भरोसा करना।
  • कोड को आस्टसीलस्कप/सीरियल लॉग से मापे बिना "कार्यशील" मानते हुए।

संक्षेप में

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

आवेदन कार्य

आपके पास एक माइक्रोकंट्रोलर (Arduino, STM32, ESP32) के साथ, AI से PWM या एक निश्चित आवृत्ति पर आवधिक कार्य के लिए पूछें। कोड लोड करने से पहले: (1) टिप्पणी पंक्ति में खाते से स्वतंत्र रूप से आवृत्ति/समय मानों को सत्यापित करें, (2) आईएसआर और साझा चर में अस्थिर और अवरुद्ध की जांच करें। अपलोड करने के बाद, वास्तविक आवृत्ति को ऑसिलोस्कोप या लॉजिक एनालाइज़र से मापें और लक्ष्य से तुलना करें। यदि कोई विचलन है, तो स्रोत ढूंढें और उसे ठीक करें, और नोट करें कि क्या गलत माना गया था।