どうもです。
STM32F7の紹介をだいぶ前に行いましたが、開発を続ける上で一つだけ引っかかっている部分がありました。
現在、OBD2機器の開発を遊びで行っているのですが、リアルタイムOSを組み込むと意図としない動作が起こってしまう事でした。
プログラムを実行して、大体30分~2時間くらいでハングアップしてしまうのです!(涙)。

全然原因が分からないので、しばらく放置しておりました・・・w

で、最近やっとどうにかなったのでここに書き出しておきます。

まず、STM提供のHALドライバを使うと一緒にFreeRTOSが付いてきます。(STM32F7は、強制的にHALドライバの使用が勧められています)
ちなみにFreeRTOSは、組み込み系で使えるフリーウェアのリアルタイムOSです。
 ※詳しくは→http://www.freertos.org/

今までもSTM32F4などで、FreeRTOSは使っていたので、それと同じだろう!とプログラム記述していました。

が、、、、それが悪かったようです。orz


最近、STM提供のサンプルプログラムを眺めていたらFreeRTOSを呼び出す関数が違う!?
そう、HALドライバで使用するには、使い方が違ったのです!(;´Д`)

まず、通常であればヘッダーを以下の様にリンクします。
 #include "FreeRTOS.h"
 #include "task.h"
 #include "queue.h"
 #include "portmacro.h"

ですが、HALからは次の様にリンクします。

 #include "cmsis_os.h"
1ファイルのみです。(内部では通常のヘッダーをリンクしていますが・・・)

もう、ここからして怪しさ爆発です!

例としてタスクを生成する関数ですが、、、通常のFreeRTOSでは次の通り・・・。
 xTaskCreate(prvTaskLCD,   (signed portCHAR *)"LCD",   0x400, NULL, 1, NULL);
 xTaskCreate(prvTaskSensor,(signed portCHAR *)"SENSOR",0x200, NULL, 1, NULL);
 xTaskCreate(prvTaskKLINE, (signed portCHAR *)"KLINE", 0x400, NULL, 1, NULL);
 vTaskStartScheduler();

HALからは、次の通り・・・。
 osThreadDef(taskLCD, prvTaskLCD, osPriorityNormal, 0, 0x400);
 taskHandleLCD = osThreadCreate(osThread(taskLCD), NULL);
 osThreadDef(taskSensor, prvTaskSensor, osPriorityNormal, 0, 0x200);
 taskHandleSensor = osThreadCreate(osThread(taskSensor), NULL);
 osThreadDef(taskKLINE, prvTaskKLINE, osPriorityHigh, 0, 0x400);
 taskHandleKLINE = osThreadCreate(osThread(taskKLINE), NULL);
 osKernelStart();

もうねぇ、関数が全然違いますがな・・・。(´・ω・`)

でもこれらHAL側の関数は、マクロになっていて最終的には、FreeRTOSの関数が呼ばれます。
これで今までと同じようにプログラム記述してても動作しちゃって居た訳・・・(汗)。

そんで、最終的にはFreeRTOSの関数が呼ばれても実際には、なにやら色々とHALドライバの方では制御しとるのですよ。
詳しく書くと長くなりすぎるので割愛しますが、FreeRTOSと言っても似て非なるものです。
(大雑把に言うとタイマーの制御に小細工を入れている感じデス)

これだったらHALドライバの解説でFreeRTOSって書かないでほしい!
せめて互換品と書いといてくれ~~~~

ちゅう事で、関数を全てHALドライバのFreeRTOSに置き換えて実行すると5時間以上連続始動させても無事動作するようになりました♪
これで、次のステップに進めます!(;´∀`)

なお、HALドライバのFreeRTOSについてはリファイレンスマニュアルが無い?(見つからなかった)ので、ヘッダーファイル cmsis_os.h から代替え関数を突きとめてプログラムを修正した次第です。辛かった・・・w

それにしてもHALドライバよ、オメ~はいらない子だ!
STMも通常の(今まで通りの)ドライバーを提供してくれ~~~~~~~~!!!!!!!!!!!!!!

おしまい