macOSからPi Picoを使う - その29 [Pi Pico]
前回の非同期転送の続き....
を使えばいい。それほど難しくない。
を呼ぶ。この関数はすぐ返ってくる。
このコールバックはイベント処理ループから呼ばれることになる。従って割り込みルーチンほど厳しい制限はないけど、このコールバックの中に重い処理を書くべきではない。また当然このコールバックから直接次の転送を起動する、などということはできない。
このlibusbの「イベント処理ループ」がどうなっているか、はこんど説明する。
を呼ぶ。この関数もすぐ返ってきて、キャンセル処理が完了したあと、statusにその旨が設定されてコールバックが呼ばれる。
従って、キャンセル関数を呼んですぐ構造体を解放すると動作は未定義(普通はクラッシュするだろう)。
デバイスとの実際のやり取りでキャンセルする前にデータが部分的に転送されている可能性がある。場合によってはデバイスのリセットなどが必要になる。こういう場合の動作はデバイスがどうプログラムされているかに依存することになる。
17.5.2 Filling
前回のlibusb_free_transfer()関数で確保された構造体は中身がからっぽ(デフォルト値が埋められているようである)で、自分で構造体のメンバを埋めるか、転送モードごとにstatic void libusb_fill_control_transfer(struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout); static void libusb_fill_bulk_transfer(struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout); static void libusb_fill_bulk_stream_transfer(struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, uint32_t stream_id, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout); static void libusb_fill_interrupt_transfer(struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout); static void libusb_fill_iso_transfer(struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, int num_iso_packets, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout);
17.5.3 Submission
転送を開始(正確には登録)するにはint libusb_submit_transfer(struct libusb_transfer *transfer);
17.5.4 Completion handling
転送が終わるとコールバックが呼ばれる。statusを見て転送が成功したかどうかを判断する。このコールバックはイベント処理ループから呼ばれることになる。従って割り込みルーチンほど厳しい制限はないけど、このコールバックの中に重い処理を書くべきではない。また当然このコールバックから直接次の転送を起動する、などということはできない。
このlibusbの「イベント処理ループ」がどうなっているか、はこんど説明する。
17.5.5 転送のキャンセル
アプリケーション側で何らかの問題があって転送をキャンセルしたい場合がある。そのときはint libusb_cancel_transfer(struct libusb_transfer *transfer);
従って、キャンセル関数を呼んですぐ構造体を解放すると動作は未定義(普通はクラッシュするだろう)。
デバイスとの実際のやり取りでキャンセルする前にデータが部分的に転送されている可能性がある。場合によってはデバイスのリセットなどが必要になる。こういう場合の動作はデバイスがどうプログラムされているかに依存することになる。
17.5.6 Timeout
タイムアウトするとコールバックが呼ばれるので、その場合の処理も対応しておく必要がある。USBのタイムアウトってケーブルが抜けた、とか断線した、というハードウェア的な問題か、デバイスの内部処理が潜ってしまった、とか言う場合ぐらいしか起こらないような気がする。どの場合も致命的で、リトライとかあり得ないだろうな。17.5.7 Control transfer固有の問題
Control tranferは転送の内容が構造化されている。bufferの内容もそれに従った構造をしていないといけない。USBプロトコルと直接対応するのでレファレンスを見てもらう方が早い。2021-09-01 21:13
nice!(0)
コメント(3)
はじめまして
ブログを拝見させていただきました。
さて、数年前の記事を読ませていただいたのですが、セクシー女優のつぼみさんの3Dデータを使うものがあったのですが、
もし、まだデータが残っていましたらいただきたく思います…
実はこのデータを求めて四方を彷徨っている状況です…
何卒よろしくお願いしますm(_ _)m
by みけみけ (2021-09-01 22:45)
このブログのネタは圧縮してずっとバックアップをとってあるので、中を漁ったのですが、テキストだけでデータ本体は見つかりませんでした。
たしかに、もし今あれば結構貴重だったかも知れません。
残念です。
by decafish (2021-09-02 19:10)
わざわざ探していただいたようで、ありがとうごさいましたm(_ _)m
深謝!
by みけみけ (2021-09-02 19:36)