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.

[参考译文] TMS320F28379D:编译器获取结构成员的地址错误

Guru**** 3001220 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1640197/tms320f28379d-compiler-gets-the-address-of-struct-member-wrong

部件号: TMS320F28379D
主题: C2000WARE 中讨论的其他器件

你好,我期待着周末,当我的代码开始失败的有线方式。

在初始化期间、我将相同的地址分配给两个结构的成员、这两个结构的类型都是相同的。

但在调试期间,我看到一个成员没有得到新的值,在同一时间,另一个结构关闭得到了一个奇怪的值..

我把它缩小到编译器计算的一个错误的地址,对于其中一个 metebers。

C 代码片段。

image.png

如调试器中所示

image.png

和相同的装配体突出显示,球杆在 CCS 暗模式下是有点破碎;-)

image.png

存储器布局的一个片段

image.png

用于写入第一个结构的汇编代码为:

`08cf80: A83C    MOVL     @0x3c、XAR4`Ω

当 DP = 0x5f4 时、`@0x3c`指向地址 0x17d3c、这与存储器中的闪存计算机位置相匹配。

但是、用于写入第二个结构的汇编代码是:

`08cf81: A804    MOVL     @0x4、XAR4`Ω

仍然是 DP = 0x5f4 时、`@0x4`指向地址 0x17d04、这与结构成员不匹配、但会写入变量`_localSyslogDoneQueueNextReadIdx `和` level `的区域。 因为您还可以看到在 Momory 视图中突出显示的调试器。

据我所见、正确的装配体应该是:

`08cf81: A844    MOVL     @0x44、XAR4`Ω

这是接近周末,所以我没有时间设置一个演示项目,我也不知道是什么触发了这个 bug ,所以它可能是困难的(阅读:需要很多时间)。

我的编译器设置:

cl2000“--cmd_ffile=“diagnostic_options.opt“ -v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -vcu2 -O1 --fp_mode=relaxed --cmd_directory=“src“--cmd_fram_file=“syscfg/board.syscfg=“opt_link_cfg=“opt_link=“opt_cpu=“-link_cpu=“opt=“/link_cpu=“opt=“file=link_cpu2 -link_cfg“- link_cpu=“file=“opt=“opt=“/link_cfg“   

CMD_FILE=“diagnostic_options.opt“:

10247.
第 183 章,我是你的女人
第 195 章我是你的女人
第 225 章
第 2709 章
10205.
 第 383 章我是你的女人
-pdr
-PDV  
-pden

CMD_FILE=“syscfg/board.opt“:

-i“C:/ti/c2000Ware/C2000Ware_5_01_00_01/device_support/f2837xd/common/include /“
-i“C:/ti/c2000Ware/C2000Ware_5_01_00_01/driverlib/f2837xd/driverlib /“
-DCPU2.

CMD_FILE=“syscfg/device_cmd.opt“

-DCMDTOOL
-DRUN_IN_FLASH

CMD_FILE=“syscfg/c2000ware_libraries.opt“为空

对于完成状态、此处是寄存器的状态、  

image.png

编辑:忘记编译器版本:

cl2000 -version
TMS320C2000 C/C++编译器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D

TMS320C2000 C/C++解析器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 EABI C/C++解析器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 C/C++文件合并 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 C/C++优化器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 G3 C/C++ Codegen v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 汇编器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 嵌入实用程序 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 C 源代码交叉列表器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 链接器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 绝对列表器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 符号去除实用程序 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 XREF 实用程序 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 C++还原器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 十六进制转换器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 名称实用程序 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 目标文件显示 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D
TMS320C2000 归档器 v22.6.0.LTS
内部版本号 1WF5K-2LI-RZASS-TAQ-C08D

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

    更新了

    它似乎在链接时发生

    如果我将`--keep_asm`添加到文件的编译中

    我在 asm 文件中找到这一点

    ;***************************************************************
    ;* FNAME: DebugLog_Init                 FR SIZE:   0           *
    ;*                                                             *
    ;* FUNCTION ENVIRONMENT                                        *
    ;*                                                             *
    ;* FUNCTION PROPERTIES                                         *
    ;*                            0 Parameter,  0 Auto,  0 SOE     *
    ;***************************************************************
    
    ||DebugLog_Init||:
    ;* AR4   assigned to $O$C1
    	.dwcfi	cfa_offset, -2
    	.dwcfi	save_reg_to_mem, 26, 0
    	.dwpsn	file "D:/gsrc/DebugLog.c",line 215,column 5,is_stmt,isa 0
    $C$DW$226	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$226, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$226, DW_AT_name("LogBuffer_Init")
    	.dwattr $C$DW$226, DW_AT_TI_call
    
            LCR       #||LogBuffer_Init||   ; [CPU_ALU] |215| 
            ; call occurs [#||LogBuffer_Init||] ; [] |215| 
            MOVW      DP,#||localLogBuffer|| ; [CPU_ARAU] 
            MOVL      @||localLogBuffer||,XAR4 ; [CPU_ALU] |215| 
            MOVW      DP,#||localiAfeChannel||+2 ; [CPU_ARAU] 
    	.dwpsn	file "D:/gsrc/DebugLog.c",line 217,column 5,is_stmt,isa 0
            MOVL      @||localiAfeChannel||+2,XAR4 ; [CPU_ALU] |217| 
    	.dwpsn	file "D:/gsrc/DebugLog.c",line 218,column 5,is_stmt,isa 0
            MOVL      @||localSyslogChannel||+2,XAR4 ; [CPU_ALU] |218| 
    	.dwpsn	file "D:/gsrc/DebugLog.c",line 222,column 5,is_stmt,isa 0
    $C$DW$227	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$227, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$227, DW_AT_name("iAfeLog_Init")
    	.dwattr $C$DW$227, DW_AT_TI_call
    
            LCR       #||iAfeLog_Init||     ; [CPU_ALU] |222| 
            ; call occurs [#||iAfeLog_Init||] ; [] |222| 
    	.dwpsn	file "D:/gsrc/DebugLog.c",line 224,column 5,is_stmt,isa 0
            MOV       AL,#1000              ; [CPU_ALU] |224| 
            MOVB      AH,#0                 ; [CPU_ALU] |224| 
            MOVL      XAR4,#||PrintDemoLines|| ; [CPU_ARAU] |224| 
    $C$DW$228	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$228, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$228, DW_AT_name("Scheduler_AddTaskMs")
    	.dwattr $C$DW$228, DW_AT_TI_call
    
            LCR       #||Scheduler_AddTaskMs|| ; [CPU_ALU] |224| 
            ; call occurs [#||Scheduler_AddTaskMs||] ; [] |224| 
    $C$DW$229	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$229, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$229, DW_AT_TI_return
    
            LRETR     ; [CPU_ALU] 
            ; return occurs ; [] 
    	.dwattr $C$DW$225, DW_AT_TI_end_file("D:/gsrc/DebugLog.c")
    	.dwattr $C$DW$225, DW_AT_TI_end_line(0xe2)
    	.dwattr $C$DW$225, DW_AT_TI_end_column(0x01)
    	.dwendentry
    	.dwendtag $C$DW$225

    此器件的具体信息:

    看起来正确

    如果我反汇编 OBJ 文件、我会看到这一点

    DebugLog_Init:
       LCR          0x000000
    
       MOVW         DP, #0x0
    
       MOVL         @0x0, XAR4
       MOVW         DP, #0x0
    
       MOVL         @0x2, XAR4
       MOVL         @0x2, XAR4
       LCR          0x000000
    
       MOV          @AL, #0x03e8
    
       MOVB         AH, #0x0
       MOVL         XAR4, #0x000000
    
       LCR          0x000000
    
       LRETR     

    这看起来并不正确、但因为它只是缺少符号、我想是反汇编器、会丢弃未解析的符号

    现在、如果我对 out 文件运行 dis2000、我会发现错误的汇编器代码

    DebugLog_Init:
       LCR          0x08f38c
    
       MOVW         DP, #0x468
    
       MOVL         @0x26, XAR4
       MOVW         DP, #0x5f4
    
       MOVL         @0x3c, XAR4
       MOVL         @0x4, XAR4
       LCR          0x08f949
    
       MOV          @AL, #0x03e8
    
       MOVB         AH, #0x0
       MOVL         XAR4, #0x08ccf2
    
       LCR          0x08ef95
    
       LRETR 

    注意:【关闭主题】我在选择语言时、插入上述代码示例时、仍然错过了 ASM 选项。

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

    感谢您提供的所有信息。  不幸的是、我需要更多的信息。  对于包含函数 DebugDebug Log_Init 的源文件、 请遵循 如何提交编译器测试用例一文中的说明。

    谢谢。此致、

    -乔治

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

    下面是 pp 文件的 zip 文件、以及我在代码中使用某些段指令时使用的 cmd 文件。

    我做了一个干净的演示项目、其中显示了错误、告诉我您是否喜欢发送到以及如何发送。

    BTW。 从该模式来看、它看起来像编译器代码中的某个位置、有十六进制和十进制的混合。 看起来它插入新的 DP、当 off set 通过 0x64、而不是 64……;-)

    e2e.ti.com/.../Compiler_5F00_error_5F00_demo.zip

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

    很遗憾、您预处理了错误的文件。  请重试。  确保发送的源文件包含 函数 DebugDebug Log_Init 的实现。

    谢谢。此致、

    -乔治

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

    否我将生成问题的行移到 main 中、因此不再有名为 Log_Init 的函数。

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

    我看到一些看起来错误的东西。  但我怀疑我 看到了一个不同于你第一次遇到的问题。  与其处理可能是错误的问题、我想确定我正在处理正确的问题。  为此、我需要您基于源文件(而非 main.c)开发一个测试用例、 该文件包含函数 DebugDebug Log_Init 的实现。 对于该源文件、 请按照 如何提交编译器测试用例一文中的说明进行操作。

    确保包括所有编译器选项、就像编译器看到的那样。  在之前的文章中,您将显示这些选项...

    cl2000“--cmd_ffile=“diagnostic_options.opt“ -v28 -ml -mt --cla_support=cla_support=cla1 --float_support=fpu32 --tmu_support=tmu_support=tmu0 --vcu_support=vcu2 -mfp_mode=relaxed -cla_support=cla_cfg=“opt_file=“opt_cfg=“opt_cfg/file=“opt_cfg“ - link_cpu32 -link_cpu32 - link_cpu=“html=“/link_cpu0.library=“html=“html=“/link_cour=“opt=“html=“/link_cpu32 - link_cpu0“   

    但这 没有显示 --abi=eabi、它设置了 ABI(应用程序二进制接口)。  较旧的 COFFABI 和较新的 EABI 之间的数据页处理方式有所不同。  但肯定您使用 EABI、因为 C2000Ware 大约在 5-10 年前终止了对 COFFABI 的支持。

    谢谢。此致、

    -乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为此、我需要您基于 包含函数 DebugDebug Log_Init 实现的源文件(而不是 main.c)开发一个测试用例。  对于该源文件、 请按照 如何提交编译器测试用例一文中的说明进行操作。

    我确实开发了一个测试用例、其中我删除了所有不相关的代码、但我仍然看到了问题。

    我不明白调试 Log_Init 上的执着是关于什么。 但不要进行另一次时区轮换。 我将这些行移回一个名为 Log_Init 的函数中,甚至将其分离到另一个文件中,因为出于某种原因,你不需要 main.c

    我做了一个 makefile 来构建它,所以你可以清楚地看到所有的选项,是的-- abi 选项在我的第一篇文章中缺失,抱歉,是的,我们构建到 eabi。

    我把它们都打包在 e2e.ti.com/.../DP_5F00_bug_5F00_demo.zip DP_bug_demo.zip 中

    DUT.zip 中的是具有 Debuglog_init 函数 e2e.ti.com/.../DUT.zip 的 pp 文件

    maefile 还包含反汇编步骤

    当我 查看反汇编时、我看到了以下内容:

    DebugLog_Init:
       MOV          @AL, #0x5a5a
    
       MOV          @AH, #0xa5a5
    
       MOVW         DP, #0x2c5
    
       MOVL         @0x2e, ACC
       MOVW         DP, #0x2c0
    
       MOVL         @0x24, ACC
       MOVL         @0x2c, ACC
       MOVL         @0x34, ACC
       NOP          
       MOVL         @0x3c, ACC
       MOVL         @0x4, ACC
       MOVL         @0xc, ACC
       MOVW         DP, #0x2c1
    
       MOVL         @0x1c, ACC
       MOVL         @0x24, ACC
       MOVL         @0x2c, ACC
       MOVL         @0x34, ACC
       NOP          
       MOVL         @0x3c, ACC
       MOVL         @0x4, ACC
       MOVL         @0xc, ACC
       MOVL         @0x14, ACC
       MOVW         DP, #0x2c2
    
       SPM          #0
       MOVL         @0x1c, ACC
       MOVL         @0x24, ACC
       MOVL         @0x2c, ACC
       MOVL         @0x34, ACC
       MOVL         @0x3c, ACC
       MOVL         @0x4, ACC
       MOVL         @0xc, ACC
       MOVL         @0x14, ACC
       MOVW         DP, #0x2c3
    

    很明显、DP 更新发生得太晚了。

    注意:我插入的 NOP 可能有所帮助、但没有任何区别。

    我在几个版本的编译器上尝试了所有级别的优化、包括最新的、所有这些都有相同的结果。

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

    感谢您的测试用例。  我能够重现同样的结果。  我提交了问题 EXT_EP-13386 来对此进行调查。  欢迎点击这个链接。

    感谢您为提供测试案例所做的所有工作。  话虽如此、我相信满足这一要求.

    对于包含函数 DebugDebug Log_Init的源文件、 请按照文章 如何提交编译器测试用例中的说明进行操作。

    ...将需要少得多的工作。

    谢谢。此致、

    -乔治

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

    好的、谢谢。 我会跟着它。

    但在此期间、我会询问您是否找到了解决方法、或者至少找到了一种方法来检测(1) 我们在代码中的其他位置是否存在此问题。 以便让我了解最新信息。

    (1)除手动检查所有汇编器代码外;-)

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

    Martin、

    请参阅 Jira 中的解决方法详细信息以跟踪此问题:
        https://sir.ext.ti.com/jira/browse/EXT_EP-13386

    此致、
    GREG

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

    谢谢:-)