teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

補足追加

2019/05/06 00:57

投稿

thkana
thkana

スコア7738

answer CHANGED
@@ -22,6 +22,6 @@
22
22
  いわゆるマルチタスクな構成にすればよさそうです。しかし。ありモノのライブラリで(言い方は悪いですが)でっち上げるArduino的な手法では無理と言っていいのでは。Arduinoは、マイコンの知識があまりなくてもそこそこ使える、という開発環境と私は理解していますが、その範疇から外れます。マイコン本来の使い方に立ち返って、タスク設計とかをある程度やらないといけないでしょう。
23
23
 
24
24
  そこで、方針を転じて、物量で解決する、という手はいかがでしょう。
25
- Arduinoを2台使います。1台はCANの通信を行い、ロギングすべきデータをバッファリングし、シリアル/I2C/SPIなど適当な通信手段で吐き出します。もう1台は、CAN側が出したデータを受信し、SDカードに書き込む仕事をします。
25
+ Arduinoを2台使います。1台はCANの通信を行い、ロギングすべきデータをバッファリングし、シリアル/I2C/SPIなど適当な通信手段で吐き出します。もう1台は、CAN側が出したデータを受信し、SDカードに書き込む仕事をします。(シリアルはダメかな。115Kbaudでも1byte100us弱だから、21byte/400usには足りない)
26
26
  CAN側のバッファは、SDカードアクセス中の2.5msに湧いてくるデータを貯め込むのに十分な量を確保しておきます。そして、SDカード側がデータを受け取れることを確認しながらデータの流し込みを行います。
27
27
  これなら、Arduinoの範囲内でなんとかなりそうな気がします。

1

解決案について追記しました

2019/05/06 00:57

投稿

thkana
thkana

スコア7738

answer CHANGED
@@ -11,4 +11,17 @@
11
11
  > 質問③:上記2つの遅延を100us以内に処理時間を減らす方法はないのか。
12
12
 
13
13
  ライブラリのソースコードを覗いて、改造してみては。
14
- メモリーに余裕があるのなら、512byteのバッファをもう一面確保して、タイマー割り込み等をうまく使いながらバックグラウンドで書き込みを行うようにすると見た目の動作はずいぶん早く出来るかも知れません。(512byteの書き込みが終わる前に次の512byteのバッファが一杯になってしまうようなデータ量だと破綻しますが)
14
+ メモリーに余裕があるのなら、512byteのバッファをもう一面確保して、タイマー割り込み等をうまく使いながらバックグラウンドで書き込みを行うようにすると見た目の動作はずいぶん早く出来るかも知れません。(512byteの書き込みが終わる前に次の512byteのバッファが一杯になってしまうようなデータ量だと破綻しますが)
15
+
16
+ ---
17
+ コメント欄でのやり取りが煮詰まってきたので、解決案っぽいことをこちらに追記します。
18
+
19
+ 作業を開始してから完了するまで2.5msかかる、という時間自体は動かないと思います。
20
+ しかし、2.5ms本当にCPUを占拠し続けなければ出来ない仕事なのかどうか、という点で検討の余地があるでしょう。
21
+
22
+ いわゆるマルチタスクな構成にすればよさそうです。しかし。ありモノのライブラリで(言い方は悪いですが)でっち上げるArduino的な手法では無理と言っていいのでは。Arduinoは、マイコンの知識があまりなくてもそこそこ使える、という開発環境と私は理解していますが、その範疇から外れます。マイコン本来の使い方に立ち返って、タスク設計とかをある程度やらないといけないでしょう。
23
+
24
+ そこで、方針を転じて、物量で解決する、という手はいかがでしょう。
25
+ Arduinoを2台使います。1台はCANの通信を行い、ロギングすべきデータをバッファリングし、シリアル/I2C/SPIなど適当な通信手段で吐き出します。もう1台は、CAN側が出したデータを受信し、SDカードに書き込む仕事をします。
26
+ CAN側のバッファは、SDカードアクセス中の2.5msに湧いてくるデータを貯め込むのに十分な量を確保しておきます。そして、SDカード側がデータを受け取れることを確認しながらデータの流し込みを行います。
27
+ これなら、Arduinoの範囲内でなんとかなりそうな気がします。