2014年7月15日火曜日

STM32CubeのUSBハンドラの中でosMessagePut()したら固まった

 Lチカできるようになったので、色気を出してOSのメッセージキューに手を出して見た。受信データの有無を知るために、グローバル変数のバッファデータ長をポーリングするのをやめて、USBの受信ハンドラの中でバッファ構造体をメッセージキュー経由で渡すことにした。んでもって、100%フリーズするバグの出来上がり。
 デバッガで追って見ると、優先度をチェックするconfigASSERT()でFAILして、無限ループの刑を受けているらしいことがわかった。ぐぐってみたら、ハンドラの中でFreeRTOSのシステムコールを呼ぶには、USBハンドラの優先度を下げないといけないらしい。
 ソースはココ→ マイコン徹底入門 割込み優先度の設定
STM32CubeMXのNVIC設定でUSBの優先度を下げて(priorityの数字を増やして)、一件落着。


0 件のコメント:

コメントを投稿