Arm Mbed OS support forum

LPC1114でuv5にエクスポートするとリンカーエラー

こんにちは、

LPC1114
Serial pc(dp16, dp15); // tx, rx
を宣言して、mbed上ではコンパイルも問題なくできて、動作もするのですが、
そのコードをu-visoin5にエクスポートすると、ライブラリーのobjectにSerailBase.oが含まれずにリンカーでエラーになります。
よい対応方法がありましたらお教えください。

エラーは
L6218E: Undefined symbol __aeabi_vec_ctor_nocookie_nodtor (referred from mbed/TARGET_LPC1114/TOOLCHAIN_ARM_MICRO/mbed.ar(SerialBase.o)).

です。

オンラインコンパイラのエクスポート機能で、[uvision5-armc6] を選択した場合は、Arm Compiler v6用のプロジェクトファイルが生成されます。Arm Compiler v6は、古い micro libraryを使ったオブジェクトは互換性がない(ビルド時にwarningが表示されていると思います)ので、リンクすることが出来ません。

Arm Compiler v5用のプロジェクトの生成方法をこちらに書きましたので、ご参照ください。

1 Like

ありがとうございます。
無事に動作いたしました。m(_ _)m

こんにちは、

タイマを使い始めたところ、
mdkのリンクエラーが発生いたします。

.\BUILD\LPC1114TEST.axf: Error: L6218E: Undefined symbol mbed::Ticker::attach_us(mbed::Callback<void()>, unsigned long long) (referred from .\build\main.o).

何か対応方法をご存知でしたらお教えください。

コードはこんな感じです。

DigitalOut IINT(P2_4);
Ticker flipper;

void flip() {
IINT = !IINT;
}

int main() {
flipper.attach(&flip, 0.001);
while(true)

}

使用されているライブラリは、Mbed 2でしょうか?

以前ご連絡した手順で作成したMDK-ARMのプロジェクトで
試してみたところ、こちらでは正常にビルドできました。

1 Like

ご確認ありがとうございます。
ちょっとこちらでも確認いたします。

確認いたしました

まず、mdkのproject ファイルがつくれない状態です。
エラーは下記となります。
pythonもmbed cliもqitaのversionと同じにしています。
かなり困っておりまして、対応よろしくお願いいたします。
(mbed-e95d10626187をフォルダーに展開するとmdkのファイルはできる様なのですが、そうするとtimerが使えなくなりまして。。)
何卒よろしくお願いいたします。

Z:\lpc1114\mbed_Time_Test>mbed deploy
[mbed] Working path “Z:\lpc1114\mbed_Time_Test” (program)
[mbed] WARNING: Program “mbed_Time_Test” in “z:\lpc1114\mbed_Time_Test” does not use source control management.
To fix this you should use “mbed new .” in the root of your program.

[mbed] Updating library “mbed” to rev #65be27845400
[mbed] Updating the mbed 2.0 SDK tools…

z:\lpc1114\mbed_Time_Test>mbed --version
1.10.1

z:\lpc1114\mbed_Time_Test>c:\python27\python --version
Python 2.7.15

z:\lpc1114\mbed_Time_Test>mbed export -m lpc1114 -i uvision5
[mbed] Working path “z:\lpc1114\mbed_Time_Test” (program)
Scan: mbed_Time_Test
Traceback (most recent call last):
File “z:\lpc1114\mbed_Time_Test.temp\tools\project.py”, line 424, in
main()
File “z:\lpc1114\mbed_Time_Test.temp\tools\project.py”, line 416, in main
ignore=options.ignore
File “Z:\lpc1114\mbed_Time_Test.temp\tools\project.py”, line 192, in export
ignore=ignore
File “Z:\lpc1114\mbed_Time_Test.temp\tools\export_init_.py”, line 285, in export_project
macros=macros)
File “z:\lpc1114\mbed_Time_Test.temp\tools\export_init_.py”, line 161, in generate_project_files
exporter.generate()
File “z:\lpc1114\mbed_Time_Test.temp\tools\export\uvision_init_.py”, line 248, in generate
FileType.LD_SCRIPT)[0]
IndexError: list index out of range
[mbed] ERROR: “c:\python27\python.exe” returned error.
Code: 1
Path: “z:\lpc1114\mbed_Time_Test”
Command: “c:\python27\python.exe -u z:\lpc1114\mbed_Time_Test.temp\tools\project.py -i uvision5 -m lpc1114 --profile debug --source .”
Tip: You could retry the last command with “-v” flag for verbose output

情報ありがとうございます。
オンラインIDEでエクスポートしたZIPアーカイブ内に
必要なファイルが含まれていないのが問題のようです。

以下の手順をお試しください。

以下のアーカイブをダウンロードして、展開する。
https://dl.dropboxusercontent.com/s/p3pygps0uqfc5hq/mbed-e95d10626187.zip

mbed-e95d10626187\TARGET_LPC1114\TOOLCHAIN_ARM_MICRO フォルダを
作業用ディレクトリのmbed\TARGET_LPC1114\TOOLCHAIN_ARM_STD と同じ階層に
コピーする。

├─.bld
├─drivers
├─hal
├─platform
└─TARGET_LPC1114
    ├─TARGET_NXP
    │  └─TARGET_LPC11XX_11CXX
    │      ├─device
    │      └─TARGET_LPC11XX
    ├─TOOLCHAIN_ARM_MICRO
    └─TOOLCHAIN_ARM_STD

コマンドを実行する。

mbed export -m lpc1114 -i uvision5

projectの作成方法のご教授ありがとうございます。
projectファイルはできましたが、
mbed\platform/mbed_power_mgmt.h(268): warning: #1461-D: function declared with “noreturn” does return
main.cpp: 1 warning, 0 errors
linking…
.\BUILD\mbed_Time_Test.axf: Error: L6218E: Undefined symbol mbed::Ticker::attach_us(mbed::Callback<void()>, unsigned long long) (referred from .\build\main.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 1 error messages.
“.\BUILD\mbed_Time_Test.axf” - 1 Error(s), 1 Warning(s).
Target not created.
とtimerでリンクエラーとなってしまいます。

対応方法としては、 e95d10626187を使うかりぎ無理なのかな?とも思っております。

あとはmbed-devそのものを内包するしか方法はないですかね?
もし、何か良い手をご存知でしたら、ご教授ください。

確認いろいろありがとうございます。

不具合の発生するプロジェクトファイルを送っていただけますか?

はい


に置きました。
(6MB くらいです。)
取得よろしくお願いいたします。

プロジェクトをビルドして確認してみました。

発生しているリンクエラーは、attach_us()関数の定義が含まれていないことが原因のようでした。

mbed_Time_Test\mbed\drivers\Ticker.h を以下のように変更することによって、リンクエラーが
発生しなくなりました(実機での動作も確認しました)。

#if 0
    void attach_us(Callback<void()> func, us_timestamp_t t);
#else
    void attach_us(Callback<void()> func, us_timestamp_t t)
    {
        core_util_critical_section_enter();
        // lock only for the initial callback setup and this is not low power ticker
        if (!_function && _lock_deepsleep) {
            sleep_manager_lock_deep_sleep();
        }
        _function = func;
        setup(t);
        core_util_critical_section_exit();
    }
#endif

mbed lsコマンドとmbed_versions.hを確認したところ、
使用されているmbedライブラリのバージョンは、165(#65be27845400)でした。
このバージョンは、不足しているファイルがあったりするので推奨しません。

バージョン163(#e95d10626187)の使用を推奨します。
上記コードはバージョン163のコードを使っています。

以上、よろしくお願いします。

1 Like

ご確認ありがとうございます。


を行ってからmbed-e95d10626187\TARGET_LPC1114\TOOLCHAIN_ARM_MICRO フォルダを
コピーしたのが理由ですね。
1点確認ですが、結局mbed deployした後にmbed-e95d10626187の
├─drivers
├─hal
├─platform

で更新すればよいでしょうか?
.bldはそのままでよいですか?

確認です。
よろしくお願いいたします。

1点確認ですが、結局mbed deployした後にmbed-e95d10626187の

├─drivers
├─hal
├─platform

で更新すればよいでしょうか?
.bldはそのままでよいですか?

オンラインIDEからエクスポートする元のプロジェクトのmbedライブラリのバージョンを163(#e95d10626187)にするのが一番良いと思います。既にmbed deploy済みであれば、mbedフォルダ内を全て更新した方が良いです。
mbed.bldはそのままでも良いと思いますが、気になるようであれば以下のように書き換えてください。

https://os.mbed.com/users/mbed_official/code/mbed/builds/e95d10626187

ご確認ありがとうございます。
承知いたしました。