ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

AtollicTrueStudioのC++コンバート機能を使ってSTM32 CubeMX生成プロジェクトをC++で開発

経緯

ここ最近外部I2Cデバイスのドライバやらを書いていたのだがオブジェクトな書き方をCでやろうとするとポインタ型の代入が大量に発生するのでややこしいしめんどい
C++ならメンバ関数が使えるのでインスタンスを生成すればIDEの補完機能でPrefixから呼べる。そうこれがしたい。(画像は気にしないでくれ

f:id:gsmcustomeffects:20170824002502p:plain

あとドライバ初期化の段階でI2Cとかのハンドルを投げるのも容易にできるのでArduino的な書き方にできるのではないかと考えた。

というわけで今回はコンバート機能の紹介とやり方について書いていこうと思う。

プロジェクトのコンバート

CubeMXでのプロジェクトを読み込んでプロジェクトで右クリをするそうするとこういう画面が出る。
そこで以下のようにConvert to C/C++をクリック

f:id:gsmcustomeffects:20170824003248p:plain

そのあとこのウインドウが出るので各自設定をしてConvert

f:id:gsmcustomeffects:20170824003358p:plain

設定などなど

次に.cppにリネーム

f:id:gsmcustomeffects:20170824003706p:plain

このままコンパイルするとエラーだらけになるので次はコンパイル設定をいじっていく

PATH設定

f:id:gsmcustomeffects:20170824004041p:plain

プロジェクトプロパティを開いてPATH設定の部分を開く

f:id:gsmcustomeffects:20170824004529p:plain

そこで以下のようにGNUCからC++にコピーする。

f:id:gsmcustomeffects:20170824004616p:plain

終ったら適応を押して閉じる。

シンボルの設定

こちらもプロジェクト固有設定なのでいじっていく

プロパティを開いてC/C++Build/Setting/Tool Setting/C CompilerのSymbolsを開く

以下のようにシンボル情報をコピーする。

f:id:gsmcustomeffects:20170824005126p:plain

f:id:gsmcustomeffects:20170824005225p:plain

コンパイル

この時一度Clean Projectをしないとリンク情報が残ったままなのでここでCleanして一からビルドする。

そうするとちゃんとg++コマンドでビルドされてる。

f:id:gsmcustomeffects:20170824005414p:plain

CとC++の複合環境がこれで整ったわけだがCubeで吐きだし直すとMain.cが新しく作られてしまうのでMain以外のファイルをcppで作ったほうがいいと思う。
CからC++を呼び出す方法ないしそれの逆はarm本家が説明してくれてる。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471gj/Babjggdd.html
f:id:gsmcustomeffects:20170824010013p:plain

ちなみにCubeの生成するヘッダーファイルはC++のこと意識して#ifdef __cplusplusのマクロでくくってくれているのでC++コンパイルした時にその対応がされるようになっている。
extern "C"修飾子がエラー回避をしているとのことなので自分でC++ファイル作ったりしてやる場合はhppを工夫して作るなどしたほうがよさそう。
※__cplusplusはC++コンパイルされると定義されるマクロである。



ちなみにその辺は複数のサイトでコメントされているので他を読むといいだろう。

僕はここ参考にした
qiita.com

余談

ちなみにこういうtweetを見かけたのでこれについても

これについてはC++ 11を使用してコンパイルすればいいのでC/C++Build/Setting/Tool Setting/C++ Compiler/GeneralからC++ 14かC++ 11を選べばいいと思う。
そうするとこの通りコンパイルが通る。

f:id:gsmcustomeffects:20170824011139p:plain

ちなみにC++14はコミュニティ機能らしいのでC++11にしておこう

f:id:gsmcustomeffects:20170825032108p:plain

余談その二

C++のデバッグ設定も変えておかないとC++でのブレークが張れません
None以外のどれかにすることで解決できます。

※尚設定によってはGDBが落ちます。この件に関しては今んとこよくわかってないですが現状動くようになったので放置してます。