Armadilloフォーラム

シリアル通信の転送速度について

naito

2025年7月18日 18時32分

==========
製品型番:Armadillo-900
Debian/ABOSバージョン:ABOS 3.21.3-at.14
カーネルバージョン:5.10.238-at0
その他:ATDE9使用
==========

お世話になっております。
内藤です。

こちらで下記HowtoのSPI通信速度を計測すると、通信速度が最大でも140Kbpsほどになりました。
https://armadillo.atmark-techno.com/howto/a900-spi-adc-mcp3204
SPIクロックを確認したところ、連続でマスターから通信を送っても通信間隔が167usほど開いているのですが、
M33を経由するためオーバヘッドはこれぐらいかかっているということで認識合いますでしょうか。
それともこちらの環境の問題でしょうか。
また、M33を経由しないLPSPI4,5を使うとオーバーヘッドは小さくなると考えておりますが間違いありませんでしょうか。

重ねての質問となりますが、SPI通信以外に通信速度が2Mbps以上となる通信手段はありますでしょうか。

以上、よろしくお願いいたします。

コメント

at_dominique.m…

2025年7月23日 9時10分

内藤さん

お世話になっています、
マルティネです。

返事が遅くなってすみません。
詳細はまだ確認していませんが、ひとまず自分の認識上から回答させていただきます。

> こちらで下記HowtoのSPI通信速度を計測すると、通信速度が最大でも140Kbpsほどになりました。
> https://armadillo.atmark-techno.com/howto/a900-spi-adc-mcp3204
> SPIクロックを確認したところ、連続でマスターから通信を送っても通信間隔が167usほど開いているのですが、
> M33を経由するためオーバヘッドはこれぐらいかかっているということで認識合いますでしょうか。

なるほど、確かに pipelineっぽい仕組みはないので、通信中に linux が待っていて、通信完了した後に次のメッセージを m33 に送りますのでそういうギャップができますね…
上記の数字ですと、1メッセージあったりに32bytesぐらいを通信しているようにみえますが、その量を増やせばギャップの影響が薄くなるはずです。メッセージのサイズを大きくできますでしょうか?
(linux/m33 プロとコーロ上の最大サイズは 476 byte までです)

また、pipeline (メッセージ通信完了前に m33 に次のメッセージを送る)の様な実装ですが、Linux の SPI ドライバーとしての実装は厳しいと思います。
tx/rx が分けてるプロトコールでしたらエラー処理が難しいだけですが、SPI の場合は受信データも処理しないといけないので、バッファーを後でリターンできません。

> また、M33を経由しないLPSPI4,5を使うとオーバーヘッドは小さくなると考えておりますが間違いありませんでしょうか。

そうですね、こちらも実際に図ってみないとなんとも言えませんが、linux-m33 通信がない分にオーバーヘッドが少ないと考えて間違いないと思います。
ただし、別のオーバーヘッドとしては linux の irq 処理が間に合わないといけないので、受信の文字取りこぼしなどはあるかもしれません(
見たところ dma を利用していますので実装次第問題ないかもしれませんが、(rx buffer が半分の)lpuart の場合は 115200 baud でも取りこぼしてますので、評価が必要だと考えています)

また、遅くなっている原因は linux-m33 の通信ではなく linux のドライバでしたら差もそんなにない可能性は高いです。
スピードの変更しやすい UART で LPUART0 (A9E の /dev/ttyrmpsg1) と LPUART5 (A9E の /dev/ttyLP1) を比較したところ、やっぱりメッセージのサイズによって差を感じますが、大きいバッファーを利用できれば影響を抑えれますね。

(こちらは送信だけを試して、受信できるかどうかは見てません。前に確認したところ、rpmsg の場合は 1M で受信を取りこぼしせずにできてましたが、3M を受信するには m33 側の実装の改善が必要と記憶しています)

# ttyLP1 を安全に送信するために接続されているモデムを停止します
armadillo:~# wwan-safe-poweroff
# 1M の場合 (理論上 128KB/s)
armadillo:~# stty 1000000 < /dev/ttyLP1
armadillo:~# stty 1000000 < /dev/ttyrpmsg1
armadillo:~# for uart in ttyrpmsg1 ttyLP1; do for size in 8 16 32 64 128 256 482; do echo $uart $size; dd if=/dev/zero of=/dev/$uart bs=$size count=$((1024*1024/size/4)); done; done
ttyrpmsg1 8
32768+0 records in
32768+0 records out
262144 bytes (256.0KB) copied, 5.645429 seconds, 45.3KB/s
ttyrpmsg1 16
16384+0 records in
16384+0 records out
262144 bytes (256.0KB) copied, 4.124422 seconds, 62.1KB/s
ttyrpmsg1 32
8192+0 records in
8192+0 records out
262144 bytes (256.0KB) copied, 3.392595 seconds, 75.5KB/s
ttyrpmsg1 64
4096+0 records in
4096+0 records out
262144 bytes (256.0KB) copied, 3.038322 seconds, 84.3KB/s
ttyrpmsg1 128
2048+0 records in
2048+0 records out
262144 bytes (256.0KB) copied, 2.838736 seconds, 90.2KB/s
ttyrpmsg1 256
1024+0 records in
1024+0 records out
262144 bytes (256.0KB) copied, 2.737344 seconds, 93.5KB/s
ttyrpmsg1 482
543+0 records in
543+0 records out
261726 bytes (255.6KB) copied, 2.704219 seconds, 94.5KB/s
 
 
ttyLP1 8
32768+0 records in
32768+0 records out
262144 bytes (256.0KB) copied, 2.631257 seconds, 97.3KB/s
ttyLP1 16
16384+0 records in
16384+0 records out
262144 bytes (256.0KB) copied, 2.636010 seconds, 97.1KB/s
ttyLP1 32
8192+0 records in
8192+0 records out
262144 bytes (256.0KB) copied, 2.629510 seconds, 97.4KB/s
ttyLP1 64
4096+0 records in
4096+0 records out
262144 bytes (256.0KB) copied, 2.628280 seconds, 97.4KB/s
ttyLP1 128
2048+0 records in
2048+0 records out
262144 bytes (256.0KB) copied, 2.629956 seconds, 97.3KB/s
ttyLP1 256
1024+0 records in
1024+0 records out
262144 bytes (256.0KB) copied, 2.629313 seconds, 97.4KB/s
ttyLP1 482
543+0 records in
543+0 records out
261726 bytes (255.6KB) copied, 2.623117 seconds, 97.4KB/s
# 3M の場合 (理論上 384KB/s)
armadillo:~# stty 3000000 < /dev/ttyLP1
armadillo:~# stty 3000000 < /dev/ttyrpmsg1
armadillo:~# for uart in ttyrpmsg1 ttyLP1; do for size in 8 16 32 64 128 256 482; do echo $uart $size; dd if=/dev/zero of=/dev/$uart bs=$size count=$((1024*1024/size/4)); done; done
ttyrpmsg1 8
32768+0 records in
32768+0 records out
262144 bytes (256.0KB) copied, 4.295681 seconds, 59.6KB/s
ttyrpmsg1 16
16384+0 records in
16384+0 records out
262144 bytes (256.0KB) copied, 2.369222 seconds, 108.1KB/s
ttyrpmsg1 32
8192+0 records in
8192+0 records out
262144 bytes (256.0KB) copied, 1.772995 seconds, 144.4KB/s
ttyrpmsg1 64
4096+0 records in
4096+0 records out
262144 bytes (256.0KB) copied, 1.285228 seconds, 199.2KB/s
ttyrpmsg1 128
2048+0 records in
2048+0 records out
262144 bytes (256.0KB) copied, 1.079085 seconds, 237.2KB/s
ttyrpmsg1 256
1024+0 records in
1024+0 records out
262144 bytes (256.0KB) copied, 0.993977 seconds, 257.6KB/s
ttyrpmsg1 482
543+0 records in
543+0 records out
261726 bytes (255.6KB) copied, 0.952450 seconds, 268.4KB/s
 
 
ttyLP1 8
32768+0 records in
32768+0 records out
262144 bytes (256.0KB) copied, 0.889472 seconds, 287.8KB/s
ttyLP1 16
16384+0 records in
16384+0 records out
262144 bytes (256.0KB) copied, 0.885962 seconds, 289.0KB/s
ttyLP1 32
8192+0 records in
8192+0 records out
262144 bytes (256.0KB) copied, 0.884060 seconds, 289.6KB/s
ttyLP1 64
4096+0 records in
4096+0 records out
262144 bytes (256.0KB) copied, 0.893469 seconds, 286.5KB/s
ttyLP1 128
2048+0 records in
2048+0 records out
262144 bytes (256.0KB) copied, 0.882793 seconds, 290.0KB/s
ttyLP1 256
1024+0 records in
1024+0 records out
262144 bytes (256.0KB) copied, 0.888573 seconds, 288.1KB/s
ttyLP1 482
543+0 records in
543+0 records out
261726 bytes (255.6KB) copied, 0.880993 seconds, 290.1KB/s

なので、小さいメッセージの場合は影響大きいですが、大きいメッセージを利用すれば linux との差が小さくなります。

> 重ねての質問となりますが、SPI通信以外に通信速度が2Mbps以上となる通信手段はありますでしょうか。

bit で間違いなければ、上記の uart + 3M の baud rate でしたらできそうですね。
それ以外に思いつけるのは SDIO, ethernet か wifi ぐらいですが、利用できない前提でしょうか。

よろしくお願いします