Rustでアプリケーション (連載11)
前回までにRust言語についていろいろと学んできたことを、ここからは実践してみたいと思います。
SOLID-OS上で動くアプリケーションを書いていきます。
1. せっかくなのでクレートを使いたい
実践するにあたっては、Rustっぽく、クレートを使ってI/Oをアクセスするような格好いいプログラムを書いてみたいところです。
以前、GPIOを操作しLチカするアプリをRustで書いたときに、I/Oアクセス用のPACを使用した記憶があります。
ここで再度、PACを見てみましょう。
https://github.com/KyotoMicrocomputer/solid-rapi4-examples/tree/main/common/bcm2711_pac
srcフォルダの中も見てみましょう。
https://github.com/KyotoMicrocomputer/solid-rapi4-examples/tree/main/common/bcm2711_pac/src
沢山ありますね!
センサの接続としては、SPIあたりが使えそうです。
という事で、せっかくなので、SPIを使って何かセンサをアクセスするようなプログラムを書いてみます。
2.アクセス対象とするセンサ
SPI I/Fを持っているセンサを何か選定したい。
しかし温湿度センサでは、リアルタイムOSであるSOLID-OSでアクセスする必要性を感じません。Linuxでやればいいじゃん、と言われそうです。
あ、そうだ。
加速度センサではどうでしょうか。
1ms間隔で、x, y, zの値を読めば、物体の動作をきめ細かく把握する事ができそうです。
3.Linux側の役目を決める
SOLID-OS側アプリで読む、大量のx, y, zの値を、どこにどうしましょうか。
ここで、思い出すのは、SOLID-OSとLinuxのCPU間通信のこと。
SOLID-OSは、ネットワークソケット機能を提供しており、それは、Linuxのネットワークドライバを使用して実現しています。
それなら、このネットワークソケット機能を使用して、センサデータを送ってみましょう!
という事で、Linuxの役目は、
「ネットワーク機能を提供すること」
に決まり!です。
SOLID-OS側で高速にセンサを読む役目をリアルタイムOSに専念してもらい、ネットワーク送信の役目をLinuxに課すことで、Dual-OSのメリットが出せそうです。
4.SOLID-OSのネットワークソケット機能
SOLID-OSには、ソケット機能が備わっています。
http://solid.kmckk.com/doc/skit/current/os/sockets/index.html#
こちらを使ったRustのサンプルがありますので、ありがたく使わせていただきましょう。
https://github.com/KyotoMicrocomputer/solid-rapi4-examples/tree/main/rust-server-tcpecho-std
TCP/IPのサーバです。
PC側がクライアントとなります。
5.構成決定
という事で、以下のようなデモを作成したいと思います。
[ハードウェア構成]
Raspberry pi 4Bの各端子について今回使用する設定と、対応する加速度センサADXL345との結線は以下となります
※Function select No.とは、bcm2711に設定するための端子マルチプレクス設定番号です。
[ソフトウェア構成]
・Windows PC側
簡単なTCP/IPクライアントをC#で書く
・Raspberry pi 側
以下のようなソフトウェアブロックになる
作っている途中、何かに気が付いたら柔軟に仕様変更をしつつ、作り上げていきたいと思いますので、長くなりそうですがお付き合いいただければ嬉しいです。
第12回はこちら。