3/12 久しぶりに顎が外れて焦った&『基礎から学ぶ組込みRUST』読んだ

5時10分起床。花粉症対策としてエアコン切ったから寒い。でも耐えられる寒さ。心なしか花粉症もマシな気がする。朝活は久しぶりにフルセット完了。偉すぎる。朝方はエアコンつけてないとやはり寒い。防寒しっかりして花粉対策でマスク着用してなんとか。なんで自室でもマスク着けてないといけないんだろうな。エアコン停止+マスクのおかげで楽だったけど

 

昨日は読書メインだったので、今日はRUSTメインでやることにする。今週も委員長のホグワーツがあるから、それまでのんびりやっていこうかと思う。RUSTをどこまでを目標にしようか悩む。

 

顎が外れてめっちゃ焦る

力ちゃんのラジオ配信観ながらRUSTやっていたら、顎が外れた。顎外れるのはたまにあるのだけれど、いつものやり方で治そうとしても治らなくてめっちゃ焦った。

今までにないくらい割とがっつり外れたぽくて30分くらい顎が外れたままだった。ラジオもRUSTもそれどころではない。顎が外れたときの対処法を探しても、クソみたいなサーキュレーションサイトばかり出てくる。この時ほどサーキュレーションサイトを憎く思ったときはない。どんどん顎周りの筋肉が痛くなるし、このままだと飲み物も飲めないし、今日日曜日だから歯医者に飛び込んで治してもらうこともできないし、かなり焦る。下あごをつかんでやる方法は痛いし、全然コツが掴めないので無理だった。結局いつものやり方を何回もやったら治った。本当に安心した。

 

ちなみに顎が外れたときの対処法って知ってます? 最初顎が外れたとき、無理矢理閉じれば治ると思っていたけど、治らないし悪化させるだけで危険だから止めたほうがいいよ。

みんないつ顎が外れるか分からないし、周りの人の顎が外れるかもしれない。出先で隣人の顎が急に外れたらそれはそれで面白いけど。外れた本人は面白いどころじゃないし、というか喋れないし。初めて外れたときorすぐに戻らないときマジで焦るので対処法覚えていたほうがいいと思う。

https://www.mihashi-kyousei.net/agogahazuretara.html

自分か他人が下あごを掴んで戻す方法(下画像)が主流なんだけど、これはコツを掴まないと何回もやらないと無理だと思う。なにより痛いし、当然自分か他人の指が唾液まみれになるので家族でもない限り無理。上のやり方がオススメ。

https://minacolor.com/blogs/articles/2177

 

RUSTメモ

  • パニックハンドラ
    • 配列の要素外にアクセス、所謂バッファオーバーフロー
    • Result型Errのunwrap()呼び出し
    • Option型Noneのunwrap()呼び出し
    • assert!()マクロ失敗
    • unreachable!()マクロ実行
    • 地味で難しく楽しくないけど大事だから困る
  • パニックハンドラの書き方→#[panic_handler]アトリビュートを付与した関数を作成する
    • fn FooPanic ( foo: &PanicInfo) -> !{ というシグネチャじゃないとダメ。fooにパニックが発生したソースコード位置や原因情報が格納されている
  • パニックハンドラでUART経由でエラー情報を発信したい場合、main関数とパニックハンドラでUARTドライバオブジェクトが競合する。UARTドライバオブジェクト1つしかないので、C/C++だったら普通にグローバルだったり、シングルトンで管理するけど、RUSTには所有権システムがあるので面倒。
    • どうするかというと、グローバル変数を利用してドライバを共有する。グローバル変数へのアクセスは危険なので、unsafeでくくるしかない。まあ組込み系だとそうするのが楽よね。
    • パニックハンドラでUARTオブジェクトを所有権ムーブすると、パニックハンドラのスコープを抜けたあとのUARTオブジェクトは使えなくなるので、参照渡しすることで防ぐ。
    • 安全にunsafeを使用せずにペリフェラルドライバを共有する方法もある。Mutex(排他制御)とRefCell(内部可変性)を使うらしい
      • UARTを使用する際に割り込み禁止状態にしないといけない。それの良否はともかく、処理速度辺りは大丈夫なんかね。
  • タイマー
    • WioTerminalのタイマペリフェラルには、SysTick,TC,RTC,WDTが搭載されている。RTC,WDTは馴染み深いけど前2つがよく分からない。本書では前2つを取り扱うらしいので丁度良い。
    • タイマ仕組みは、パルス入力ごとにインクリメント、デクリメントされるカウンタを持ち、待つ時間(サイクル数)を比較レジスタに設定すると、カウンタが比較レジスタの値と一致するかどうかをハードウェアが自動的かつ継続的に比較してくれる。一致すると、特定レジスタのフラグがセットされる。
    • Systickは、ARN Cortex-Mプロセッサに良く搭載されているタイマ。CPUクロックでデクリメントする24ビットするタイマ。カウント0になるとCOUNTフラグがセットされる。
    • ジーウェイト方式。タイマが指定時間に達したかどうかをループで問い合わせる。CPUを占有するので待ち時間が短時間の場合のみ使用
    • TC(Timer Counter)は,Systickよりも高機能なタイマ。PWM出力やタイムスタンプ付きの入力キャプチャとして利用可能らしい。全然ピンとこない。パルス入力を基準にしてカウンタをインクリメントする。カウンタがターゲット値を超えると割り込みが通知される
  • 割り込み
    • 割り込みを用いるには、割り込みハンドラを登録して割り込みを有効化する。ペリフェラルドライバと同様にリソースを共有する必要がある。割り込みを検出されるように設定するのと、割り込みが通知されるように設定する。割り込みの優先度設定も行う。
    • 割り込みはデフォルトでマスクされているので、有効化する必要がある。ARM  Cortex-Mを採用しているマイコンではNVIC(Nested Vectored Interrupt Controller)を使って割り込みを有効化する。ハードウェアに直接触るためunsafe codeになる。
  • ブザー
    • ブザーの音の高さは周波数を制御する。周波数制御は面倒なので、PWMを用いる。
    • PWM(Pulse Width Modulation)は周期的なhigh/lowの波形を自動的に出力する機能。WioTerminalではTCとTCCでPWM機能が提供されている。
    • PWMで大事な概念は、周期とデューティー比。
      • 周期は、high/lowを繰り返す間隔。
      • デューティー比は、周期に対するパルス幅(highにしている状態)の比率
    • TCC(Timer Counter for Control Applications)は、制御アプリ用のタイマカウンタ。TCよりも複雑な波形出力機能を持つ。8つのチャネルを持っている。指定したピンにPWMを出力するのに正しいチャネルを指定する必要がある。
  • I2C通信
    • I2C(Inter-Integrated Circuit)は、マルチマスタ、マルチスレーブ型の通信プロトコル。クロック同期式シリアル通信。2本で複数デバイスを制御できるのが利点。ノイズには弱い。
    • マスタはスレーブアドレス(7bit,10bit)を指定して通信する。
    • 通信開始すると、通信終了するまで他のスレーブとは通信できない
    • 通信開始する際に、マスタがデータを送信するか受信するかを一緒に送信する
    • 書き込みをはじめたあとに読み込みをしたい場合は、再度スレーブアドレスを送信しなければならないが、通信終了してから通信開始するまでに、他のマスタスレーブが通信開始する可能性がある。そのため、STOPを送らずにSTARTから送信することで、連続して通信を継続できるようにする。これをrepeated start conditionというらしい。
  • LCD表示
    • embedded-graphics:組み込み用描画クレート
      • グラフィックをバッファなしに描画できる
      • no_stdで動作する(OSなしで動作する)
      • 動的メモリ確保なしで動作する
      • 大きなメモリをあらかじめ確保しなくてよい
    • SPI通信で制御するLCDは多い。また、SPI+データ/コマンド制御線(D/C)を加えた通信インターフェイスも多く存在する。D/Cはマスタが送信している情報がデータなのかコマンドなのか判定するための信号線。D/Cがlowの場合、転送内容はコマンドとして解釈。D/Cがhighの場合、転送内容はデータとして解釈。
    • LCDには、描画にはスレーブからの出力が必要ないので、使用ピン数を削減するためにMISOを接続しないという設計もあるらしい。

サンプルアプリケーションも試してみた

ストップウォッチ

 

分かりにくいけどスペクトルアナライザ

 

本読んだ

基礎から学ぶ 組込みRust

基礎から学ぶ 組込みRust

Amazon

ということで読み終わった。プログラミングは学習用環境でひたすらCUIの結果見るより、動くアプリ作ったりとか実物を動かしてなんぼなところがあるので、それの手助けになってよかった。今後どうしようね。WioTerminalでなんでもいいから1つアプリ作りつつ、RUSTについて学んでけばいいかな。次のRUSTの本は何が良いんでしょか。ラズパイpicoも弄りたいとこだし、やりたいこと多いな。

 

WioTerminalで今のところできること

通信:UART,I2C,SPI

使える機能:タイマ、割り込み

使えるデバイス:LED、LCD、ブザー、マイクロフォン、加速度センサ、光センサ、加速度センサ、ボタン3種、5方向スイッチ

なにしようね。CO2・温湿度センサを付けて、パルスオキシメーターにするのが無難だけど。センサが高くてWioTerminalをもう1個買えちゃうんだよな。LCDと5方向スイッチが揃っているから使いたいところだけど、すげえ簡単なゲームとか?Groveポート2個ついているからそこら辺のセンサをつけてもいいし。アイディアがあればいいんですけどね。