覚書ブログ
覚えられないので書いておきます。
2024年5月19日日曜日
zenohについて調べてみる
Eclipse SDV Projectを調べていたら、 [zenoh](https://projects.eclipse.org/projects/iot.zenoh) というのが出てきた。 見てみるとROS界隈でも使われている軽量スタックだったので、調べて見ようと思いました。 # [zenoh](https://zenoh.io/)とは Zero Network Overhead Protocolからzenohと名付けているようです。 サイトを見るとZeroOverHead Network Protocolになっているため、あれ?って部分はありますが。 # 主な機能 機能としては * Pub/Sub * Storages * Queries and Queryables があります。 また、トポロジー構成は * Peer-to-Peer * Clique , Mesh トポロジを構築 * Brokered * zenoh routerで複数clientを接続 * Routed * routerを構築し、client間や別subnetを接続 が実現できるようです。参照:https://zenoh.io/docs/getting-started/deployment/ 非機能的な要素として * Scalable * Scalable Routing * Low Power Networks * Constrained Devices * Fast * Fast Adoption * Low Latency * High Throughput とあり、マイコンからクラウドまでサポートしているとのこと。 C言語で実装された[zenoh-pico](https://github.com/eclipse-zenoh/zenoh-pico)もあります。 # パフォーマンス 以下のブログでパフォーマンスについて言及されています。 https://zenoh.io/blog/2023-03-21-zenoh-vs-mqtt-kafka-dds/ MQTTよりも性能があることが示されています。 とはいえ、MQTTは低スペックや不安定なネットワーク向けだから同じ土俵に乗せるのもと思うが。 # 拡張性 プラグインを使う事により、様々なミドルウェアと接続することが可能になります。 * mqtt * dds * rocksdb * filesystem * influxdb * s3 * webserver * sql などがあり、自作で拡張することが可能です。 # 動作確認 簡単なpub/subの動作確認の手順です。 1. z_sub とz_pubをビルド ```bash $ git clone https://github.com/eclipse-zenoh/zenoh.git $ cd zenoh/examples $ cargo build --example z_sub $ cargo build --example z_pub ``` subscriberの実行 ```bash $ ../target/debug/examples/z_sub Opening session... Declaring Subscriber on 'demo/example/**'... Press CTRL-C to quit... >> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[ 1] Pub from Rust!') >> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[ 2] Pub from Rust!') >> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[ 3] Pub from Rust!') >> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[ 4] Pub from Rust!') ``` publisherの実行 ```bash $ ../target/debug/examples/z_pub Opening session... Declaring Publisher on 'demo/example/zenoh-rs-pub'... Press CTRL-C to quit... Putting Data ('demo/example/zenoh-rs-pub': '[ 0] Pub from Rust!')... Putting Data ('demo/example/zenoh-rs-pub': '[ 1] Pub from Rust!')... Putting Data ('demo/example/zenoh-rs-pub': '[ 2] Pub from Rust!')... Putting Data ('demo/example/zenoh-rs-pub': '[ 3] Pub from Rust!')... Putting Data ('demo/example/zenoh-rs-pub': '[ 4] Pub from Rust!')... ``` こんな感じで簡単に動かせます。 routerを使ったサンプルは別の投稿でかければと思います。 # 使ってみた感想 機能としては未知数なところもあるが、ROS2で使われている&色々拡張できるという面で 非常に期待しているミドルウェアではあります。 uProtocol というミドルウェアでも使われているということなので、そこでも調べてみようかと思います。 # 参考サイト 以下参考にしたサイトです。 * https://zenoh.io/ * https://www.zettascale.tech/ * https://zenoh.io/docs/getting-started/deployment/ * https://qiita.com/Shintaro_Hosoai/items/0bde489cde43a00d6f96 * https://github.com/eclipse-zenoh/zenoh/tree/master * https://speakerdeck.com/takasehideki/zenohnoros-2xiang-kedui-ying-noxian-zhuang-tofang-xiang-xing-just-my-thought
2024年5月6日月曜日
rustup updateした後にcargoを実行したらエラーになった
# 発生事象 1. rustup update stableを実行 1. cargoを実行 ```bash $ cargo error: the 'cargo' binary, normally provided by the 'cargo' component, is not applicable to the '1.72.0-aarch64-unknown-linux-gnu' toolchain ``` と実行したがエラーが発生した。 # 解決方法 googleで検索したら、AIが以下コマンド実行してみてと教えてくれたので、実行。 ```bash rustup component remove cargo rustup component add cargo ``` これで無事cargoが実行できた。 rustup updateだけだとバイナリの不整合が発生する模様なため、cargoの入れ替えも同時に実施したほうが良さそう。 # reference https://github.com/rust-lang/rustup/issues/2704#issuecomment-815062952
2024年5月5日日曜日
instrument_functionで関数トレースをしてみる
# モチベーション ちょっとした動作確認を行った場合、コールツリーなどをチェックしたいということがありました。 わざわざ、関数にDebug Printを入れ込むのも面倒だなと言うことなので、ちょっと調査しました。 # 実現方法 1 . コンパイルオプション ```-finstrument-functions``` を設定してコンパイル 2 . 関数のentry/exitで以下の関数が呼び出される ```c void __cyg_profile_func_enter(void *func_address, void *call_site) // func_addressが呼び出される関数アドレス、call_siteは呼び出しもとの関数アドレス void __cyg_profile_func_exit(void *func_address, void *call_site) ``` 3 . この関数の中で、アドレスから関数名に変換する仕組みを入れることにより、 コールツリーが確認できる。 ※cyg_profile_func_enter/exit自体はフック対象外とするため、 ```-finstrument-functions```の対象外とする必要がある。 実装したサンプルコードはこちら [サンプルコード](https://github.com/ponta027/c_lang_sandbox/tree/main/function_trace) ちなみにstatic関数のコールトレースはできない。 staticを空のマクロ定義にして、読み出せるようにするなどで実現できるが、関数名の衝突などがありそうなため、うまくできるかは微妙。 # 改善点 * 関数名までなので、引数も表示できるようにしたい。 * libdwarfを使うとできるよう。
新しい投稿
前の投稿
ホーム
登録:
投稿 (Atom)