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 件のコメント:
コメントを投稿