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.

[参考译文] 编译器/TMDSCNCD28388D:CLA 汇编器存在问题

Guru**** 2540720 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/859943/compiler-tmdscncd28388d-problem-with-cla-assembler

器件型号:TMDSCNCD28388D
Thread 中讨论的其他器件:controlSUITEC2000WARE

工具/软件:TI C/C++编译器

你(们)好

我 已经由 CLA 汇编器为 TMS320F2837x 开发了一些滤波器、并尝试为 TMS320F2838x 编译它、并遇到了下一个问题

例如 、部分*。asm 文件

 .cdecls C
  %{
      #include "cla_adc_filter_shared.h"
      #include
      #include
      #include
      #include
      #include
        extern float W5;
      extern float W4;
      extern float W3;
      extern float W2;
      extern float W1;
      extern float K;
      extern float g_ffk;
      extern uint16_t g_ui16Clear_Interrupt;
      extern volatile struct adc_result_regs AdcaResultRegs;
      extern volatile struct cla_SOFTINT_regs Cla1SoftIntRegs;
      extern volatile struct adc_regs AdcaRegs;
       extern Int16_t New_filtered_DataA0;
       extern Int16_t New_filtered_DataA1;
       extern Int16_t New_filtered_DataA2;
       extern Int16_t New_filtered_DataA3;
       extern Int16_t New_filtered_DataA4;
       extern Int16_t New_filtered_DataA5;
      extern uint32_t g_ui32计数器[6];
      extern Int16_t is 数据;      
/********* /
  %}
array_locationa_0:      .word  _New_filtered_DataA0
array_locationa_1:      .word  _New_filtered_DataA1
array_locationa_2:      .word  _New_filtered_DataA2
array_locationa_3:      .word  _New_filtered_DataA3
array_locationa_4:      .word  _New_filtered_DataA4
array_locationa_5:      .word  _New_filtered_DataA5

它会导致编译错误

../Calculation/CLA/cla_IIR_Filter.asm "、错误!   在 EOF:[E0300]以下符号未定义:
 _New_filtered_DataA0
 _New_filtered_DataA1
 _New_filtered_DataA2
 _New_filtered_DataA3
 _New_filtered_DataA4
 _New_filtered_DataA5

 和代码

MMOVI16   MAR0、#New_filtered_DataA2 ;将数组开始加载到注册器

LED 编译错误

"/tmp/TI4lfFwgmTm "、错误!   第3254行:[E0800]结构体/联合体定义中不允许使用指令
   MAR0         .BITS 16            ;无符号 int MAR0 -偏移42字节,大小(1字节|16位)

经过一些调查、我得出结论、汇编器处理从 C/C++符号导出的问题、不使用下划线、

因此、它不会看到 例如 _New_filtered_DataA0、而是取代 操作命名规则 MAR0、它在中找到了 MAR0和其他 CLA 寄存器定义

f2838x_cla.h

那么问题是-如何避免这个问题呢?

此致

Andrii Shevchuk

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

    一个校正

     我在符号之前丢失了下划线

    原因

    MMOVI16   MAR0、#_New_filtered_DataA2 ;将数组开始加载到注册器

    LED 编译错误。

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

    你(们)好

    其他信息

    我  之前使用过编译器 TI v15.12.3 LTS (当时没有错误) 。 现在我使用 TI v18.12.2 LTS

    对于 TI v15.12.3 LTS、我使用 COFF 作为二进制接口、现在我使用 EABI、但当我返回 COFF 时、下一个错误 消失了

    ../Calculation/CLA/cla_IIR_Filter.asm "、错误!   在 EOF:[E0300]以下符号未定义:
     _New_filtered_DataA0
     _New_filtered_DataA1
     _New_filtered_DataA2
     _New_filtered_DataA3
     _New_filtered_DataA4
     _New_filtered_DataA5

    但错误

    "/tmp/TI4lfFwgmTm "、错误!   第3254行:[E0800]结构体/联合体定义中不允许使用指令
       MAR0         .BITS 16            ;无符号 int MAR0 -偏移42字节,大小(1字节|16位)

    仍然存在。

    此致

    Andrii Shevchuk

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

    关于...

    [引用 user="Andrii Shevchuk"]"/tmp/TI4lfFwgmTm、错误!   第3254行:[E0800]结构体/联合体定义中不允许使用指令
       MAR0         .bits 16            ;unsigned int MAR0 -偏移42字节,大小(1字节|16位)

    我认为 MAR0的定义来自类似于.

    {.cdecls C
    %}
    #include 
    (笑声)
    
    

    f2838x_cla.h 文件是否来自 TI 发布的软件包?  如果是、该软件包的名称和版本是什么?  当我查看 controlSUITE 和 C2000Ware 中的类似文件时,我会看到如下定义...

    uint16 _MAR0;// CLA 辅助寄存器0
    

    我不熟悉此代码、因此我无法确定。  但最好猜测一下、前导下划线是为了避免您遇到的问题。

    谢谢、此致、

    乔治

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

    你好、George

    f2838x_cla.h 来自 TI 发布的软件包。

    我认为你是对的。 我比较了 f2838x_cla.h 和 F2837x_D_cla.h (它来自成功编译的项目)并发现了差异

    网址为 F2837x_D_cla.h

    uint16                                  _mPC;                        // CLA 程序计数器
       uint16                                  rsvd4;                       //保留
       uint16                                  _MAR0;                       // CLA 辅助寄存器0
       uint16                                  _MAR1;                       // CLA 辅助寄存器1
       uint16                                  rsvd5[2];                    //保留
       UNION  _MSTF_REG                       _MSTF;                       // CLA 浮点状态寄存器
       UNION  MR_REG_MR0                          ;                        // CLA 浮点结果寄存器0
       uint16                                  rsvd6[2];                    //保留
       UNION  MR_REG_MR1                          ;                        // CLA 浮点结果寄存器1
       uint16                                  rsvd7[2];                    //保留
       UNION  MR_REG_MR2                          ;                        // CLA 浮点结果寄存器2.
       uint16                                  rsvd8[2];                    //保留
       UNION  MR_REG_MR3                          ;                        // CLA 浮点结果寄存器3.
    };

    网址为 f2838x_cla.h

     UNION  MSTF_REG                        MSTF;                        // CLA 浮点状态寄存器
       UNION  MR_REG                          MR0;                         // CLA 浮点结果寄存器0
       uint16                                  rsvd6[2];                    //保留
       UNION  MR_REG                          MR1;                         // CLA 浮点结果寄存器1
       uint16                                  rsvd7[2];                    //保留
       UNION  MR_REG                          MR2;                         // CLA 浮点结果寄存器2.
       uint16                                  rsvd8[2];                    //保留
       UNION  MR_REG                          MR3;        

    因此 f2838x_cla.h 文件中缺少下划线

    所以我已经更正了这一个,编译成功了。

    那么问题是、f2838x_cla.h 为什么没有这个。

    文档 - TMS320C28x 优化 C/C++编译器
    v18.1.0.LTS
    用户指南
    文献编号:SPRU514P
    1月

    第6.11节目标文件符号命名规则(链接名)  

    对于 COFF、编译器会在 C 标识符链接名的开头放置一个下划线、您可以这样做
    可以安全地在汇编代码中使用不以下划线开头的标识符。

    EABI 的相关信息不存在、因此我将打开新主题

    因此、在 COFF 中、应自动对其进行保护、但头文件包含此保护。

    C++基于 C 标准(1.1/2、C++03)、C99是规范参考(1.2/1、C++03)、这些也适用于1999 C 标准:

    7.1.3保留的标识符

    每个标头声明或定义其关联子句中列出的所有标识符、并可选择性地声明或定义其关联的未来库指令子句中列出的标识符和始终保留用于任何用途或用作文件范围标识符的标识符。

    • 所有以下划线开头、大写字母或另一个下划线开头的标识符都始终保留供任何使用。
    • 以下划线开头的所有标识符始终保留、以便在普通和标记名称空间中用作具有文件范围的标识符。

     

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

    [引用 user="Andrii Shevchuk"]问题是 f2838x_cla.h 为什么没有这个。

    我不知道。  我不在发布此软件包的团队中。  这就是为什么我要求您提供软件包的名称和版本。  一旦我知道、我可以将此问题直接发送给正确的团队、他们可以处理。

    谢谢、此致、

    乔治