問題タブ [usb-mass-storage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
366 参照

c++ - Linux での USB 大容量記憶装置の読み取りバッファリングの無効化

シナリオ:

  • ラズベリーパイ3モデルB
  • USB経由で接続されたAdaptronic Modular ECU(大容量記憶装置として表示されます。実際には2つ、この場合はsdaとsdbです)

私は単純に fopen() を使用して読み取り用に /dev/sda を開き、読み取りたい位置をシークして 2048 バイトを読み取りました。次に、以前にシークした位置に再シークし、そのデータを再度読み取ります。

最初の読み取りで、新鮮で正しいデータを取得します。後続の各読み取りで、同じデータを何度も取得します。最初の読み取り後にデバイスを再度ポーリングしようとはしませんが (アクティビティ ライトがあるため)、アプリを強制終了すると (ctrl + c)、アクティビティ ライトが激しく点滅して停止します。

私はそれが自分のコードのバッファリングの問題だと思っていました (私は ifstream から始めて、fopen() と open() をすべて同じように試しました)、バフを無効にするさまざまな方法 (つまり、setvbuf()) を試しましたが、私はまだ新しいデータを取得していません。

ファイルを閉じて再度開くと、新しいデータが得られますが、これは非常に遅いプロセスです (1 秒あたり約 10 ~ 12 サンプルしか得られません)。

これはマウントされたデバイスではなく、単にストレージ デバイスとして表示され、そのブロック デバイスから直接読み取ることに注意してください。

同じコードを Windows に移植したところ、動作するので、これは私のコードではなく、Linux 内の何かだと思います。

どんな助けでも大歓迎です。