(toppers-users 4548) Re: 周期タスク内でのファイルシステム利用時の処理時間について

Masaki Muranaka monamour @ monaka.org
2016年 6月 7日 (火) 09:26:52 JST


みなさま、おはようございます。

> open,fcloseが最初と最後にあるのは良いとして、RTOSを使用するような組み込みシステムの
> 場合、周期毎にwriteを実施するのでなく、一定以上の量を溜めてからwriteすることの
> 方が良いかと思います。

ISO に準拠した libc では、FILE 構造体の中に、読み書き用のバッファがあることが期待されます。

そして、むしろこのことが周期タスクのオーバランの引き金になっている可能性もあります。
バッファに溜まっている間はオンメモリ処理だけで済みますが、書き込み回数が一定以上になり、
バッファが一杯になり、書き込みに行き、デッドラインを守れない。そんなシナリオです。

タスク分割もバッファリングの手段としては有効ですが、デバイスアクセスに要する
時間見積ができていない状態では、却って問題を複雑にするかもしれません。

fprintf は、フォーマット文字列のパーズがあり、実装によっては内部で動的メモリ確保が
行われていたり、応答時間の読みづらい関数です。

具体的に何が起きているのかは、コードを見ないとなんとも言えません。
しかし、stdio.h の使用を決めた時点で、そもそも設計のスジが悪いように思います。


2016年6月6日 21:17 Tetsuo TAKAHASHI <tetsu-t @ mbd.ocn.ne.jp>:
> 高橋と申します。
>
> 経験則的に…ですが、
>
>> 2016/06/06 10:10、SAKATA,KOSUKE / 坂田昂亮 <kosuke.sakata.oy @ hitachi-automotive.co.jp> のメール:
>> お世話になります、日立オートモティブシステムズの坂田と申します。
>
>> 症状はファイルシステムの利用中に発生しております。
>> Mindstorms EV3に挿入するmicroSDカード内に予め作成したログ保存用フォルダに、
>> .csv形式で任意のテキストデータを書き込むプログラムを作成いたしました。
>> 書き込み処理(fprintf関数)は周期起動タスクで実行させており、周期は4msと設定しております。
>> fopen,fcloseは下記のごとく周期起動タスク外でタスク起動前、タスク終了後に実行しております。
>
> fopen,fcloseが最初と最後にあるのは良いとして、RTOSを使用するような組み込みシステムの
> 場合、周期毎にwriteを実施するのでなく、一定以上の量を溜めてからwriteすることの
> 方が良いかと思います。
>
> 通常、
>
>> プログラム開始→fopen→周期タスク起動→(~~4ms周期で書き込み~~)→周期タスク終了→fclose→プログラム終了
>
> 上記の周期タスクの中で、writeするのではなく、バックグラウンド的なタスクを用いて、
> 周期に依存しない形で書き込み用のタスクを管理します。
> 書き込むデータそのものは、リングバッファ等のバッファに溜め込んで置いて、書き込み
> 用の周期に依存しないタスクが必要な時に書き出しを行っていくやり方をします。
>
>> 症状はこの書き込み周期タスクの処理時間が一定の時間間隔で4msを大きく超えるタイミングが発生するというものです。
>
> 症状については、実際のモノを見ないと分かりませんが、タスクの構成でなんとかなりそうな
> 気がしますが...
>
>
> --
> // Tetsuo TAKAHASHI <tetsu-t @ mbd.ocn.ne.jp>
>
>