Closed tnishinaga closed 11 months ago
すばらしい。 今日はイベントがあって終わるまで見れないので、明日になると思います。
この件、コメントを求められているような気がしていて、そしてコメントしたいとも思っていたんですが、 なかなか出来ていませんでした。 Rust を深く理解したいのですが、まだ十分ではない気がして。
大きな点は PIO のプログラム複数を動的に差し替えて使うようになったという事ですね。 個人的には子細な動作の検証が難しそうだと思って避けていたんですが、 正しく動くのであればこういう方向に進んでいくしかないんでしょうね。 この流れで JTAG と SWD の両対応が視野に入って来ます。
リセット周りを動作確認することになるなら、この件(#40) も同時に対応してしまいたいです。
正しく動くのであればこういう方向に進んでいくしかないんでしょうね。
今のところ正しく動いていそうです。 入れ替えのコストはわかりませんが、SWJ_Pinsが呼ばれるのはOpenOCD接続時くらいなので大丈夫そうと考えています。
リセット周りを動作確認することになるなら、https://github.com/ciniml/rust-dap/issues/40 も同時に対応してしまいたいです。
この点に関しては、未検証です。
PIOはpinのdirectionを変更しない(こちらの方がDAP Linkのコードの挙動に近いはずですが、誤りがあれば教えてください)
bitbangのswj_pins、なんでこうなってるんだっけ?と思ったけど、よく考えたらこれ実装してくれたの @tnishinaga さんでしたっけ? DAPLinkは確かにピン方向変えるようになってないので、気になるなら変更してもいいと思います。 (あまりどちらでも実際のSWD/JTAGの通信に影響はなさそうですけども)
bitbangのswj_pins、なんでこうなってるんだっけ?
これは実装当時の私がそういう挙動が正しいと思って実装したのですが、今回読み直したら間違っていたという感じです。 一旦こちらは取り込んだ後、Issueをたてるのはいかがでしょうか?
とりあえずコード自体は確認しました。
PIOのプログラム入れ替えも実際はPIOの命令メモリへの高々32ワード分の書き込みで、PIO自体はCPUクロックと同じ速度でうごいていて、AHB Lite経由での同一クロックドメインでのアクセスなのでスループットはCPUのメモリバスと同等として、SRAMからの32ワード分のmemcpyするのと同じなので、まあたぶん最大でも100サイクルくらい?ですし、許容範囲かなと思います。 (測ってないけど)
ありがとうございます。
まあたぶん最大でも100サイクルくらい?ですし、許容範囲かなと思います。
はい。あんまりコストでもないし、頻繁に入れ替えることもない(初回以外はずっと既存のSWDプログラムが動き続ける)ので多分大丈夫と考えています。
問題なさそうでしたらマージお願いします 🙏
RPi PicoでSWD構成だとなんかpanicしてますね。
(HOST) INFO success!
RTT logs not available; blocking until the device halts..
────────────────────────────────────────────────────────────────────────────────
^C────────────────────────────────────────────────────────────────────────────────
stack backtrace:
0: rust_begin_unwind
at /home/kenta/.cargo/registry/src/index.crates.io-6f17d22bba15001f/panic-halt-0.2.0/src/lib.rs:32:5
1: core::panicking::panic_fmt
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library/core/src/panicking.rs:67:14
2: core::panicking::panic
at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library/core/src/panicking.rs:117:5
3: rp2040_hal::pio::PIOBuilder<P>::set_pins
at /home/kenta/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rp2040-hal-0.8.2/src/pio.rs:1948:9
4: rust_dap_rp2040::pio::SwdIoSet<C,D,E>::build_pio
at /home/kenta/repos/rust-dap/support_reset_pin_pio/rust-dap-rp2040/src/pio.rs:311:14
5: rust_dap_rp2040::pio::SwdIoSet<rp2040_hal::gpio::pin::Pin<C,rp2040_hal::gpio::pin::Function<rp2040_pac::PIO0>>,rp2040_hal::gpio::pin::Pin<D,rp2040_hal::gpio::pin::Function<rp2040_pac::PIO0>>,rp2040_hal::gpio::pin::Pin<E,rp2040_hal::gpio::pin::Function<rp2040_pac::PIO0>>>::new
at /home/kenta/repos/rust-dap/support_reset_pin_pio/rust-dap-rp2040/src/pio.rs:257:28
6: rust_dap_raspberrypi_pico::app::init
at src/main.rs:211:25
7: rust_dap_raspberrypi_pico::app::rtic_ext::main::{{closure}}
at src/main.rs:20:1
8: rust_dap_raspberrypi_pico::app::rtic_ext::main::__rtic_init_resources
at src/main.rs:20:1
9: main
at src/main.rs:20:1
10: Reset
(HOST) WARN call stack was corrupted; unwinding could not be completed
(HOST) INFO device halted by user
set_pin_count
は 5
までなので、 Self::build_pio((0,32)
は Self::build_pio((0,5)
にしないとダメそう
修正確認しました。 SWDでのデバッグとnRESET
の動作確認もOKです。マージします。
https://github.com/ciniml/rust-dap/pull/54 の続きです。
pioでもnRESETを使えるようにしてみました。
動作確認方法は #54 と同様です。
課題