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.

[参考译文] 编译器/TMS320C5535:结构"<unnames>"没有字段...

Guru**** 2568565 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/595366/compiler-tms320c5535-struct-unnamed-has-no-field

部件号:TMS320C5535

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

我遇到了一个我无法理解的问题,该问题涉及C5000 DSP及其相应的芯片支持libaray (C55xx CSL)。 我正在尝试访问DMA外围设备的控制寄存器,但编译器无法生成,并出现以下错误:

'生成文件:../I2S_DMA.c'
'调用:C5500编译器'
c:\ti/ccsv5/tools/compiler/C5500_DX.1/bin/cl55" 4.4 -v5515 --memory_model=large -g --include_path="C:/ti/ccsv5/tools/compiler/C5500_DX.1/include" 4.4 --include_path_path=C:d55_c_c55_c_c55_c_c55_c=-c55_cv1/c55_c55_cb 3.07 -c55_cb -c55_cb -c55_cb -cb -c55_cb -c55_cb -c55_cb -c55_cb -cb -c55_cb -c55_cb -cb -c55_c55_cb -cb -c55_cb -cb -c55_cb -cb -c55_cb -c55_cb -cb -c55_c55_cb -cb -cb -c55_cb -c55_cb -cb -c55_cb -cb -c=
"../I2S_DMA.c",第115行:错误#137:结构"<unnamed>"没有字段"DMACH0TCR2"


故障代码是:

但是,这对我没有意义,因为如果我浏览CSL源,我可以找到CSL_DmaRegsOvly的定义:

c55xx_csl/inc/soc.h在第90行有typedef:

c55xx_csl/inc/cslr_dma.h包含数据结构:

希望我不会犯傻的错误。 任何帮助都将不胜感激!

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

    我看不到您在此处显示的内容中的错误。  因此,这必须意味着编译器对它的看法不同。

    有一种很好的调试技术,例如文件和预处理程序问题。  使用选项--gen_acp_raw (在较新的TI编译器中名为--gen_preprocessor_listing)生成问题源文件,并检查生成的列表文件。  此文件与源文件具有相同的名称,扩展名更改为.RL。  您可以查看文件的包含方式,扩展前后显示预处理行等。  C55x 编译器手册中介绍了列表文件的格式。  通常,这会让您直接找到问题的根源。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这里最重要的是dmaHandle的类型。 我怀疑这是一个匿名联盟。 访问匿名联合的成员是gcc扩展,在C55x编译器中,默认情况下不启用该扩展。 尝试添加编译选项--gcc。 如果这不起作用,您可能需要更改dmaHandle类型的定义,为工会指定一个名称,并在引用其成员时使用该名称。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,George和考古学家,

    非常感谢您的回复。 我尝试了你的两个建议,但我无法解决我的问题。

    乔治:

    我使用--gen_agp_raw标志进行编译,并且能够查看预处理的源代码。 但是,预处理程序未更改所述来源,如行前的"N"所示:

    n CSL_DmaRegsOvly DMA_reg;

    n dma_reg = dmaHandle->dmaRegs;
    e "../I2S_DMA.c" 115 15 struct "<unnamed>"没有字段"DMACH0TCR2"
    n IF (DMA_REG->DMACH0TCR2 & 0x0002){//最后一个xfer:pong
    n isrCounterPing++;
    n }其它{//最后xfers: ping
    n isrCounterPong++;
    n }

    我仍然感到困惑的是,为什么编译器认为DMA_reg没有成员DMACH0TCR2,而是在结构本身中声明该确切字段。

    考古学家:

    我尝试使用-gcc标志进行编译,但错误仍然存在:

    “c:\ti/ccsv5/tools/compiler/C5500_DX.1/bin/cl55" 4.4 --gcc -v5515 --memory_model=large -g --include_path="C:4.4 /include_f55_c_c55_c_c55/scr_f_c55_c=f_c55/scr_c_c55_c_c55_c=-c55_c55_c_c55_c_c_c55_c=-c55_c55_c_c55_c=-c55/c55_c55_c_c=-c55_c55_c_c_c55_c_c=-c55_c55_c=-c55_c_c55_c55/c_c_c_c=-c55_c55_c=-c_c_c_c55_c_c_c=-c55_c55_c55_c=-c55_c55_c=-c_c_c 3.07  

    "../I2S_DMA.c",第115行:错误#137:结构"<unnamed>"没有字段"DMACH0TCR2"

    编译"../I2S_DMA.c"时检测到1个错误。

    dmaHandle是CSL_DMA_Handle,定义如下:

    我在这个结构中看不到任何匿名工会,所以我不确定这是否是问题所在。

    再次感谢您的反馈,希望能尽快收到反馈!

    Evan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,dmaHandle->dmaRegs的类型是CSL_DmaRegsOvly。 DMA_regs是否属于同一类型?

    我猜CSL_DmaRegsOvly是一个没有struct标记的struct类型的typedef。 为其命名(至少用于调试问题)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正确,DMA_reg属于同一类型。  

    我猜CSL_DmaRegsOvly是没有struct标记的struct类型的typedef。 为其命名(至少用于调试问题)。[/QUOT]

    您能澄清一下"命名"的含义吗?  

    谢谢!

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

    我的意思是给struct一个struct标记:

    typedef结构I_need_a_name
    {
    [...]
    } CSL_DmaRegsOvly;