前提・実現したいこと
ArduinoでmicroSDに文字の読み書きをしています。
その際の処理時間に差があることに気づきました。
それは初回読み書き時と512byte読み書きするごとに処理時間の遅延が発生していました。
1byte書き込みは通常48us程度で終わるが、2500us以上の処理時間を要していました。
これは読み込みと書き込みに共通して起こる現象でした。
そこで以下の質問です。
質問①:初回読み書き時に遅延するのは何故か。
質問②:512byte読み書きするごとに遅延するのは何故か。
質問③:上記2つの遅延を100us以内に処理時間を減らす方法はないのか。(100us以内でなくても処理時間を減らす方法があれば)
ソースコード
Arduino
1#include <SD.h> 2#include <SPI.h> 3#include <mcp_can.h> 4#include <mcp_can_dfs.h> 5 6const byte SD_SS = 4; 7String fname = "SDwrite.txt"; 8File file; 9 10void setup() 11{ 12 unsigned long count = 1; 13 unsigned long s_time = 0; 14 unsigned long e_time = 0; 15 unsigned long c_buf[50] = { 0 }; 16 unsigned long t_buf[50] = { 0 }; 17 18 Serial.begin(57600); 19 if (!SD.begin(SD_SS)) 20 { 21 Serial.println("SD_FAIL"); 22 return; 23 } 24 25 file = SD.open(fname, FILE_WRITE); //ファイル新規作成、書き込みモード 26 for (int i = 0; i < 50; i++) 27 { 28 bool flg = 0; 29 while (!flg) 30 { 31 s_time = micros(); //起動経過時間をマイクロ秒(us)で返す 32 file.print('1'); //1byte書き込み 33 e_time = micros(); //起動経過時間をマイクロ秒(us)で返す 34 if ((e_time - s_time) >= 60) 35 { 36 c_buf[i] = count; 37 t_buf[i] = (e_time - s_time); 38 flg = 1; 39 } 40 count++; 41 } 42 } 43 file.close(); 44 45 for (int j = 0; j < 50; j++) 46 { 47 Serial.print(c_buf[j]); 48 Serial.print('\t'); 49 Serial.println(t_buf[j]); 50 } 51 52} 53 54void loop() 55{ 56 //何もしない 57}
実行結果(シリアルモニター)
1 19468
513 2816
1025 2516
1537 2520
2049 2516
-----省略-----
23553 2536
24065 2532
24577 2548
25089 2544
補足情報
・Arduino Uno R3
・Seeed Studio CAN-BUSシールドV2
・SAMSUNG microSD HC 32GB
今後やりたいこと
400us間隔で受信するCAN信号のログ保存を考えています。ログデータは1信号辺り21byteです。質問にある書き込み遅延の影響でログの取得漏れが起こっています。ログ保存の方法は文字型配列(buf)にデータを入れてからまとめてfile.print(buf);する方法で行います。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/04 06:39
2019/05/04 14:25
2019/05/05 11:05
2019/05/05 12:11
2019/05/05 13:20
2019/05/10 12:02