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.

[参考译文] MSP430FR6043:IQmathLib 和 GCC、带有-mlarge

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1357125/msp430fr6043-iqmathlib-and-gcc-with--mlarge

器件型号:MSP430FR6043
主题中讨论的其他器件: MSP430WAREMSP-IQMATHLIB

您好!

我们 不能将  IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_SMALL_DATA.lib 与  GCC-9.3.1  的开发流程。

步骤:

1.开始 CCS 使用最新版本的项目 GNU v9.3.1.11 实现 MSP430FR6043

2.在 project properties -> Build -> GNU Compiler -> Miscellaneous 中确保设置了以下内容:

-mlarge

-mcode-region=none

-mdata-region=lower

3.在"project properties"->"Build"->"GNU Linker"->"Libraries"中、添加库名称和路径:

IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_SMALL_DATA.lib

C:\ti\msp430ware_3_80_14_01\iqmathlib\libraries\ccs\MPY32\5xx_6xx

4.尝试编译、但失败、显示:

IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_SMALL_DATA.lib (_IQNdiv.o)使用数据模型、而 d:/tools/gcc-msp430/bin/../lib/gcc/msp430-elf/9.3.1/../../../../msp430-elf/lib/large crt0.o 使用大型数据模式

尝试的其他版本:

-mdata-region=low、含 IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_  受限 _data.lib => 相同 msp430-elf\lib\large\crt0.o 使用大型数据模型

-mdata-region=low、含 IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_  _data.lib => IQmathLib 可以对数据使用上部区域、但 TEST_GCC.out 假设数据专门位于下部存储器中

-mdata-region=none、IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_  _data.lib =>  msp430-elf\lib\large\crt0.o 使用大型数据模型

-mdata-region=none 、IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_  受限 _data.lib =>  msp430-elf\lib\large\crt0.o 使用大型数据模型

唯一看起来有效的组合是 -mcode-region=二者 中任一搭配 、使用 IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_  _data.lib =>  构建但 具有大量链接警告:

但是 使用 LARGE_DATA 模型会带来很多开销、因为所有数据指针将会很远而不是近... 这意味着它会减慢数学运算的速度、对吧?

有没有人可以  使用 GCC 完美地完成 IQmathLib 构建? 特别是在代码很大且数据很小的情况下(IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_SMALL_DATA.lib)?

是否有  MSP430-elf/lib/large/ crt0.o  哪些使用大型代码模型但使用小型 数据模型?

谢谢!

丹尼尔

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

    GCC 仅提供-mlarge 和-msmall。 不能选择大型代码和小型数据。

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

    谢谢 David,很棒的发现! 实际上、去除此处的悬空会显著降低 IQmath 时序:

    • 0.17s 与具有 GCC 的2.2s

    参考:使用 TI 编译器时为0.16s 与0.37s:

    借助 GCC、依然可以解决有关如何获取  IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_SMALL_DATA.lib 链接的问题、或者、如果不可能、为什么选择 LARGE_CODE_ _data.lib 抛出了 大量链接警告。

    谢谢!

    丹尼尔

    PS:根据 David 的建议更正的代码为:

    static _iq20 xm[TEST_SIZE];
    static void math_test(void)
    {
        _iq20 f1 = _IQ20(2.103f);
        _iq20 f2 = _IQ20(1.135f);
        xm[0] = _IQ20(1.0f);
        for (uint16_t i = 2; i <= TEST_SIZE; i++) {
            if (xm[i - 2U] > _IQ20(1.0f)) {
                xm[i - 1U] = _IQ20div((_IQ20mpy(f1, _IQ20(i + 1U)) + _IQ20mpy(f2, _IQ20(i - 1U))), xm[i - 2U]);
            } else {
                xm[i - 1U] = _IQ20mpy((_IQ20mpy(f1, _IQ20(i + 1U)) + _IQ20mpy(f2, _IQ20(i - 1U))), xm[i - 2U]);
            }
        }
    }

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

    抱歉:发布了错误的主题的"float"回复...

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

    您好、David、感谢您的支持

    Daniel、您好!请查看 MSP-IQMATHLIB  页面上的 MSP IQMath 用户指南: https://www.ti.com/tool/MSP-IQMATHLIB

    谢谢

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

    谢谢您、但该指南对 GCC 毫无帮助... 我们的 MSP430FR6043项目需要

    • -mlarge
    • -mcode-region=none 或 任意一种
    • -mdata-region=none 或更低

    而且、GCC 不与 iqmathlib\libraries\ccs\MPY32\5xx_6xx\IQmathLib_ccs_MPY32_5xx_6xx_cpux_large_code_small_data.lib 链接:它抱怨/msp430-elf/lib/large  crt0.o  使用  数据模式 ?! 正如 David 解释的、似乎是一个 GCC 问题、无法提供所有库版本。

    它 仅使用 _large_code_largel_data.lib 编译 (即使如此、也会抛出66条链接器警告!) 但至少它 能以某种方式工作...  遗憾的是、 由于上述链接器警告、我们无法继续使用此组合。

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

    区选项具有不同的效果、具体取决于编译器是生成代码还是链接。 您尚未显示链接选项...

    查看 GCC 编译器指南、通过-mdata-region-low 来执行任何操作需要一个额外的选项。 因为没有要匹配的 GCC 库、所以它似乎用处很大。 这是奇怪的、因为除了在 FRAM 器件上、甚至都不可能在上部存储器中提供数据。

    至于 IQMath 本身、除非您需要一些精函数、否则您可以跳过它。 定点加法和减法比较简单。 乘法和除法会更困难一些、因为必须修复二进制点。