4 years, 9 months ago.

mbed LPC1114のコードをLPCXpressoでBuildするとエラー

mbed LPC1114のLチカなどすべてのコードをLPCXpressoにExportしたものが、LPCXpressoではBuild時にエラーになってしまい、原因がわからず困っていますので、お力をお願いします。

LPCXpressoはLinux版でv7.7.2[Build 379]の最新のものをダウンロードしアクティベーションも行いました。 LPCXpressoのサンプルからLPC1114のCMSIS2-blikyなどをBuildしてエラーのないことを確認しました。

次にmbedのオンラインで作成したBlinkyをLPCXpresso用にExportしました。 この際、オンラインではコードを全くいじらずデフォルトのコードを使用し、mbedでコンパイルなど問題ないことを確認しました。念の為以下コードです。

LPC1114_Blinky_default

#include "mbed.h"

DigitalOut myled(LED1);

int main() {
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}

こちらをLPCXpressoにインポートしてBuildするとConsoleは以下のように出力されました。リンカのエラーでしょうか?

Quote:

Build of configuration Debug for project TestLPC1114

make -r all

Building file: ../main.cpp

Invoking: MCU C++ Compiler

arm-none-eabi-c++ -D_ _NEWLIB_ _ -D_ _CODE_RED -DCPP_USE_HEAP -DTARGET_LPC1114 -DTARGET_M0 -DTARGET_CORTEX_M -DTARGET_NXP -DTARGET_LPC11XX_11CXX -DTARGET_LPC11XX -DTOOLCHAIN_GCC_CR -DTOOLCHAIN_GCC -D_ _CORTEX_M0 -DARM_MATH_CM0 -DMBED_BUILD_TIMESTAMP=1429518052.72 -D_ _MBED_ _=1 -I"/home/takuya/LPCXpresso/workspace/TestLPC1114" -I"/home/takuya/LPCXpresso/workspace/TestLPC1114/mbed" -I"/home/takuya/LPCXpresso/workspace/TestLPC1114/mbed/TARGET_LPC1114" -I"/home/takuya/LPCXpresso/workspace/TestLPC1114/mbed/TARGET_LPC1114/TARGET_NXP" -I"/home/takuya/LPCXpresso/workspace/TestLPC1114/mbed/TARGET_LPC1114/TARGET_NXP/TARGET_LPC11XX_11CXX" -I"/home/takuya/LPCXpresso/workspace/TestLPC1114/mbed/TARGET_LPC1114/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11XX" -O0 -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -mcpu=cortex-m0 -mthumb -D_ _NEWLIB_ _ -MMD -MP -MF"main.d" -MT"main.o" -MT"main.d" -o "main.o" "../main.cpp"

Finished building: ../main.cpp

Building target: TestLPC1114.axf

Invoking: MCU C++ Linker

arm-none-eabi-c++ -nostdlib -L"/home/takuya/LPCXpresso/workspace/TestLPC1114" -L"/home/takuya/LPCXpresso/workspace/TestLPC1114/mbed" -L"/home/takuya/LPCXpresso/workspace/TestLPC1114/mbed/TARGET_LPC1114" -L"/home/takuya/LPCXpresso/workspace/TestLPC1114/mbed/TARGET_LPC1114/TARGET_NXP" -L"/home/takuya/LPCXpresso/workspace/TestLPC1114/mbed/TARGET_LPC1114/TARGET_NXP/TARGET_LPC11XX_11CXX" -L"/home/takuya/LPCXpresso/workspace/TestLPC1114/mbed/TARGET_LPC1114/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11XX" -Xlinker -Map="TestLPC1114.map" -Xlinker ーーgc-sections -mcpu=cortex-m0 -mthumb -T "" -o "TestLPC1114.axf" ./main.o

/usr/local/lpcxpresso_7.7.2_379/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld: read in flex scanner failed

makefile:44: ターゲット 'TestLPC1114.axf' のレシピで失敗しました

collect2: error: ld returned 1 exit status

make: * [TestLPC1114.axf] エラー 1

Build Finished (took 110ms)

コードが悪いかと別なコードを同様にコンパイルやExportしました 例えば以下のようなコードです。

LPC1114_Serial

#include "mbed.h"              
 
Serial pc(USBTX, USBRX); // tx, rx

int main() {
     while(1)
    {
    static int i=0;
    i++;
    pc.printf("Hello World!%d\r\n",i);
        wait(1);
    }
    
}

ですが、こちらも同様にldのエラーでBuild不能です。

次にターゲットを変えてみました。LPC1549をターゲットにしたmbedのコードをExportしてBuildしてみたところ、こちらは全く問題ありませんでした。 試したものは以下のコードです。

LPC1549_Blinky

#include "mbed.h"

DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalIn button(P1_9, PullUp);

int main() {
    for(;;){
    while(button) {
        myled1 = 1;
        wait(0.2);
        myled2 = 1;
        wait(0.2);
        myled3 = 1;
        wait(0.2);
        myled1 = 0;
        wait(0.2);
        myled2 = 0;
        wait(0.2);
        myled3 = 0;
        wait(0.2);
    }
    wait(1);
    }
}

このことから、mbed LPC1114をターゲットなコードはうまくExportできていないではないか?と思ったのですが、これ以上は自分の力で解決できませんでした。 よろしくお願いいたします。

自己解決ではありませんが、なんとなく原因らしきものがわかりましたので追記します。 mbedのオンラインコンパイラからLPC1114をターゲットにしたプロジェクトをLPCXpressoへのToolChainを選択してExportする際に、mbedのToolChainが含まれていませんでした。 具体的には [ProjectName]/mbed/TARGET_LPC1149/ 内に本来あると思われるTOOLCHAIN_GCC_CRがありません。

LPC1549をターゲットにしたProjectをExportすると問題なく、このフォルダとlibmbed.aやスタートアップのオブジェクトなどが含まれています。 また別なToolChain(Keil uVision4など)を選択してExportした場合も含まれていました。

ですので、LPC1114をターゲットにしたmbedのprojectをLPCXpressoをToolChianとしてExportした時だけに発生する問題なのではと思います。

解決としては、結局mbedのソースをすべて含んだProjectとしてExportしたものを利用すればBuildできました。 しかし、ここでも一つ問題があり、libc_s.aとlibstdc++_s.aが存在しないというエラーがBuild時に発生しました。 これは以前からある問題で一度解決されているようですが、LPCWareのフォーラムに同様の問題が指摘されていました。 http://www.lpcware.com/content/forum/newlib-nano-libraries-missing-lpcxpresso-76 フォーラムの記述によればv7.6.2で解決されているようですが、v7.7.2で再度発生しているか、もしくはLinux版は訂正されていないのでしょうか? 私の場合*_nano.aのファイルをそれぞれ*_s.aのファイルとしてSymbolicLinkを作成して対応しました。

自分の健忘録も含めてNOTEにしたいと思います。

posted by Takuya Fukuda 21 Apr 2015

1 Answer

4 years, 9 months ago.

福田さん、こんにちは。

調べてみたところ、ご指摘の様に LPC1114FN28 プラットフォーム用の LPCXpress exporter に不具合があり、オンラインのビルドシステムでは、LPCXpresso 用のバイナリが生成されていないのが原因でした。 リンクエラーメッセージの直接の原因は、バイナリ生成時にビルドディレクトリにコピーされるべき .ld ファイルがコピーされていませんでした。

この不具合は昨晩、ysuboi さんによって修正され、mbed の GitHub レポジトリにプルリクエストが出されました。 https://github.com/mbedmicro/mbed/pull/1057

これがマージされた後、次回の mbed ライブラリのリリースで修正されますので、大変お手数ですがもうしばらくお待ち下さい。

それまでの間は、(既に解決されているようですが)mbed-src を使用するか、または、以下の .zip ファイル(ビルド済みバイナリと .ld ファイルを含みます)を export したディレクトリ配下にコピーして下さい。

Binary files for LPC1114FN28 (GCC_CR build)

  + user_program
     + mbed
        + TARGET_LPC1114
            + TOOLCHAIN_GCC_CR

以上、宜しくお願いします。

Accepted Answer