最近仕事がらみでSTM32F2上でFreeRTOSを使い始めたのですが、それでハマったのでメモしておくことにします。
自分が使うものであればターゲットが何であれCortex-MであればCrossWorksとCTLで用が足りるのですが、仕事となるとそういうわけにもいかず、今回はSTMicroが提供しているSTMCubeF2を使うことになったのですが。。
STMCubeF2には、STMicroが提供するデバイスライブラリや、HAL, USBスタック等とともに、FreeRTOS, LwIP, FatFsも含まれています。自分でRTOS移植する必要もなく、できあいのサンプルをビルドすればTCP/IPまで動かせるようです。ソース一式をダウンロードして中身を見てみると FreeRTOSのパッケージにはCMSIS_RTOSのAPIが含まれています。Applicationとして提供されているFreeRTOSのサンプルプロジェクトもこのCMSIS_RTOSのAPIを使って書かれています。
FreeRTOSのAPIに慣れずともCMSIS_RTOSのAPIで書けばいいというのは便利だと思って、実際に使ってアプリを書き始めたのですが、これがちゃんと動いてくれません。osSemaphoreWaitでタイムアウトした場合の処理がおかしいので、ソースを確認してみてビックリ。APIで定義している関数の戻り値と実装とがぜんぜん違います。APIではタイムアウト発生時には0を返すことになっていますが、実際のコードではosErrorOS(0xff)を返し、トークンが取得できた時にosOK(0x00)を返すではありませんか。。
どうやら、「なんちゃってCMSIS-RTOS」だったみたいです。もっとも「CMSIS-RTOSで共通化できるかも」と期待するのが、幻想なのかもしれません。
自分が使うものであればターゲットが何であれCortex-MであればCrossWorksとCTLで用が足りるのですが、仕事となるとそういうわけにもいかず、今回はSTMicroが提供しているSTMCubeF2を使うことになったのですが。。
STMCubeF2には、STMicroが提供するデバイスライブラリや、HAL, USBスタック等とともに、FreeRTOS, LwIP, FatFsも含まれています。自分でRTOS移植する必要もなく、できあいのサンプルをビルドすればTCP/IPまで動かせるようです。ソース一式をダウンロードして中身を見てみると FreeRTOSのパッケージにはCMSIS_RTOSのAPIが含まれています。Applicationとして提供されているFreeRTOSのサンプルプロジェクトもこのCMSIS_RTOSのAPIを使って書かれています。
FreeRTOSのAPIに慣れずともCMSIS_RTOSのAPIで書けばいいというのは便利だと思って、実際に使ってアプリを書き始めたのですが、これがちゃんと動いてくれません。osSemaphoreWaitでタイムアウトした場合の処理がおかしいので、ソースを確認してみてビックリ。APIで定義している関数の戻り値と実装とがぜんぜん違います。APIではタイムアウト発生時には0を返すことになっていますが、実際のコードではosErrorOS(0xff)を返し、トークンが取得できた時にosOK(0x00)を返すではありませんか。。
どうやら、「なんちゃってCMSIS-RTOS」だったみたいです。もっとも「CMSIS-RTOSで共通化できるかも」と期待するのが、幻想なのかもしれません。