Arduino में SD कार्ड राइट स्पीड कैसे बढ़ाएं


12

मैं एक डेटा-लॉगर सिस्टम बना रहा हूं जो लगभग 20000-30000 बाइट्स प्रति सेकंड की उच्च गति से एसडी कार्ड में डेटा लॉग करता है। लेकिन वर्तमान में Arduino में SD लाइब्रेरी लगभग 4500-5000 प्रति सेकंड बाइट्स पर डेटा लिखता है जो बहुत धीमा है।

मैंने लिखने की गति को सुधारने के लिए इस हैक को पढ़ा है , लेकिन मैं सोच रहा हूं कि क्या अधिक प्रत्यक्ष दृष्टिकोण संभव है, शायद SPISettings को समायोजित करके ।


1
आप SdFat लाइब्रेरी आज़मा सकते हैं - यह डिफ़ॉल्ट SD लाइब्रेरी की तुलना में बहुत अधिक कुशल है।
Majenko

आप यह भी सुनिश्चित कर सकते हैं कि आपका एसडी कार्ड अच्छी गुणवत्ता वाला हो, हालाँकि किसी भी तरह के एसडी कार्ड के लिए 5000 बाइट बहुत कम लगती हैं।
लेन

जवाबों:


11

ठीक। इसलिए, मैंने एसडीएफएटी की कोशिश की। यह लाइब्रेरी निश्चित रूप से डिफ़ॉल्ट एसडी लाइब्रेरी से बेहतर है जो एड्रिनो के साथ आती है। लेकिन ऐसा नहीं है कि मैंने कम डेटा-रेट की मेरी समस्या को कैसे हल किया।

मैंने इस पोस्ट से SDFat लाइब्रेरी के लेखक के निर्देश का पालन किया ।

Fat16lib के अनुसार , डेटा दर को बढ़ाने के लिए हमें बुद्धिमानी से फ्लश () का उपयोग करने की आवश्यकता है। हम प्रत्येक चक्र में डेटा लिखना () चाहते हैं, लेकिन हमें प्रत्येक चक्र में केवल एक बार प्रत्येक 100 चक्र या इतने पर फ्लश करने की आवश्यकता होती है। इसके अलावा, SD.open () में O_WRITE के रूप में ध्वज रखना सुनिश्चित करें O_CREAT 'के बजाय' FILE_WRITE '।

इस सुनिश्चित ने एक महान कारक द्वारा गति बढ़ा दी। लेकिन मुझे और चाहिए था!

बाइनरी में डेटा संग्रहीत करना ( इस ब्लॉग को देखें ) ने प्रदर्शन में और भी सुधार किया।

मेरी वर्तमान गति एक वर्ग 4 एसडी कार्ड के साथ लगभग 100-120 केबीपीएस (कि किलो बाइट्स) है!

अंत में, मैं आपकी मदद के लिए दोस्तों को धन्यवाद देना चाहता हूं।


4

कई कारक तय करेंगे कि क्या आप इस वांछित गति तक पहुंच सकते हैं। इनमें से कुछ ही।


1. आपका सॉफ्टवेयर

SdFat लाइब्रेरी से अधिक तेजी से Arduino आईडीई के मानक एसडी लाइब्रेरी है। इसमें मानक एसडी लाइब्रेरी के साथ संगतता फ़ंक्शन का उपयोग करना भी आसान है। कोशिश करके देखो।

2. आपका हार्डवेयर

आपको उच्च श्रेणी के एसडी कार्ड का उपयोग करना चाहिए। जैसा कि आप शायद जानते हैं कि एसडी कार्ड प्रदर्शन कक्षाओं में क्रमबद्ध हैं। इंटरनेट में ज्यादातर लोग सैनडिस्क एसडी कार्ड की सलाह देते हैं।


मैं कुछ दिनों में यह कोशिश करूंगा और आपको परिणाम बताऊंगा। धन्यवाद।
आशीष रंजन

4

हाथ मिलाने से बचें एक बफर हो रही है!

SD.write (buf, size) का उपयोग करें ;

हाय हर एक, मैं एक ही मुद्दे के साथ एक परियोजना में काम कर रहा हूँ। मैं उन्हीं चरणों का पालन कर रहा था और ठीक उसी संख्या में मिला। मैंने अभी इसे ठीक किया है। जब आप कॉल करते हैं तो समस्या हैंडशेक है SD.write()

बजाय:

//for each loop, it is going to make a handshake
while(<yourCondition>){
    SD.write(<yourValue>);
}

कर:

char buf[length];
while(yourCondition){
    buf[index] = yourValue;
}
SD.write(buf,index);//only one handshake

मेरी परियोजना में पहले एक को मुझे 4100 बाइट्स मिले, और दूसरे ने 128 (buf [128]) के साथ बफर का उपयोग करते हुए मुझे अपने प्रोजेक्ट में 145408 बाइट्स मिले । काफी है।


1
मुझे नहीं पता है कि आपके हाथ मिलाने का क्या मतलब है, क्योंकि AFAIK SD आंतरिक रूप से (512 kB) बफर का उपयोग करता है। लेकिन मैंने यह भी देखा कि File.write के साथ अलग-अलग बाइट लिखना बेहद धीमा है और कंपाइलर इसे ऑप्टिमाइज़ नहीं कर पाता है (आखिरकार यह सिर्फ एक बाइट को आंतरिक बफ़र पर कॉपी कर रहा है और जाँचता है कि क्या बफ़र पूरा है और SPI ट्रांसमिशन चाहिए शुरू)। मेरे अपने बफर के बाहर और File.write (बफर, आकार) का उपयोग करने से मेरे आवेदन में भी चरम प्रदर्शन में सुधार हुआ।
जैतून
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.