วิธีเพิ่มความเร็วในการเขียนการ์ด SD ใน arduino


12

ฉันสร้างระบบตัวบันทึกข้อมูลซึ่งบันทึกข้อมูลในการ์ด SD ด้วยความเร็วสูงประมาณ 20,000-300,000 ไบต์ต่อวินาที แต่ปัจจุบันห้องสมุด SD ใน arduino เขียนข้อมูลอยู่ที่ประมาณ 4500-5,000 ไบต์ต่อวินาทีซึ่งช้าเกินไป

ฉันได้อ่านหนังสือเล่มนี้สับเพื่อปรับปรุงความเร็วในการเขียนแต่ฉันสงสัยว่าถ้ามีวิธีการโดยตรงมากขึ้นเป็นไปได้ที่อาจจะโดยการปรับSPISettings


1
คุณอาจลองใช้ไลบรารีSdFatซึ่งมีประสิทธิภาพมากกว่าไลบรารี SD เริ่มต้น
Majenko

คุณอาจต้องการตรวจสอบให้แน่ใจว่าการ์ด SD ของคุณมีคุณภาพดีถึงแม้ว่าไบต์ 5000 จะต่ำเกินไปสำหรับการ์ด SD ทุกประเภท
เลน

คำตอบ:


11

ตกลง. ดังนั้นฉันลองใช้ SDFat lib ไลบรารีนี้ดีกว่าไลบรารี SD เริ่มต้นที่มาพร้อมกับ adruino แต่นั่นไม่ใช่วิธีที่ฉันแก้ปัญหาอัตราข้อมูลต่ำ

ฉันทำตามคำแนะนำของผู้เขียนของห้องสมุด SDFat จากโพสต์นี้

ตามfat16libเพื่อเพิ่มอัตราข้อมูลเราจำเป็นต้องใช้ flush () อย่างชาญฉลาด เราต้องการเขียน () ข้อมูลในแต่ละรอบ แต่เราต้องล้างข้อมูล () หนึ่งครั้งในรอบ 100 รอบหรือมากกว่านั้นขึ้นอยู่กับจำนวนข้อมูลที่ถูกเขียนในแต่ละรอบ นอกจากนี้อย่าลืมตั้งค่าสถานะใน SD.open () เป็น 'O_WRITE | O_CREAT 'แทน' FILE_WRITE '

แน่นอนว่ามันเพิ่มความเร็วด้วยปัจจัยที่ยอดเยี่ยม แต่ฉันต้องการมากกว่านี้!

การจัดเก็บข้อมูลในรูปแบบไบนารี ( ตรวจสอบบล็อกนี้ ) ปรับปรุงประสิทธิภาพให้ดียิ่งขึ้น

ความเร็วปัจจุบันของฉันอยู่ที่ประมาณ 100-120 KBps (นั่นคือกิโลไบต์) พร้อมการ์ด SD คลาส 4!

ในที่สุดฉันต้องการขอบคุณพวกคุณสำหรับความช่วยเหลือของคุณ


4

มีหลายปัจจัยที่จะตัดสินว่าคุณสามารถเข้าถึงความเร็วที่ต้องการ มีเพียงบางส่วนเท่านั้น


1. ซอฟต์แวร์ของคุณ

SdFatห้องสมุดจะเร็วกว่าห้องสมุดมาตรฐาน SD ของ Arduino IDE นอกจากนี้ยังมีฟังก์ชั่นการใช้งานร่วมกันได้ง่ายกับ SD Library มาตรฐาน ลองดู

2. ฮาร์ดแวร์ของคุณ

คุณควรใช้การ์ด SD ระดับสูง อย่างที่คุณอาจจะรู้ว่าการ์ด SD ถูกจัดเรียงเป็นคลาสประสิทธิภาพ คนส่วนใหญ่ในอินเทอร์เน็ตแนะนำการ์ด SD ของ SanDisk


ฉันจะลองในไม่กี่วันและแจ้งให้คุณทราบผลลัพธ์ ขอบคุณ
Ashish Ranjan

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 (บัฟเฟอร์ขนาด) ทำให้การปรับปรุงประสิทธิภาพสูงขึ้นอย่างมากในแอปพลิเคชันของฉัน
โอลิเวอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.