2017年11月9日木曜日

メモ

 FreeRTOSのコルーチン。日本語ドキュメントだと「FreeRTOSではコルーチンを使用できます」くらいしか書いて無くて、どうやって使うのかが謎い。公式のページが一番わかりやすい。
 Example code creating scheduling and using RTOS co-routines
 Quick Co-routine Exampleの通り、簡単にわかる。

 FreeRTOSのコルーチンはRTOSによるスタックの割当は行われず、FreeRTOS外のスタック領域を使うらしい。またQueueとかも使えない気がする(詳細未確認)。デバッグメッセージをprintfからQueue経由でUARTに出そうとしたらハングアップした。

 基本的に、OSで管理するほどではないけど、ISRとかに書くには大きい、位の低レイヤ処理をターゲットにしてそう。サンプルだとLチカとかやってる。とはいえ、Lチカするにしたってその指令を出すのはタスクなわけで、じゃぁその間の橋渡しはどうやるんだ、という問題が有る。グローバル変数とか?

 今回はRTCの校正をコルーチンで行おう、と思っていた。処理自体はISRでもできないことはないくらいに小さいコードだけど、printfデバッグとかしたいので。ということで、printfが使えない?コルーチンも不可ということに。

***

 STM32F4RTCは、SSRの分解能を優先すると、キャリブレーションが面倒な感じになるっぽい。F4RTCはDIV_AとDIV_Sの2本のプリスケーラの積で1Hzを作るが、DIV_Aを小さくしてDIV_Sを大きくするとSSRの分解能が向上する。ただしDIV_Aが3未満の場合は正の方向にキャリブレーションできないらしい。
 対策として、わざとDIV_Sを外した値にして、キャリブレーションで負のレンジの真ん中に設定しておく、という感じにするらしい。キャリブレーションは9bitのレジスタと1bitの符号で10bit分の分解能があるが、DIV_S<3の場合は9bitの分解能しか得られない。
 ま、今試してるボードでは5bit+Signで足りてるので、9bitでも十分なのだけど。

***

 かなり面倒なことになってきてる。ステッピングモータで遊びたいだけだったのに、どうしてこうなった。

0 件のコメント:

コメントを投稿