FreeRTOSではたしかv9.0.0からだったと記憶していますが、RTOS資源をメモリ上に静的に割り当てることが可能になっています。従来からと同じようにヒープ領域上に動的に割り当てることもできますので、ユーザは必要に応じて、動的割り当てと静的割り当てを使い分けることができます。STM32Cubeを使っていると、FreeRTOS APIをCMSIS RTOS API v1(もどき)でラップしたインタフェース(cmsis_os.h>が提供されており、STM32CubeMX上でも動的割り当てと静的割り当てを使い分けることが可能です。
STM32CubeMXにおける、実際の割り当ての方法をSemaphoreを例に見てみると...
まず、Config parametersにおいて、メモリ割り当て方法を指定します。Dynamic/Staticを指定すれば、どちらも使うことができます。
割り当て方法としてDynamic/Staticが指定されていれば、Semaphoreを用意する際に、割り当て方法としてどちらを使うかを選択することができます。
Semaphoreの作成の仕方が異なるだけで、使い方は同じosSmaphoreWait/osSemaphoreReleaseで操作できるので、動的割り当てを使っていた従来のコードは容易に静的割り当てに変更することができます。というか、できるハズだったんです。
ところが、実際には静的割り当てに変えた途端に、それまで動いていたコードが動かなくなりました。なんだか初っ端から動かない。どうやらセマフォの初期値がおかしいらしい。上記の例で動的に割り当てたセマフォ(myBinarySem01)と静的に割り当てたセマフォ(myBinarySem02)の値を、生成直後に調べてみると。。
動的に生成した場合の初期値は1なのに、静的に生成した場合の初期値はゼロになってしまっています。CMSIS RTOSv1のAPI定義としては、1になるべきところです。
と、言うわけで相変わらず STM32CubeのCMIS_OS APIは油断できません。見事に地雷を踏んでしまいました。
STM32CubeMXにおける、実際の割り当ての方法をSemaphoreを例に見てみると...
まず、Config parametersにおいて、メモリ割り当て方法を指定します。Dynamic/Staticを指定すれば、どちらも使うことができます。
割り当て方法としてDynamic/Staticが指定されていれば、Semaphoreを用意する際に、割り当て方法としてどちらを使うかを選択することができます。
Semaphoreの作成の仕方が異なるだけで、使い方は同じosSmaphoreWait/osSemaphoreReleaseで操作できるので、動的割り当てを使っていた従来のコードは容易に静的割り当てに変更することができます。というか、できるハズだったんです。
ところが、実際には静的割り当てに変えた途端に、それまで動いていたコードが動かなくなりました。なんだか初っ端から動かない。どうやらセマフォの初期値がおかしいらしい。上記の例で動的に割り当てたセマフォ(myBinarySem01)と静的に割り当てたセマフォ(myBinarySem02)の値を、生成直後に調べてみると。。
動的に生成した場合の初期値は1なのに、静的に生成した場合の初期値はゼロになってしまっています。CMSIS RTOSv1のAPI定義としては、1になるべきところです。
と、言うわけで相変わらず STM32CubeのCMIS_OS APIは油断できません。見事に地雷を踏んでしまいました。