質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

Clang

Clangは、プログラミング言語 C、C++、Objective-C、Objective-C++ 向けのコンパイラである。

mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

2回答

2738閲覧

Mbed Studio上でFPUについてのコンパイルエラーが表示される。

Katy7

総合スコア20

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

Clang

Clangは、プログラミング言語 C、C++、Objective-C、Objective-C++ 向けのコンパイラである。

mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2021/12/09 11:51

解決できないエラー

In included file: "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" clang(pp_hash_error)[21][10]

環境

Mbed Studioを用いて、Mbed LPC1768へサンプルプログラム(mbed-os-example-blinky)のビルド時に発生
###詳細
ビルド自体は問題なく終了しているらしく、マイコンに書き込むとサンプルの挙動をしてくれます。しかしmain文中の#include"mbed.h"にカーソルをかざすと、赤くエラーがでるようになります。(ビルドのときもproblemに表示される)赤くエラーが出ているのにビルドが成功している理由はわからないです。

英語を直訳すると、「FPUが乗っていないデバイスにFPU命令が生成されているよ」でした。FPUがわからなかったため調べてみると、浮動小数点型の処理装置ということでした。clangというコンパイラがエラーを返しているようです。

LPC1768について調べてみると、ArmのCortex-M3が搭載されていると書いてあったので、Mbed Studio上でCortex-M3について検索してみると、mbed_toolchain.pyというファイルにCortexについての情報が記載されていました。その中でちょうど__FPU_PRESENTというフラグが管理されているらしかったので、Cortex-M3についての項目を見てみると、__FPU_PRESENTというフラグはきちんと立てられていませんでした。
逆にフラグを立ててみたらどうだと思い、適当に"__FPU_PRESENT=1"という文をCORETEX_SYMBOLS中の"Cortex-M3"の中に書いてみても全く同じエラーとなり、何も変わっていませんでした(多分実際はフラグとかではない気がします)。

教えてほしいこと

エラーの起きている詳しい原因と具体的な解決方法を教えていただけないでしょうか。
また、今までLPC1768でfloat型などを扱ったことがあるのですが、なぜFPUがのっていないのに処理ができていたのだろうかという疑問が生じました。FPUと浮動小数点型の処理についていまいちよくわかっていないのだと思います。
これについて、参考となる簡単なサイトや解説をいただけるとありがたいです。
どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Mbed studioは入れていないのでわかりませんが、どこかにFPUを使うON/OFFのチェックボックスとかありませんか? あるいは、コンパイルオプションに-msoft-floatあるいは-mfloat-abi=softが入っていないあるいは、-mfloat-abi=softfpまたは-mfloat-abi=hardが追加されているとか。


どうせ入れようと思ってはいたのでこの機にMbed Studioを入れて少しだけ追ってみました。

"Compiler generates"でプロジェクト内検索をかけると結構ヒットしますが、嗅覚で(笑)
サンプルプロジェクトのディレクトリ以下mbed-os/cmsis/CMSIS_5/CMSIS/TARGET_CORTEX_M/Include/core_cm3.h
を覗いてみました。

C

1#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) 2 #if defined __ARM_FP 3 #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" 4 #endif

ここのメッセージを"ModA Compiler generate <以下略>"と変えてみると、
main.cppで#include "mbed.h"にホバーで出るメッセージも"ModA ..."になることから、ここがエラー表示の源だということがわかります。

しかし、ここがコンパイル時にはエラーにならないことから、コンパイラに対しては何らかのルートで(多分)適切にマクロが設定されるものと考えられます。

つまり、質問の件は「IDEのマクロ解析が不完全で、IDE上でのみ出るエラー"もどき"」である、と結論付けてよさそうに思います。


以下実験。

main.cppに以下を付け加えると

C

1 #ifdef AAA 2 #error "AAA" 3 #else 4 #error "BBB" 5 #endif

#error "BBB"のところに赤波線が引かれます(これは期待通り)
ここで、サンプルプロジェクトのディレクトリ以下mbed-os/tools/profiles/develop.jsonをコピーしてユーザーカスタムのBuild Profileとして、ARMC6のオプションに"-DAAA"を付け加えたとき、
IDE上では相変わらず#error "BBB"に赤線ですが、コンパイル時のエラーは"AAA"の方になります。
つまり、Build Profile中でコンパイルオプションとして与えられるマクロの反映はできていない、ということのようです。

(しかし、OS全部をプロジェクトにコピー指定するとLチカだけでプロジェクトが1GB超ってのはちょっとなぁ)

投稿2021/12/09 14:58

編集2021/12/11 00:10
thkana

総合スコア7610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Katy7

2021/12/10 06:46

ご回答いただき、ありがとうございます。 とりあえず一通り試してみました。 Mbed StudioにFPUにチェックボックスがないか、上部のバーからpropertyという項目がないか探してみたのですが、見つかりませんでした。Mbed Studioについてあまりなれていないため、そこで探すのを打ち切りました。 次に-msoft-floatと-mfloat-abiについて、検索欄から検索を行いました。 -msoft-floatという項目についてはひっかかりませんでしたが、-mfloat-abiについてはいくつかヒットしました。 Cortex-A.cmakeといったファイルに-mfloat-abi=softfpというような記述がちらほら見られたため、期待しました。しかし、Cortex-M33.cmakeというファイルは存在するのですが、LPC1768に搭載されているCortex-M3.cmakeというファイルが存在しなかったため、何もすることができませんでした。 正直なところコンパイラまわりの知識や、ファイルの関係性(cmakeやjsonファイルなど)がまだ足りておらず、これ以上自分で考えてできることがなさそうです。 他の回答者様がおっしゃったところによると、ビルド自体には影響がないということだったので、とりあえず放置しようかなと思っています。
thkana

2021/12/10 13:45

> とりあえず放置しようかなと思っています プログラム中でfloatを使おうとさえしなければ問題ないかも知れませんね。
Katy7

2021/12/13 07:30

返信が遅れてしまい、申し訳ないです。 検証まで行っていただき、本当にありがとうございます。 結局IDE上のマクロ解析のちょっとした問題なんですね。 実験の内容を理解するために、 https://qiita.com/koara-local/items/948f9371b04b092785d1 こちらの記事を参考にさせていただきました。 "-DAAA"という適当なマクロがオプションとして設定されているのに、 IDE上のリアルタイム認識(といっていいのでしょうか)では認識されず、 コンパイラのプリプロセスの過程でやっと認識されるという解釈であっていますでしょうか?
thkana

2021/12/13 13:30

> コンパイラのプリプロセスの過程でやっと認識される 「やっと」という表現がちょっと引っかかりますけれど...IDEの解析機能の方が勝手にやっているおまけに過ぎず、あくまで「コンパイル」が本番ですから。 で、一応確認したいのですが、y_waiwaiさんの回答の方があなたにとって「ベストアンサー」なのですか?
Katy7

2021/12/13 16:11

詳しく教えていただき、本当にありがとうございます。 申し訳ございません。検証までしていただいたのに、公平性に欠けていました。 一旦、ベストアンサーに選ばせていただいたy_waiwaiさんには大変申し訳ございません。 ベストアンサーはthkanaさんの解答に変更させていただきたいと思います。
guest

0

コンパイルエラーとは、ビルド中に出るエラーで、ビルドが継続できないレベルのエラーのことを言います。

あなたの言ってるのは、ビルド以前の、開発環境上でだされている構文チェックでのエラーなので、コンパイルエラーとはちと違います。
まあ、ビルドは正常にできてるようなので、そのエラーってのはせいぜいワーニングレベルなんでしょう。

で、普通は浮動小数点演算はプログラム上で実装してるもんで、それ用のライブラリがコンパイラについてます。
んで、ちょっと高級なCPUでは、オプションでFPU(浮動小数点演算ユニット)が搭載されてまして、プログラムで実行するような遅い演算をしなくて済むようになっています
で、そのどっちを使うか、ってのは、コードの起動時にFPUが搭載されてるかどうかで判断して、そこらへんよろしくやってくれるようになってますんで、搭載されてないCPUでも正常に実行できるようになっています

投稿2021/12/09 12:27

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Katy7

2021/12/09 12:45

ご回答いただき、本当にありがとうございます。 エラーの内容も、FPUについてもわかりやすく説明していただいたので、 納得できるような理解ができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問