私は現在、再帰的に呼び出して Red Pitaya ボードからデータを (非常にゆっくりと) 受信する python プログラムを持っています。
redpitaya_scpi.scpi(192.169.1.100).rx_txt()
rp_remote_acquireを使用して、リング バッファーでより高いスループットを実現したいと考えています。
stackoverflow のおかげで./rp_remote_acquire
、Red Pitaya (サーバー) と Linux マシン (クライアント) の両方で実行できます。
/tmp/out
Red Pitaya で次のコマンドを実行するたびに、独自のコンテンツが得られます (これは、サーバー上のプログラムがそのハードウェアからデータにアクセスできることを示唆しています)。
rm /tmp/out
./rp_remote_acquire -m 3
cat /tmp/out
Red Pitaya (クライアント) から Linux マシン (サーバー) にデータを転送するために./rp_remote_acquire
、次のパラメーターを使用して起動します。
サーバー ( 192.169.1.100
):
./rp_remote_acquire -m 2 -a 192.169.1.102 -p 14000
クライアント ( 192.169.1.102
):
./rp_remote_acquire -m 1 -a 192.169.1.100 -p 14000
どこ:
-m --mode <(1|client)|(2|server)|(3|file)>
operating mode (default client)
-a --address <ip_address>
target address in client mode (default empty)
-p --port <port_num>
port number in client and server mode (default 14000)
両方のマシンは互いに ping を実行でき、マシンは接続を確立できます (つまり、 0 をint connection_start(option_fields_t *options, struct handles *handles) at transfer.c:251
返します)。
クライアントは、 transfer.cから次のコード スニペットを実行することになります。
533 while (!size || transferred < size) {
(gdb) n
534 if (pos == buf_size)
(gdb) n
539 if (pos + CHUNK <= curr) {
(gdb) n
552 memcpy(buf, mapped_base + pos, len);
(gdb) n
554 if (handles->sock >= 0) {
(gdb) n
552 memcpy(buf, mapped_base + pos, len);
(gdb) n
554 if (handles->sock >= 0) {
(gdb) n
555 if (send_buffer(handles->sock, options, buf, len) < 0) {
(gdb) n
569 pos += len;
(gdb) n
533 while (!size || transferred < size) {
クライアントは効果的に次のことを行っているようです(size = 0
デフォルトで注意してください):
533 while (!size || transferred < size) {
552 memcpy(buf, mapped_base + pos, len);
552 memcpy(buf, mapped_base + pos, len);
569 pos += len;
}
サーバーが停止するとすぐにクライアントが停止するため、この動作はプログラマーの意図のようです。
554 if (handles->sock >= 0) {
(gdb)
556 if (!interrupted)
size
ゼロに等しくないように変更しても、プログラムはこのループでスタックしません(=> より小さなパケット?)。
Red Pitaya (サーバー) から Linux マシン (クライアント) に (できれば) 送信されているデータにアクセスし、このデータをクライアント マシン上の Python プログラムで利用できるようにしたいと考えています。
私の質問:
ここで何が行われていて、どうすればデータにアクセスできますか?
rp_remote_acquire
クライアントのメモリにコピーしているデータを何らかの方法で読み取る、クライアント上で 2 番目のプログラムを同期的に実行する必要がありますか?