This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430-GCC-opensource:未定义对`_mspabi_divi&#39的引用;

Guru**** 1578975 points
Other Parts Discussed in Thread: MSP430FR2100, MSP430-GCC-OPENSOURCE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/981264/msp430-gcc-opensource-undefined-reference-to-__mspabi_divi

器件型号:MSP430-GCC-opensource
主题中讨论的其他器件:MSP430FR2100

我正在尝试使用 MSP430-GCC-opensource 来编译针对 MSP430FR2100的代码。 我已经成功安装了编译器、使用-nostdlib 编译了一些 c 代码、但现在我正在尝试编译需要标准库函数的代码(我删除了-nostdlib 标志)。 我遇到以下错误:

对`strlen'的引用未定义

未`对_mspabi_remi'的引用

对`mspabi_divi"的引用未定义

因此、看起来工具没有链接正确的库函数调用。 如果我理解正确、完整的安装程序应包含 newlib。 是否有技巧可以帮助编译器/链接器查找合适的文件?

作为参考、我安装 了 msp430-gcc-full-linux-x64-installer-9.2.0.0.run

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    编译器应知道在何处查找这些库。 您的编译器选项或安装有问题。 9.2对我来说工作正常。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速响应、

    我不确定安装会如何出现问题。 我只需运行 installer.run、它就完成了、没有错误、并将 toolchain/bin 目录添加到路径中。 是否需要执行任何其他步骤?

    对于编译器选项、我具有:-Wall -O2 -c -fno-exceptions -i ./-o main.o main.c

    对于链接器选项、我具有:-gC-SECTIONS -T msp430.ld -Map test.map -N -o test.elf boot_rom.o main.o

    有什么缺失或明显错误的地方?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    显然、不使用 CPU 的定义是错误的。 这是必需的、以便编译器知道在何处查找内容。 链接器需要该文件、以便获取正确的.ld 文件。 在本例中为 msp430fr2100.ld。 我通常使用 makefile。

    gcc_DIR =/usr/ti/gcc/bin
    support_file_directory =/usr/ti/gcc/include
    CC =$(gcc_DIR)/msp430-elf-gcc
    CFLAGS =-mmcu=${CPU}-Wall -g -OS -i $(support_file_directory)-ffunion-sections
    LFLAGS =-wl、-gC-SECTIONS -mmcu=${CPU}-melax (支持文件-g)-mpeg
    
    
    等等
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、这让我更进一步、但现在我将获得"MSP430-elf-ld:无法识别的仿真模式:放松"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您必须直接调用链接器、这可能是问题的根源。 我的 LFLAGS 设置为传递到 gcc 而不是 ld。 大标志告诉您、是"-WL"、这是一种魔法提示、告诉 gcc 将后续内容传递给 ld。

    通常、除非您有一些非常具体的要求、否则您需要让 gcc 确定哪些选项和搜索路径来馈送至 ld。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还可以! 这很有帮助。 现在、我可以完成构建。 唯一看起来不能正常工作的是在0xFFe 建立和保持 RESETVEC。 它默认为零、即使 msp430fr2100.ld 应该将其保留在0xfffe 中。 我的 boot_rom.s 使用与之前相同的约定: .section ".resetvec"、_start 之前的"A":

    对此问题有什么看法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    C 运行时会设置复位矢量、因此您不应对其执行任何操作。

    除非您尝试绕过 C 启动代码、否则您必须告诉编译器不要将其包括在内。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它更多地用于编程目的。 我需要一些信息、告诉程序员将正确的起始地址写入复位矢量地址0xFFe。 这是在 C 运行时间之前、因为它是 CPU 复位硬件逻辑的一部分。 我可以对其进行硬编码...但这以前在-nostdlb 编译中有效。

    我可以在目标转储文件中看到"__reset_vector"、但它设置为地址0x00000000。 在我之前的-nostdlib 构建中、我还会在目标转储文件中看到"__reset_vector"、并且地址会正确设置为0x0000fffe。 我的编程过程的一部分是将 elf 转换为一个 ihex 文件、这需要包含要编程到0xFFe 中的数据。 到目前为止、它没有、我不确定原因。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它必须是您正在执行的操作、因为我已经从.elf 转换为.hex、并且所有的向量都显示出来。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我对此毫不怀疑。