Cách tăng tốc độ ghi thẻ SD trong arduino


12

Tôi đang tạo một hệ thống ghi dữ liệu để ghi dữ liệu vào thẻ SD ở tốc độ cao khoảng 20000-30000 byte mỗi giây. Nhưng thư viện SD trong arduino hiện ghi dữ liệu ở khoảng 4500-5000 byte mỗi giây, quá chậm.

Tôi đã đọc bản hack này để cải thiện tốc độ ghi , nhưng tôi tự hỏi liệu có thể tiếp cận trực tiếp hơn được không, có thể bằng cách điều chỉnh SPIS Settings .


1
Bạn có thể thử thư viện SdFat - nó hiệu quả hơn thư viện SD mặc định.
Majenko

Bạn cũng có thể muốn đảm bảo rằng thẻ SD của bạn có chất lượng tốt, mặc dù 5000 byte dường như quá thấp đối với bất kỳ loại thẻ SD nào.
Len

Câu trả lời:


11

ĐỒNG Ý. Vì vậy, tôi đã thử lib SDFat. Thư viện này chắc chắn tốt hơn thư viện SD mặc định đi kèm với adruino. Nhưng đó không phải là cách tôi giải quyết vấn đề tốc độ dữ liệu thấp.

Tôi đã làm theo hướng dẫn của tác giả của thư viện SDFat từ bài đăng này .

Theo fat16lib , để tăng tốc độ dữ liệu, chúng ta cần sử dụng flush () một cách khôn ngoan. Chúng tôi muốn viết () dữ liệu trong mỗi chu kỳ, nhưng chúng tôi chỉ cần xóa () cứ sau 100 chu kỳ hoặc tùy thuộc vào lượng dữ liệu được ghi trong mỗi chu kỳ. Ngoài ra, hãy đảm bảo giữ cờ trong SD.open () là 'O_WRITE | O_CREAT 'thay vì' FILE_WRITE '.

Điều này chắc chắn tăng tốc độ bởi một yếu tố tuyệt vời. Nhưng tôi cần nhiều hơn thế!

Lưu trữ dữ liệu trong hệ nhị phân ( xem blog này ) đã cải thiện hiệu suất hơn nữa.

Tốc độ hiện tại của tôi là khoảng 100-120 KBps (tức là kilo byte) với thẻ SD loại 4!

Cuối cùng, tôi muốn cảm ơn các bạn đã giúp đỡ.


4

Nhiều yếu tố sẽ quyết định nếu bạn có thể đạt được tốc độ mong muốn này. Chỉ một số trong số này.


1. Phần mềm của bạn

Các SdFat Thư viện là nhanh hơn so với tiêu chuẩn Thư viện SD của Arduino IDE. Nó cũng có chức năng tương thích dễ sử dụng với Thư viện SD tiêu chuẩn. Hãy thử nó.

2. Phần cứng của bạn

Bạn nên sử dụng Thẻ SD cao cấp. Như bạn có thể biết Thẻ SD được sắp xếp vào các lớp hiệu suất. Hầu hết mọi người trên internet đều khuyên dùng Thẻ SD SanDisk.


Tôi sẽ thử điều này trong một vài ngày và cho bạn biết kết quả. Cảm ơn.
Ashish Ranjan

4

Tránh bắt tay để có được một bộ đệm!

Sử dụng SD.write (buf, kích thước);

Xin chào mọi người, tôi đang làm việc trong một dự án có cùng một vấn đề. Tôi đã làm theo các bước tương tự của bạn và có cùng số chính xác. Tôi vừa sửa nó. Vấn đề là bắt tay khi bạn gọi SD.write().

Thay thế:

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

Làm:

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

Trong dự án của tôi, cái đầu tiên tôi nhận được 4100 byte và cái thứ hai sử dụng bộ đệm có 128 (buf [128]) tôi đã nhận được 145408 byte trong dự án của mình. Đủ tốt.


1
Tôi không biết ý của bạn là gì khi bắt tay, vì AFAIK SD sử dụng bộ đệm (512 kB) trong nội bộ. Nhưng tôi cũng quan sát thấy rằng việc viết từng byte riêng lẻ bằng File.write là rất chậm và trình biên dịch dường như không thể tối ưu hóa nó (sau tất cả, nó chỉ sao chép một byte vào bộ đệm bên trong và kiểm tra xem bộ đệm có đầy không và truyền SPI có nên không khởi đầu). Sử dụng bộ đệm của riêng tôi bên ngoài và File.write (bộ đệm, kích thước) mang lại sự cải thiện hiệu năng cực cao trong ứng dụng của tôi.
oliver
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.