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.

[参考译文] TMS320F28388D:有关 CLA 数学调用的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1348189/tms320f28388d-question-about-the-call-of-cla-math

主题中讨论的其他器件:SysConfigC2000WARE

我遇到了一个 CLA 数学不常见的问题。 通过 SysConfig 启用 CLA 数学后、我开始使用一些 IQ 公式进行测试。 最初一切都运行良好、如屏幕截图所示:

但是、在我添加"flt_PG =_IQtoF (_IQ (0.2));"行的那一刻、就出现了一个错误、指示首先引用了"_IQ24toF "、如第二个屏幕截图所示。

我已经努力解决这一问题一个星期了、我对可能出错的问题非常担心。 此外、 我已经在我的项目中包含了必要的.h、.lib 和.cmd 文件。 为了清楚地说明、我从 C2000ware 重新导入了 IQmath 示例(请参阅下面随附的图)、该示例无错误运行。 但是、添加行 tempZ_flt =_IQtoF (_IQ (0.3))会触发前面提到的与_IQtoF 相关的错误、该错误首先被引用。 在合并.lib 文件(请参见下面随附的图)并重新编译后、错误仍然存在。 将.cmd 文件从2838x_RAM_lnk_CProj_CPU1修改为 IQmath_2838x_fpu32即可解决该问题、但会发出警告(请参阅下面随附的图)。 鉴于此,(1)为什么会发生这种现象? (2)如何解决仍然存在的警告、这也与 cmd 设置相关? (3)如何将完整的 IQmath 集成到现有项目中、主要考虑到需要调整原始 cmd 文件而不使用 IQmath_2838x_fpu32?

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

    抱歉、拼写错误应为 IQmath、而不是 CLA Math

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

    您好、Eric、

     2838x_RAM_lnk_CProj_cpu1.cmd 和 IQmath_2838x_fpu32.cmd 之间有什么不同? 您能否分享这些内容?

    预计会出现有关入口点的警告、可以忽略该警告。 默认情况下、编译器期望 c_int00作为入口点。 在本例中、不同的标签(code_start)是入口点、因此它将抛出警告。

    显示 LAB_cla_cc_f2838x 工程的图片未在工程视图中明确显示 IQMath 库。 我认为所需的库已在项目属性的 C2000连接器字段中指定。 此外、请确保在 Project properties (项目属性)- C2000 Compiler (C2000编译器)- Processor (处理器)选项下有--float_support = fpu32 (而不是 softlib)。

    无需将 IQmath_fpu32_eabi.lib 添加到工程中。 添加 IQmath_fpu32.lib 就足够了。 这是将根据所选输出格式挑选必要 IQmath 库(IQmath_fpu32_coff.lib 或 IQmath_fpu32_eabi.lib)的索引库。

    谢谢。

    Sira

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

    尊敬的 Sira:

    (1)

    2838x_RAM_lnk_CProj_CPU1.cmd 来自 TI C2000ware 示例、如下图和附录1所示。   

    IQmath_2838x_fpu32.cmd 来自 C2000ware 中的 IQMath 库文件、如  附录2所示。

    (2)  

    根据您的建议、我已相应地修改了设置;但问题仍然存在。

    BTW 是文件搜索路径中的一个目录不可用、我不确定其影响。

    (3)

    附录1:2838x_RAM_lnk_CProj_CPU1.cmd:

    //########################################################################出################################出
    //
    //文件:2838x_RAM_lnk_CProj_CPU1.cmd
    //
    //标题:针对 RAM 不足的 C IQmath 示例的链接器命令文件
    //
    //
    //########################################################################出################################出
    //
    //
    //$Copyright:版权所有(C) 2014-2023德州仪器(TI)公司-
    // http://www.ti.com/ 保留所有权利$
    //########################################################################出################################出

    内存
    {
    /* begin 用于"boot to SARAM"引导加载程序模式*/
    begin:origin = 0x000000、length = 0x000002
    BOOT_RSVD:origin = 0x000002、length = 0x0001AE /* M0的一部分,引导 ROM 将此用于堆栈*/
    RAMM0:origin = 0x0001B0、length = 0x000250
    RAMM1:origin = 0x000400,length = 0x000400 /*片上 RAM 块 M1 */
    RAMD0:origin = 0x00C000、length = 0x000800
    RAMD1:origin = 0x00C800,length = 0x000800
    RAMLS0:origin = 0x008000、length = 0x000800
    RAMLS1:origin = 0x008800、length = 0x000800
    RAMLS2:origin = 0x009000、length = 0x000800
    RAMLS3:origin = 0x009800、length = 0x000800
    RAMLS4:origin = 0x00A000、length = 0x000800
    RAMLS5 : origin = 0x00A800 , length = 0x000800
    RAMLS6:origin = 0x00B000、length = 0x000800
    RAMLS7:origin = 0x00B800、length = 0x000800
    RAMGS0:origin = 0x00D000、length = 0x001000
    RAMGS1:origin = 0x00E000、length = 0x001000
    RAMGS2:origin = 0x00F000、length = 0x001000
    RAMGS3:origin = 0x010000、length = 0x001000
    RAMGS4:origin = 0x011000;length = 0x001000
    RAMGS5:origin = 0x012000、length = 0x001000
    RAMGS6:origin = 0x013000、length = 0x001000
    RAMGS7:origin = 0x014000、length = 0x001000
    RAMGS8:origin = 0x015000、length = 0x001000
    RAMGS9:origin = 0x016000、length = 0x001000
    RAMGS10:origin = 0x017000、length = 0x001000
    RAMGS11:origin = 0x018000,length = 0x001000
    RAMGS12:origin = 0x019000、length = 0x001000
    RAMGS13:origin = 0x01A000、length = 0x001000
    RAMGS14:origin = 0x01B000、length = 0x001000
    RAMGS15:origin = 0x01C000、length = 0x001000

    /*闪存扇区*/
    FLASH0:origin = 0x080000、length = 0x002000 /*片上闪存*/
    FLASH1:origin = 0x082000,length = 0x002000 /*片上闪存*/
    FLASH2:origin = 0x084000、length = 0x002000 /*片上闪存*/
    FLASH3:origin = 0x086000、length = 0x002000 /*片上闪存*/
    FLASH4:origin = 0x088000,length = 0x008000 /*片上闪存*/
    FLASH5:origin = 0x090000,length = 0x008000 /*片上闪存*/
    Flash6:origin = 0x098000、length = 0x008000 /*片上闪存*/
    FLASH7:origin = 0x0A0000、length = 0x008000 /*片上闪存*/
    FLASH8:origin = 0x0A8000、length = 0x008000 /*片上闪存*/
    FLASH9:origin = 0x0B0000,length = 0x008000 /*片上闪存*/
    FLASH10:origin = 0x0B8000,length = 0x002000 /*片上闪存*/
    FLASH11:origin = 0x0BA000、length = 0x002000 /*片上闪存*/
    FLASH12:origin = 0x0BC000、length = 0x002000 /*片上闪存*/
    FLASH13:origin = 0x0BE000、length = 0x002000 /*片上闪存*/
    CPU1TOCPU2RAM:origin = 0x03A000、length = 0x000800
    CPU2TOCPU1RAM:origin = 0x03B000、length = 0x000800

    CPUTOCMRAM:origin = 0x039000、length = 0x000800
    CMTOCPURAM:origin = 0x038000、length = 0x000800

    CANA_MSG_RAM:origin = 0x049000、length = 0x000800
    CANB_MSG_RAM:origin = 0x04B000、length = 0x000800
    复位:origin = 0x3FFFC0、length = 0x000002


    部分
    {
    代码开始:>开始
    .text :>> RAMD0 | RAMD1 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3
    cinit:> RAMM0 | RAMM1
    .switch:> RAMM0
    .reset:> reset,type = DSECT /*未使用,*/

    .stack:> RAMM1
    #if defined (__TI_EABI __)
    .bss :> RAMLS5
    .bss:输出:> RAMLS3
    init_array:> RAMM0
    .const :> RAMLS5
    .data:> RAMLS5
    .sysmem :> RAMLS4
    #else
    Pinit :> RAMM0
    .ebss :>> RAMLS5 | RAMLS6
    .econst :> RAMLS5
    .esysmem :> RAMLS5
    #endif

    ramgs0:> RAMGS0
    ramgs1 :> ramgs1

    MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM
    MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM
    MSGRAM_CPU_TO_CM > CPUTOCMRAM
    MSGRAM_CM_TO_CPU > CMTOCPURAM

    /*以下段定义适用于 IQMath */
    IQMath:> RAMGS15
    IQmathTables :> RAMGS15
    IQmathTablesRam :> RAMGS15

    /*以下段定义适用于 SDFM 示例*/
    Filter_Regs:52 > RAMGS0
    filter1_RegsFile:> RAMGS1、fill=0x1111
    Filter2_RegsFile:> RAMGS2、fill=0x2222
    Filter3_RegsFile:> RAMGS3、fill=0x3333
    Filter4_RegsFile:> RAMGS4,fill=0x4444
    Difference_Regs:> RAMGS5,填充=0x3333

    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>= 15009000
    .TI.ramfunc:{}> RAMM0
    #else
    ramfuncs :> RAMM0
    #endif
    #endif

    /*
    //========================================
    //文件结尾。
    //========================================
    */

    IQmath_2838x_fpu32.cmd:

    /*
    // TI 文件$Revision:/main/6 $
    //签入$日期:2008年7月9日14:12:48 $
    //########################################################################出################################出
    //
    //文件:28235_IQmath_lnk.cmd
    //
    //标题:针对 RAM 不足的 IQmath 示例的链接器命令文件
    //
    //注释;示例项目使用受
    //代码安全模块(CSM)。 确保 CSM 正在
    //在加载项目之前解锁。 一种快速的方法
    //对已擦除的设备执行此操作将打开存储器
    //窗口显示 CSM 密码位置。 如果这些位置
    //回读0xFFFF (或非零),则 CSM 被解锁:
    //
    //设备密码位置
    // 28235:0x33FFF8 - 0x33FFFF
    //
    //########################################################################出################################出
    //
    //
    //$Copyright:版权所有(C) 2014-2023德州仪器(TI)公司-
    // http://www.ti.com/ 保留所有权利$
    //########################################################################出################################出
    */

    内存
    {
    第0页:

    begin:origin = 0x000000、length = 0x000002 /* Boot to M0将转至此处*/
    BOOT_RSVD:origin = 0x000002、length = 0x00004E /* M0的一部分,引导 ROM 将此用于栈*/
    RAMM0:origin = 0x000050、length = 0x0003B0

    RAML0:origin = 0x008000、length = 0x001000
    RAML1L2:origin = 0x009000、length = 0x003000
    ZONE7A:origin = 0x200000,length = 0x00FC00 /* XINTF zone 7 - program space */
    CSM_RSVD:origin = 0x33FF80、length = 0x000076 /*部分 FLASHA。 当 CSM 正在使用时、全为0x0000编程。 */
    CSM_PWL:origin = 0x33FFF8,length = 0x000008 /*部分 FLASHA。 FLASHA 中的 CSM 密码位置*/
    ADC_CAL:origin = 0x380080、length = 0x000009
    复位:origin = 0x3FFFC0、length = 0x000002

    /* IQTABLES 和 IQTABLES2是引导 ROM 的一部分。
    引导 ROM 在程序或应用程序中
    数据空间、因此可以在第0页或第1页上定义
    */

    /*
    IQTABLES:origin = 0x3FE000、length = 0x000b50
    IQTABLES2:origin = 0x3FEB50、length = 0x00008c */

    /*已针对 TENOR 更改*/
    IQTABLES:origin = 0x3E9402,length = 0x000b50
    IQTABLES2:origin = 0x3E9F52、length = 0x00008c

    FPUBLES:origin = 0x3FEBDC、length = 0x0006A0
    BootROM:origin = 0x3FF27C、length = 0x000D44


    第1页:
    RAMM1:origin = 0x000400,length = 0x000400 /*片上 RAM 块 M1 */
    RAML4:origin = 0x00C000、length = 0x001000
    RAML5:origin = 0x00D000、length = 0x001000
    RAML6:origin = 0x00E000、length = 0x001000
    RAML7:origin = 0x00F000、length = 0x001000
    ZONE7B:origin = 0x20FC00,length = 0x000400 /* XINTF zone 7 - data space */


    部分
    {
    /* IQmath 包括 IQmath 库中的汇编例程
    IQmathTables 由 division、IQsin、IQcos、IQatan、IQatan2使用
    这是在引导 ROM 中、因此我们使其成为 NoLoad。 使用
    ROM 版本可节省空间、但仅需1个周期
    每次存取(引导 ROM 需要1个等待)。
    IQmathTablesRam 由 IQasin、IQacos 和 IQexp 使用
    在2833x 和2823x 上、IQNexpTable 位于 ROM 中,因此
    放在其自己的部分中。 如果 IQexp 或 IQNexp
    程序未调用、这将导致链接器
    警告。
    */

    IQMath:> RAML1L2,page = 0
    IQmathTables :> IQTABLES , PAGE = 0, TYPE = NOLOAD
    IQmathTables2:>IQTABLES2、PAGE = 0、TYPE = NOLOAD
    IQmathTablesRam :> RAML4, page = 1


    codestart :> begin, page = 0
    ramfuncs:> RAML0,page = 0
    .text:> RAML1L2、page = 0
    .cinit:> RAML0、page = 0
    .pinit:> RAML0、page = 0
    .switch:> RAML0、PAGE = 0

    .cio:> RAML4、页= 1
    .stack:> RAMM1、page = 1
    .ebss:> RAML4、page = 1
    econst:> RAML5、page = 1
    .sysmem:> RAML5、page = 1
    .esysmem :> RAMM1 | RAML4, page = 1

    ZONE7DATA :> ZONE7B, PAGE = 1

    .reset:>RESET、PAGE = 0、TYPE = DSECT /*未使用*/
    csm_rsvd :> csm_RSVD page = 0,type = DSECT /*不用于 SARAM 示例*/
    csmpasswds:>csm_PWL page = 0、type = DSECT /*不用于 SARAM 示例*/

    /*分配 ADC_cal 函数(工厂预编程到 TI 保留的存储器中)*/
    .adc_cal:load = adc_CAL、page = 0、type =空载

    /*
    //========================================
    //文件结尾。
    //========================================
    */

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

    Eric、请给我一天左右的时间来查看该视频的更详细信息并联系您。

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

    当然可以。 感谢您的及时回应

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

    Eric、

    这是我所做的。 我已下载最新的 C2000Ware (v5.02.00)、已将2838x IQMath 项目导入 CCS。 该工程的默认构建配置为 Debug_fpu32IQMATH_EABI。 此配置使用 EABI 和 fpu32、.lib 是索引库 IQmath_fpu32.lib、.cmd 文件为  2838x_RAM_lnk_CProj_CPU1.cmd。 我构建了这个项目、它构建成功了。

    然后我进入 IQsample .c 并添加了您的 flt_pg 浮点变量和_IQtoF (_iq (0.2)语句。 构建该实例会导致 RAMGS15中出现链接器错误、导致存储器不足。 我打开了.map、很有意思-大小为0x1000、已使用空间为0xFFF、未使用空间为0x1。 添加这条新代码行会导致其内存不足。 在.cmd 中、RAMGS15被分配给 IQMath 段。 因此我将 RAMGS15从0x1000更改为0x2000。 然后无错误地进行构建。 我没有得到任何未解析的符号错误。

    谢谢。

    Sira

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

    尊敬的 Sira:

    我按照您的指导进行了尝试、并尝试了最新的 C2000Ware (v5.02.00)。 它运行良好、 我只遇到一个警告、如下所述

    但是、在早期版本中、我确实遇到了问题。 当我尝试再次从 C2000Ware v5.01.00导入示例工程时、这次未能编译。 您能建议如何解决此编译问题吗?

    此外、我注意到、我对导入项目中的代码所做的任何更改即使在我重新安装 C2000Ware 之后仍然会存在。 如何完全将 C2000Ware 复位到其原始状态、而不受我之前所做任何修改的影响?

    感谢您的帮助。

    埃里克

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

    Eric、

    1.很高兴听到它在 C2000Ware v5.02.00上运行。 我建议您使用该 SDK 版本。 我已更新了此版本 SDK 的 IQmath 库和示例。

    2.导入项目时,可能会发生两件事情之一。 该命令可以将工程直接导入到 CCS 中、源文件仍然与 SDK 绑定在一起、也可以将工程导入到 CCS 工作区中并复制文件。 如果是前者、则在删除并重新安装 SDK 时、所做的更改将被清除。 但是、如果是后者、则即使已重新安装并替换 SDK、您也可能会不断地从工作区导入相同的旧工程。

    谢谢。

    Sira

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

    尊敬的 Sira:

    如何切换到第一个选项、以确保 C2000Ware 中的原始文件保持不变? 在导入示例工程的过程中、我没有遇到任何允许我这样做的选项。 "你怎么知道的?"

    谢谢。

    埃里克

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

    Eric、

    这一切都取决于示例项目的开发方式。 如果是使用 CCS projectspec 开发的、则工程的源文件很可能会复制到工作区中、而不会链接到工程中的原始源文件。 因此、如果进行更改、您将只编辑工作区文件-复制-而不是原始源文件。 但是、如果工程是.project/.cproject、则它可能会链接到原始源文件、您将遇到您正在描述的问题。

    谢谢。

    Sira

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

    谢谢!