teruノート

ROSでロボットとか。Ubuntuで困ったこととか。

Qtでcorecrt.hが見つからないと言われる問題

Qtで適当なプロジェクトを作成し、ビルドしたところ

エラー: C1083: include ファイルを開けません。'corecrt.h':No such file or directory

と言われてしまいました。まずインクルードパスを追加します。.proファイルにこれを追加します。

INCLUDEPATH += "C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt"


ファイルにたどり着くことはできているみたいですが、エラーは収まりません。

普通に実体のファイル"corecrt.h"はあるんですけどね…


調査を続けると、ひとつの解決策が見つかりました。ソースはここです。

[QTBUG-50191] New Qt Quick application does not build with VS2015 (cannot include corecrt.h) - Qt Bug Tracker

このフォーラムに投稿したPhilipp Münzel氏によると、
"Re-run the VS2015 installer, click "Modify" and then choose to install "Universal Windows App Development Tools", which is found under "Windows and Web Development" and click update. This installs the Windows 10 SDK and fixes the problem."
だそうです。

Visual studio 2015のコンポーネントが足りないみたいなので、「ユニバーサルWindowsアプリ開発ツール」をインストールします。

f:id:ub2_memo:20160730000930p:plain

インストーラを起動し、こいつにチェックをいれて、更新ボタンをクリックします。

インストール後、再起動。これでビルドが通るようになりました。

Qt環境構築

GUIを使ったソフトウエアを作る必要があったので、Qt(キュートと読みます)というフレームワークを導入しようと思います。

クロスプラットフォームなので、WindowsでもUbuntuでも同じ環境で開発できるようです。

今回はWindowsでやってみます。



Qtをこちらからダウンロード、インストールします。

Qt | Download Open Source Step 3

コンパイラは種類が選べるようですが、もともとVisual studio 2015を入れていたのでこれを使います。

Visual studioは、入れただけで全然使ってませんでした。これが躓く原因となりました…

Qtのため新規にVisual studioを入れた人も同じ道を通ると思います。

Visual studio 2015では、C++コンパイラが追加インストールという形になっています。最初に、適当なC++のプロジェクトを作るなりしてC++コンパイラをインストールする必要があります。


これをしてないと、ビルドに失敗して、
「ビルドする為にコンパイラの設定が必要です。」と言われてしまいます。



さらに、デバッガもインストールが必要です。

こちらからDebugging Tools for Windowsをダウンロードしインストールします。

WDK と WinDbg のダウンロード - Windows ハードウェア デベロッパー センター


コンパイラやデバッガは、Qtのほうで基本的に自動認識してくれます。


これでGUI開発環境を整備できました。

FreeRTOSをSTM32F4にポーティングする

リアルタイムOSであるFreeRTOSをSTM32F429i-discoにポーティングします。ポーティングは移植の意味で、FreeRTOSのファイルにも"port"を見かけますがこれはIOポートではなく移植のポートです。


PICで有名な後閑さんのページに詳しい説明があります。

http://www.picfun.com/RTOS/FreeRTOSframe.html



ポーティングに必要なマイコン依存のコードもFreeRTOSライブラリにサンプルとして含まれているのですが、そいつと自分のコードをくっつける際に詰まったところを書いておきます。

1.
FreeRTOSConfig.hの最下部にこんな定義があって、割り込みハンドラをFreeRTOSの内部関数にすりかえちゃってます。(ちょっと表現おかしいかも)

#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

ただ、SysTick_Handlerはよく1msのタイマとしてdelay関数などで使っている場合があります。その場合はこんな風に割り込み関数内でFreeRTOSのハンドラを呼び出したいですね。

void SysTick_Handler(void)
{
  xPortSysTickHandler();
  //別の処理
}

そしてその勢いでSVC_Handler,PendSV_Handlerもこの形にすると、HardFaultします。SVC_Handler,PendSV_HandlerはFreeRTOSConfig.hの#defineによる置き換えのままにしておいたほうがいいみたいです。

2.
それと、コンパイル時のFPU設定はhardまたはsoftfpにする必要があります。

3.
もうひとつ、SysTick_Configの前に割り込みコントローラの設定が必要です。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);


FreeRTOSをSTM32F4に移植する際に躓いたベスト3でした。