
हैबर पर पहले से ही कई लेख थे जिन्होंने फ्रीआरटीओएस के उपयोग या व्यापक प्रोसेसर आर्किटेक्चर के लिए पोर्टिंग का वर्णन किया था। इस लेख में मैं FreeRTOS पोर्टिंग के अनुभव को रूसी मल्टीस्कलेट आर्किटेक्चर में साझा करना चाहता हूं और यह दिखाता हूं कि मल्टीलेट पी 1 प्रोसेसर कई समानांतर कार्यों के साथ कैसे काम करता है। एक उदाहरण के रूप में, एसडी पर निर्देशांक रिकॉर्ड करने की क्षमता, UART के माध्यम से एक शेल, एक छोटे पाठ संपादक और FAT32 फ़ाइल सिस्टम के साथ काम करने की क्षमता के साथ एक जीपीएस ट्रैकर बनाया जाएगा।
चरण 1. पोर्टिंग।
ATMega323 के लिए FreeRTOS पोर्ट का उपयोग एक उदाहरण के रूप में किया गया था, क्योंकि मैं लंबे समय से इस प्रोसेसर की वास्तुकला से परिचित था। फ़ाइलों का अध्ययन करने के बाद, यह स्पष्ट हो गया कि यह समस्या माथे पर हल नहीं की जा सकती है, क्योंकि यह __attribute__ और FreeRTOS के लिए asm आवेषण के साथ GCC संकलक सेट (एक विशिष्ट वास्तुकला के लिए) का उपयोग करने के लिए अनुशंसित है, और यह सुविधा वर्तमान मल्टीकेलेट LCC संकलक में उपलब्ध नहीं है। यह एक बड़ी समस्या नहीं बनी, ATMEga323 के लिए पोर्ट में इस्तेमाल किया जाने वाला एकमात्र गुण __attribute__ ((नग्न)) था, जो संकलक को फ़ंक्शन का एक प्रस्तावना और उपसंहार नहीं बनाने के लिए कहता है। इस विशेषता को एक फ़ंक्शन को सौंपा गया है जो कार्य के संदर्भ को बदलने और एक नया छोड़ने के लिए ज़िम्मेदार है, इसलिए यह महत्वपूर्ण है कि जब यह कहा जाता है, तो एक प्रस्तावना और एक उपसंहार नहीं बनाया जाता है (अन्यथा स्टैक / मेमोरी जल्दी समाप्त हो जाएगी)। यह फ़ंक्शन और एएसएम आवेषण के साथ सभी फ़ंक्शन को असेंबलर मल्टीलेट में लिखा जाना था।
ओएस को पोर्ट करते समय मुझे जो अगली समस्या आई, वह है स्टैक। तथ्य यह है कि आर्किटेक्चर के कारण मल्टीस्कलेट प्रोसेसर में कोई पुश और पॉप कमांड नहीं हैं। पोर्ट आर्किटेक्चर थोड़ा मुश्किल हो गया था, लेकिन फिलहाल मुझे ज्यादा नहीं दिखता
सुरुचिपूर्ण समाधान। यह विचार यह है: ओएस में प्रत्येक कार्य का अपना मेमोरी क्षेत्र होता है जिसमें इसके रजिस्टर मान और कॉल स्टैक स्थित होते हैं, और एक सामान्य ओएस स्टैक होता है जिसमें फ़ंक्शन कॉल इंटरप्ट प्रोसेसिंग के दौरान स्थित होती हैं। रजिस्टरों के मूल्यों का प्रतिस्थापन # पीएसपी और # बीपी (फ़ंक्शन के आधार और फ्रेम के लिए पॉइंटर्स) प्राथमिक अवरोध हैंडलर (फ़ाइल crt0.s) में किया जाता है।
रुकावट के समय कार्य में बदलाव का एक उदाहरण।
एक ही प्राथमिकता के साथ 2 कार्य हैं। कार्यों को OS कर्नेल द्वारा कतार में बनाने और जोड़ने के बाद, xPortStartScheduler (void) फ़ंक्शन को कॉल किया जाएगा, जो सिस्टम टाइमर को प्रारंभ करेगा और PRS () प्राथमिक संदर्भ परिवर्तन फ़ंक्शन को कॉल करेगा। PRS () फ़ंक्शन में, pxCurrentTCB पॉइंटर (pxCurrentTCB कार्य संदर्भ के लिए OS पॉइंटर है) के माध्यम से, सभी रजिस्टरों का मूल्य सेट किया जाता है, जिसमें #SP और #BP शामिल हैं (वैश्विक #SP के मान और #BP क्रमशः GSP और gBP वेरिएबल्स में संग्रहीत हैं), स्टैक के लिए जिम्मेदार हैं। वर्तमान कार्य और इसके कार्यान्वयन के लिए संक्रमण।
PRS: jmp PRS_fin PXCTCB:= rdl pxCurrentTCB pxTopOfStack:= rdl @PXCTCB setl #DI, @pxTopOfStack complete PRS_fin: reg7 := rdl #DI, pStack reg6 := rdl #DI, pStack + 4 reg5 := rdl #DI, pStack + 8 reg4 := rdl #DI, pStack + 12 reg3 := rdl #DI, pStack + 16 reg2 := rdl #DI, pStack + 20 reg1 := rdl #DI, pStack + 24 reg0:= rdl #DI, pStack + 28 pvp := rdl #DI, pStack + 32 pxCode := rdl #DI, pStack + 36 taskSP := rdl #DI, pStack + 40 taskBP := rdl #DI, pStack + 44 saveSP := getl #SP saveBP := getl #BP setl #R7,@reg7 setl #R6,@reg6 setl #R5,@reg5 setl #R4,@reg4 setl #R3,@reg3 setl #R2,@reg2 setl #R1,@reg1 setl #R0,@reg0 wrl @saveSP, gSP wrl @saveBP, gBP setl #SP, @taskSP setl #BP, @taskBP jmp @pxCode complete
जब सिस्टम टाइमर से एक बाधा उत्पन्न होती है, तो नियंत्रण को प्राथमिक रुकावट हैंडलर में स्थानांतरित किया जाता है।
master.isr: jmp mi.hendler saveSP := getl #SP saveBP := getl #BP loadSP := rdl gSP loadBP := rdl gBP reta := getl #IRETADDR wrl @saveSP, iSP </code> wrl @saveBP, iBP setl #SP, @loadSP setl #BP, @loadBP wrl @reta, master.isr.retaddr complete
स्टैक के पॉइंटर्स को प्राथमिक इंटरप्ट हैंडलर (मास्टर.आईएसआर) में बदल दिया जाता है और इंटरप्ट से रिटर्न एड्रेस संग्रहीत किया जाता है, फिर आरटीओएस संदर्भ परिवर्तन फ़ंक्शन को कहा जाता है।
mi.hendler: getl #SP getl mi.stop getl #INTNUMR getl irq.desc.tbl mull @2, sizeof.I</code> DT.item addl @1, @2 rdl @1 jmp @1 subl @8, sizeof.ptr wrl @8, @1 setl #SP, @2 complete
संदर्भ परिवर्तन के दौरान, वर्तमान कार्य के संदर्भ को बचाने के लिए फ़ंक्शन को कहा जाता है, फिर OC शेड्यूलर pxCurrentTCB पॉइंटर को उस कार्य पर सेट करता है जिसे पुनर्स्थापित करने की आवश्यकता होती है, और संदर्भ पुनर्प्राप्ति फ़ंक्शन को कॉल किया जाता है और नियंत्रण को प्राथमिक अवरोध हैंडलर के उपसंहार में स्थानांतरित किया जाता है।
mi.stop: jmp mi.PF getl #SP addl @1, sizeof.ptr setl #SP, @1 complete mi.PF: rdl master.isr.retaddr jmp @1 getq #PSW or @1, PSW.ONIRQS setq #PSW, @1 saveSP := getl #SP saveBP := getl #BP loadSP := rdl iSP loadBP := rdl iBP wrl @saveSP, gSP wrl @saveBP, gBP setl #SP, @loadSP setl #BP, @loadBP complete
यह है कि FreeRTOS Multiclet P1 के लिए कार्य और ढेर कैसे बदलते हैं।
चरण 2. उपयोग का एक उदाहरण।
ओएस के वास्तविक उपयोग के एक उदाहरण के रूप में, जीपीएस ट्रैकर का एक छोटा लेआउट डेमो बोर्ड पर इकट्ठा किया गया था।

शीर्ष पर बोर्ड पिनबोर्ड II है। इसका उपयोग केवल एसडी कार्ड स्लॉट के रूप में किया जाता था।
सर्वोच्च प्राथमिकता वाला मुख्य कार्य COM पोर्ट के माध्यम से कार्यान्वित टर्मिनल एमुलेटर था।

समानांतर कार्य: एक एसडी कार्ड के लिए लिखना, एक एसडी कार्ड पढ़ना, एक जीपीएस रिसीवर से डेटा प्राप्त करना, एक समन्वयित ट्रैक को फ़ाइल / (से) लिखना और पढ़ना।


प्राप्त डेटा विश्वसनीय नहीं है (क्योंकि जीपीएस रिसीवर टेबल पर पड़ा था) और केवल फ़ाइल सिस्टम के साथ काम प्रदर्शित करता है। डेमो बोर्ड को खिड़की पर रखकर, हमें लगभग सही परिणाम मिलते हैं।

OS ने कॉमरेड Chan'a [
elm-chan.org/fsw/ff/00index_e.html ] के FatFS लाइब्रेरी का उपयोग करके मेमोरी कार्ड के साथ काम किया।
निष्कर्ष
इस लेख में, मैं यह दिखाना चाहता था कि मल्टीकालेट प्रोसेसर अन्य आर्किटेक्चर पर व्यापक रूप से वितरित कार्यक्रमों को निष्पादित करने में सक्षम हैं, और कम बिजली की खपत और हार्डवेयर समानांतरकरण को भी ध्यान में रखते हुए अधिक कुशल हैं।