सीएमएसआईएस बनाम एचएएल बनाम स्टैंडर्ड पेरीफेरल लाइब्रेरी


29

इसलिए मैं PICs से ARM पर स्विच कर रहा हूं और मैंने STM32F4 डिस्कवरी बोर्ड खरीदा है। अब तक मैं समझता हूं कि इसे प्रोग्राम करने के लिए आप या तो सभी रजिस्टरों को सीधे मेमोरी (स्पष्ट तरीके) से एक्सेस कर सकते हैं और 3 मुख्य लाइब्रेरी भी हैं जिनका उपयोग आप अपने जीवन को आसान बनाने के लिए कर सकते हैं। अब मेरा प्रश्न यह है कि उन 3 में से कौन सा (CMSIS, HAL, Std Peripherals Lib) सबसे कम स्तर वाला है? अर्थात। कम ओवरहेड के साथ एक। मेरा लक्ष्य नियंत्रक के आंतरिक कामकाज को सीखना है और मेरे जीवन को आसान (केवल थोड़ा) नहीं बनाना है, इसलिए मैं यह जानना चाहूंगा कि इनमें से कौन सा विधानसभा का उपयोग करने के बिना कोर के करीब है।


10
[STM32 पक्ष] CMSIS अनिवार्य रूप से केवल परिभाषाएँ और कोई कोड दर्ज नहीं करता है, इसलिए CMSIS == प्रत्यक्ष रजिस्टर एक्सेस। AFAIK ST के पास केवल CMSIS के लिए एक अलग डाउनलोड नहीं है, लेकिन जब आप StdPeriph Lib या STM32Cube डाउनलोड करते हैं, तो आप केवल CMSIS भाग का उपयोग करना चुन सकते हैं। STM32 रजिस्टर परिभाषाएँ Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hया तो या Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hक्रमशः में पाए जाते हैं।
अलेक्सी तोराहो

जवाबों:


27

निश्चित तौर पर सी.एम.एस.आई.एस. यह वास्तव में एक पुस्तकालय नहीं है, इसमें अधिकतर विभिन्न रजिस्टरों की परिभाषाएँ हैं।

यह वही है जो किसी व्यक्ति को माइक्रोकंट्रोलर के रजिस्टरों को आसानी से एक्सेस करने की आवश्यकता है, ताकि वह अपने स्वयं के एचएएल को लागू कर सके। यह कोई उपरि नहीं है, क्योंकि आप सिर्फ रजिस्टरों का उपयोग करते हैं।

ध्यान रखें कि अन्य दो के विपरीत, सीएमएसआईएस, एआरएम द्वारा परिभाषित किया गया है और एसटी नहीं। इसका मतलब यह है कि विभिन्न माइक्रोकंट्रोलर के लिए विभिन्न सीएमएसआईएस लाइब्रेरी काफी समान हैं, जो पोर्टेबिलिटी में बहुत सहायक हैं।

इसके अलावा, CMSIS सरल है, इसलिए यह (IMO) सबसे अधिक बहुमुखी, और सबसे विश्वसनीय है, संभवतः कम (या नहीं) बग्स के साथ। विभिन्न mcu है कि मैं इस्तेमाल किया है के लिए कुछ आधा पुस्तकालयों उनके कीड़े के लिए काफी बदनाम हैं।

दूसरी ओर, CMSIS को आपसे बहुत अधिक काम करने की आवश्यकता है। हालाँकि यह मेरी व्यक्तिगत पसंद है, क्योंकि मैं अपना समय क्वालिटी लाइब्रेरी बनाने में लगाना पसंद करता हूँ, जो मेरी ज़रूरतों के अनुकूल है, और यह समझना कि चिप कैसे काम करती है, बस एक नई लाइब्रेरी सीखने के लिए समय बिताना है।


मुझे यकीन नहीं है कि एसटी अभी भी सीएमएसआईएस लाइब्रेरी का समर्थन करता है
स्कॉट

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

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

3
@ScottSeidman, मुझे लगता है कि आपने StdPeriph के साथ CMSIS को भ्रमित किया है। CMSIS अच्छी तरह से समर्थित है और अनिश्चित काल तक समर्थित रहेगा। इसका StdPeriph मूल रूप से अब अपदस्थ है, लेकिन CMSIS उतना ही जीवित है जितना 10 साल पहले था।
विज्ञानसमोवर

14

यह जानने के लिए कि यह कैसे काम करता है आप उपरोक्त में से कोई भी उपयोग नहीं करना चाहते हैं। एक हाथ क्रॉस कंपाइलर और सेंट से प्रलेखन प्राप्त करें। कोडिंग शुरू करें। ये चिप्स आमतौर पर प्रोग्राम करने में आसान होते हैं। प्रलेखन आपको बताता है कि रजिस्टर में क्या बिट्स क्या करते हैं।

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

चाहे आप स्वयं जाएं या इन पुस्तकालयों में से किसी एक का उपयोग करें, फिर भी आपको अपने द्वारा उपयोग किए जा रहे पुस्तकालयों के लिए स्रोत को देखना चाहिए कि क्या आप जो कर रहे हैं उसके साथ सहज हैं, अगर यह समझ में आता है, चिप प्रलेखन से मेल खाता है, आदि। गलत हो जाता है कि आप उनके सामान के माध्यम से खुदाई करने की संभावना रखते हैं जितना कि आपका पता लगाने के लिए।

ध्यान दें कि चिप डॉक्स एकदम सही नहीं हैं, यह मज़े का हिस्सा है।

मुझे समझ में नहीं आता कि नंगे धातु प्रोग्रामिंग के बारे में चर्चा में विधानसभा क्यों आती है। आप बहुत कम असेंबली के साथ प्राप्त कर सकते हैं। इन कोर्टेक्स-एम चिप्स के लिए, आपको तकनीकी रूप से केवल बूट करने के लिए इस एशम की आवश्यकता है:

.globl _start
_start:
.word 0x20001000
.word main

आप न तो डेटा पर भरोसा कर सकते हैं और न ही bss कर सकते हैं और आप उस न्यूनतम के साथ मुख्य से वापसी नहीं कर सकते। लेकिन यह सब कुछ है कि आप नंगे धातु के barest के लिए की जरूरत है। अब यदि आप व्यवधान डालना चाहते हैं तो आपको वेक्टर तालिका में अधिक प्रविष्टियों की आवश्यकता होगी। अधिक .word लाइनें। मैं अधिक asm की सलाह देता हूं, लेकिन शायद 10 या 20 लाइनें अधिक।

यह आमतौर पर मैं उपयोग सभी asm है।

.cpu cortex-m0
.thumb
.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.thumb_func
reset:
    bl notmain
    b hang
.thumb_func
hang:   b .
.align
.thumb_func
.globl PUT16
PUT16:
    strh r1,[r0]
    bx lr
.thumb_func
.globl PUT32
PUT32:
    str r1,[r0]
    bx lr
.thumb_func
.globl GET32
GET32:
    ldr r0,[r0]
    bx lr
.thumb_func
.globl GET16
GET16:
    ldrh r0,[r0]
    bx lr
.thumb_func
.globl dummy
dummy:
    bx lr
.end

हाँ, यह कोर्टेक्स- m0 कहता है, लेकिन यह मेरे m4 कोड के लिए वास्तविक बूटस्ट्रैप है। मैं यह पसंद करता हूं कि अंगूठा नहीं अंगूठे 2। और मैं सिर्फ एक कॉर्टेक्स-एम से दूसरे में इस कोड का पुन: उपयोग करता हूं, स्टैक पॉइंटर एड्रेस को आवश्यकतानुसार बदलते हुए, इसलिए यह m0, m3 और m4 के लिए काम करता है। मेरे पास अभी तक कोई m7 नहीं है और न ही मैंने इस पर ज्यादा शोध किया है।

विशिष्ट निर्देश आवश्यक होने पर fpu को सक्षम करने के लिए asm की कुछ और लाइनों की आवश्यकता हो सकती है। लेकिन बिंदु न तो निम्न स्तर की प्रोग्रामिंग और एएसएम को भ्रमित करता है। सी के पास आपको चिप को कॉन्फ़िगर करने की आवश्यकता है, साथ ही एक आवेदन लिखना होगा। आप जिन पुस्तकालयों के बारे में बात कर रहे हैं, वे C नहीं asm में लिखे गए हैं, इसलिए स्पष्ट रूप से उन्हें asm का उपयोग करने की आवश्यकता नहीं है।

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

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


2
ओपी ने स्टार्ट-अप प्रक्रिया, या ऐसा कुछ भी नहीं पूछा। बस जो पुस्तकालय उसके उपयोग के लिए सबसे उपयुक्त है।
फॉटिस पानियागियोतोपोलोस

asm उल्लेख किया गया था और इस प्रकार asm पर टिप्पणियाँ
old_timer

2
इसके अलावा CMSIS में कुछ नंगे न्यूनतम के अलावा कोड शामिल नहीं है। इसमें स्टार्ट-अप कोड, लिंकर स्क्रिप्ट या ऐसा कुछ भी शामिल नहीं है। इसमें केवल रजिस्टरों की परिभाषाएँ हैं। सीधे रजिस्टरों तक पहुंचने के लिए अच्छे नाम का उपयोग करने के बजाय, क्रिप्टिक कोड क्यों लिखें, या पहिया को सुदृढ़ करें?
फॉटिस पानियागिओतोउलोस

2
@ जॉन आप आसानी से एआरएम माइक्रोकंट्रोलर को निरपेक्ष रूप से एएसएम के साथ शुरू कर सकते हैं, समान रूप से कुशलता से। यदि रुचि एक नया सवाल पूछती है, और आपको कुछ उदाहरण दिखाने के लिए यहां एक लिंक पर टिप्पणी करें।
फॉटिस पानियागिओतोउलोस

1
@ user3634713 मुझे वास्तव में बहुत दिलचस्पी है। धन्यवाद Electronics.stackexchange.com/questions/224618/…
जॉन

2

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


2

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


2

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

Libopencm3 परियोजना (जिसे पहले libopenstm32 के रूप में जाना जाता है) का उद्देश्य विभिन्न ARM Cortex-M3 माइक्रोकंट्रोलर्स के लिए एक मुफ्त / libre / ओपन-सोर्स फर्मवेयर लाइब्रेरी बनाना है, जिसमें ST ST32, Toshiba TX03, Atmel SAM3U, NXP LPC1000 और अन्य शामिल हैं।

कृपया ध्यान दें कि:

नाम के बावजूद, libopencm3 उदाहरण के लिए, अन्य ARM Cortex "संबंधित" माइक्रोकंट्रोलर्स जैसे Cortex-M0 या Cortex-M4 / Cortex-M4F वाले का भी समर्थन करता है।

आप यहां समर्थित माइक्रो-कंट्रोलर की सूची पा सकते हैं ।


वास्तविक समस्या यह है कि एसटी को गलत विचार है कि एचएएल को क्या करना चाहिए। एक उचित एचएएल में एक फ़ंक्शन होगा जैसे adc_get_result()कि वास्तविक समय के पहलुओं, इंटरप्ट आदि सहित पूर्ण एडीसी परिधीय चालक में लपेटता है। एसटी एक ऐसा लगता है write_to_scary_registerजो मूल रूप से रजिस्टर एक्सेस के चारों ओर केवल एक फूला हुआ आवरण है। सभी निष्पक्षता में, एसटी इस तरह के अतिरिक्त ब्लोट प्रदान करने वाला एकमात्र विक्रेता नहीं है, Atmel ASF और अन्य समान रूप से खराब हैं।
लंडिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.