Mbed Online Compilerの終了にともないKeil Stuido Cloudへ移る以外に、イクスポートしてローカルにビルドする方法もあるぜ、ということでMake-GCC-ARMへのイクスポートを試みてます。前回はMbed OS6のプロジェクトのビルドに成功。今回は古いMbed OS2の場合です。脳筋力業。
※「モダンOSのお砂場」投稿順Indexはこちら
Mbed OS2のプロジェクトをイクスポートしたときの問題
Mbed Online Compiler上のMbed OS2のプロジェクトをイクスポートした場合に直面したエラーは以下のようなものです。以下は Windows上のMingw64環境でのエラーですが、WSL2上のUbuntuでも同様なエラーでした。
上記は細かくて見えずらいですが、なんやら __warp__チョメチョメなる関数が見当たらないと文句を言われて落ちてます。
なお、イクスポートしようとしているプログラムは簡単。以下のようです。ユーザボタンで割り込みかけて、割り込みボタンが押されている間だけLチカの点滅周期を早めるという「チョイ悪」Lチカです。
#include "mbed.h" InterruptIn button(USER_BUTTON); DigitalOut led(LED1); double delay = 0.5; // 500 ms void pressed() { delay = 0.1; // 100 ms } void released() { delay = 0.5; // 500 ms } int main() { // Assign functions to button button.fall(&pressed); button.rise(&released); while (1) { led = !led; wait(delay); } }
直接で __wrap_チョメチョメなど呼んでいないので、ご無体ないわれようなのですが、どうもデバッグとか中の人の御都合リンクされてるものみたいです。
前回 OS6のプロジェクトをMake-GCC-ARMにイクスポートしたときとは明らかに違う現象であります。しかし前回同様、ビルドの過程のどこかコマケー話がうまくつながってない感じがいたします。
昔からある「ツールの」バグ?
まずは、御本家 Mbed 関係で検索してみるとそれらしき投稿がありました。以下の件です。読めば当方が直面している問題とクリソツ。
mbed_blinky fails to build on gcc — undefined references to __wrap__*
上記を読むと、Mbed OSそのもののバグではなく、どうもOnline Compilerの問題のようです。以下一文引用。
This is a “workflow bug” in our online tooling.
上記は、すでに5,6年前の記事で、そのうち直すみたいな調子よいことが書かれていたのですが、修正されてない気がします。前回のOS6のときの問題も同様だったような。そのうち直すといって直ってないやつ。今回Online Compilerそのものが使えなくなるので、闇の中に消えていくやつでしょうかね。
さらにもう一文を引用させていただきます。また末尾の部分は当方の勝手な意訳?です。
As a workaround, you are free to remove the 「問題でてるwarpな奴らのリンカオプション」
ワークアラウンドというとカッコイイ感じもしますが、暫定対策です。とりあえず問題出ているリンカオプションは取り除いても問題ないみたいなので、前回同様の脳筋力業。バッサリ切ると。ツールが生成したMakefileを手作業で修正してしまいます。
修正箇所は以下の通り。まず PREPROC の中の以下のリンカオプションを削除
-Wl,--wrap,vsprintf -Wl,--wrap,vsnprintf -Wl,--wrap,fprintf -Wl,--wrap,vfprintf
そして、LD_FLAGSの中の以下も削除。
--wrap,vsprintf -Wl,--wrap,vsnprintf
これがなにを意味するのか、妄想しながらも理解してないっす。
ビルドは成功、実機動作もOK
さて、Makefileに上記の修正を施した上で、以下条件にてビルド成功いたしました。
-
- Windows11
- arm-none-eabi-gcc「クロス」ツールチェーンはArm社のサイトからダウンロードした古いバージョン、6-1017-q2-update、6.3.1
- makeなどのビルドツールは mingw64 上のもの
ビルド成功のときの様子が以下に。素っ気ないな。
生成された hex ファイルを Nucleo-F401REボードに書き込んで動作させてみたところが冒頭のアイキャッチ画像に。青のUSERボタンを押している間だけ、LEDの点滅周期が早くなりました。OS2のビルドもOKだね。