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.

[参考译文] TMS320F28386D:CLA 未正确更新结构的一部分

Guru**** 2455560 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1473371/tms320f28386d-cla-not-updating-properly-part-of-a-structure

器件型号:TMS320F28386D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

您好!

我有一个由 C28x 内核软件触发的 CLA 任务。

任务的代码非常简单:

__interrupt void step(void)
{
    __mdebugstop();

    GPIO_togglePin(40U);

    G_U.V1  = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER0);
    G_U.V2  = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER0);
    G_U.Vex = ADC_readResult(ADCDRESULT_BASE, ADC_SOC_NUMBER0);
    G_U.i   = exec_count;

    if (exec_count == 36)
    {
        exec_count = 0;
    }
    else
    {
        exec_count++;
    }
}

操作变量的定义与 C28x 内核代码中的定义类似:

#pragma DATA_SECTION(G_U,"Cla1DataRam")
G_ExternalInputs G_U;

#pragma DATA_SECTION(exec_count,"Cla1ToCpuMsgRAM")
int16_t exec_count;

结构类型定义如下:

typedef struct {
  uint32_T V1;                         /* '<Root>/V1' */
  uint32_T V2;                         /* '<Root>/V2' */
  uint32_T Vex;                        /* '<Root>/Vex' */
  int32_T i;                           /* '<Root>/i' */
  uint32_T PinProg;                    /* '<Root>/PinProg' */
} G_ExternalInputs;

当我运行代码时、变量被适当更新、除了 G_U 结构中保持为0的 V1元素。

我 使用调试器运行代码以尝试理解、相应的汇编代码如下所示:

我必须承认、我不理解的一件奇怪的事情是分解是由.word 0x7BC0替代的行。

但是、无论如何、当我一步一步地运行它时、MR0在 MMOVZ16 MR0、@xb20之后确实包含了正确的值

但是 在 MMOV32 @0x9808、MR0之后的第一个 NOP 变为0、因此0被存储在结构项中。

该结构的其他变量不会发生这种行为、在 NOP 执行时、我看到 MR0寄存器会随 MLSR/MMOV 的执行而相应地发生变化。

不知道那里发生了什么,有什么想法?

Cl é ment

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

    尊敬的  Cl é ment:

    字 0x7BC0行(仅存在于 V1反汇编中)应仅为值0x7BC0在内存中分配空间。 我不知道编译器为什么具有此行。 我将在编译器团队中循环、看看是否可能是由于此原因造成的。 此外、您是否为项目启用了任何编译器优化?

    此致、

    Delaney

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

    您好、Delaney、

    不是真的、我们仅使用-o0。

    但无论如何、问题不是优化、因为我说过汇编代码的行为也不像我所描述的行为中看到的那样具有预期的行为。

    Cl é ment

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

    我研究了一位、存储器在相应的指令地址处显示(从 CLA 侧读取):

    所以您可以看到、0x7BC07625不正确、它应该是0x7BC003C。

    奇怪的是、我更改了构建选项以保留 asm 文件、其中的指令是正确的:

    奇怪的是、从 CPU 端读取的内存似乎没有问题:

    编辑:

    经过进一步的测试、除了在某个点修改相应的存储器地址之外没有任何其他操作后、它开始工作。

    我很生气、因为我不能再重复这个问题、也没有真正的解释。

    是不是内存插槽被卡住了?

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

    让我们回到第一篇文章中的这句话。

    Unknown 说:
    我必须承认、我不理解的一件奇怪的事情是该行被.word 0x7BC0替代。

    我认为编译器不会将其放在这里。  还有另一个反汇编器附带名为的编译器 dis2000 .  它是相同的 \bin 加载目录作为编译器 cl2000 .  运行类似以下内容的命令:

    dis2000 executable_file.out > disassembly.txt

    检查拆解情况。  地址0x9024显示的内容 .word 0x7BC0 ?  我怀疑没有。  这意味着问题发生在编译完成和您在调试器中查看反汇编时之间。

    谢谢。此致、

    -George.

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

    您好、George:

    确实没有。

    说实话、我有点迷路了、应该是什么错的、我在传递这个球之前检查了是否我的代码没有混乱的 CLA DataRAM、但找不到任何东西。

    我在第二篇文章中强调的问题已经消失了、但我对我没有解释错误的事实感到有点恼火。

    Cl é ment

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

    您好!

    请注意,由于周末延长(2月17日假期),客人可能会在下周的星期二之前收到回复。

    谢谢

    Ki

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

    尊敬的  Cl é ment:

    这似乎是内存问题。 我有几个问题:

    1.是否根据 C2000ware 中给出的文件修改了链接器 cmd 文件?

    2.能否检查映射文件并验证 G_ExternalInputs 结构的每个部分在内存中的位置? 在您的器件上、LSRAM0-7都可由 CLA 访问、但您可以通过检查 LSxMSEL 和 LSxCLAPGM 寄存器来验证哪个被授予了 CLA 权限?

    3.你正在进行闪存构建,这是正确的吗? 如果是、您能否验证整个 Cla1ProgLoadSize 和 Cla1ConstLoadSize 是否正在运行时复制?

    此致、

    Delaney

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

    尊敬的 Delaney:

    1. 是的、我确实做到了。
    2. 该代码位于 LS2中、CLA 具有正确的权限。
    3. 没有、我正在进行 RAM 构建

    Cl é ment

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

    尊敬的 Cl é ment

    好的、你能够通过链接器 cmd 和映射文件发送、这样我就可以看一下吗? 或者对于链接器 cmd、您可以展示您所更改内容的片段吗?

    此致、

    Delaney

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

    尊敬的 Delaney:

    链接器命令文件:

    CLA_SCRATCHPAD_SIZE = 0x100;
    --undef_sym=__cla_scratchpad_end
    --undef_sym=__cla_scratchpad_start
    
    MEMORY
    {
       /* BEGIN is used for the "boot to SARAM" bootloader mode   */
       BEGIN            : origin = 0x000000, length = 0x000002
       BOOT_RSVD        : origin = 0x000002, length = 0x0001AF     /* Part of M0, BOOT rom will use this for stack */
       RAMM0            : origin = 0x0001B1, length = 0x00024F
       RAMM1            : origin = 0x000400, length = 0x0003F8     /* on-chip RAM block M1 */
    
    //   RAMM1_RSVD       : origin = 0x0007F8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       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
       RAMLS2_3         : origin = 0x009000, length = 0x001000
       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 = 0x000FF8
    //   RAMGS15_RSVD     : origin = 0x01CFF8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       /* Flash sectors */
       FLASH0           : origin = 0x080000, length = 0x002000	/* on-chip Flash */
       FLASH1           : origin = 0x082000, length = 0x002000	/* on-chip Flash */
       FLASH2           : origin = 0x084000, length = 0x002000	/* on-chip Flash */
       FLASH3           : origin = 0x086000, length = 0x002000	/* on-chip Flash */
       FLASH4           : origin = 0x088000, length = 0x008000	/* on-chip Flash */
       FLASH5           : origin = 0x090000, length = 0x008000	/* on-chip Flash */
       FLASH6           : origin = 0x098000, length = 0x008000	/* on-chip Flash */
       FLASH7           : origin = 0x0A0000, length = 0x008000	/* on-chip Flash */
       FLASH8           : origin = 0x0A8000, length = 0x008000	/* on-chip Flash */
       FLASH9           : origin = 0x0B0000, length = 0x008000	/* on-chip Flash */
       FLASH10          : origin = 0x0B8000, length = 0x002000	/* on-chip Flash */
       FLASH11          : origin = 0x0BA000, length = 0x002000	/* on-chip Flash */
       FLASH12          : origin = 0x0BC000, length = 0x002000	/* on-chip Flash */
       FLASH13          : origin = 0x0BE000, length = 0x002000	/* on-chip Flash */
       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
       RESET           	: origin = 0x3FFFC0, length = 0x000002
    
       CLA1_MSGRAMLOW   : origin = 0x001480,   length = 0x000080
       CLA1_MSGRAMHIGH  : origin = 0x001500,   length = 0x000080
    }
    
    
    SECTIONS
    {
       codestart        : > BEGIN
       .text            : >> RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3 | RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7
       .cinit           :  > RAMGS4
       .switch          : >> RAMLS1
       .reset           : > RESET, TYPE = DSECT /* not used, */
    
    	.ppdata        	: {} > RAMGS7
    	.cio        	: {} > RAMGS8
    
       .stack           : > RAMD0
    #if defined(__TI_EABI__)
       .bss             : >> RAMM1 | RAMD0 | RAMD1
       .bss:output      : >> RAMM1 | RAMD0 | RAMD1
       .init_array      : >> RAMM1 | RAMD0 | RAMD1
       .const           : >> RAMM1 | RAMD0 | RAMD1
       .data            : >> RAMM1 | RAMD0 | RAMD1
       .sysmem          : > RAMLS1
    #else
       .pinit           : >> RAMM1 | RAMD0 | RAMD1
       .ebss            : >> RAMM1 | RAMD0 | RAMD1
       .econst          : >> RAMM1 | RAMD0 | RAMD1
       .esysmem         : >> RAMM1 | RAMD0 | RAMD1
    #endif
    
       ramgs0 : > RAMGS0, type=NOINIT
       ramgs1 : > RAMGS1, type=NOINIT
    
       MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM, type=NOINIT
       MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM, type=NOINIT
       MSGRAM_CPU_TO_CM   > CPUTOCMRAM, type=NOINIT
       MSGRAM_CM_TO_CPU   > CMTOCPURAM, type=NOINIT
    
       dclfuncs           : > RAMLS1
    
        /* CLA specific sections */
       Cla1Prog         : > RAMLS2_3
    
       Cla1ToCpuMsgRAM  : > CLA1_MSGRAMLOW, type=NOINIT
       CpuToCla1MsgRAM  : > CLA1_MSGRAMHIGH, type=NOINIT
       Cla1DataRam      : >> RAMLS4
    
       /* CLA C compiler sections */
       //
       // Must be allocated to memory the CLA has write access to
       //
       CLAscratch       :
                         { *.obj(CLAscratch)
                         . += CLA_SCRATCHPAD_SIZE;
                         *.obj(CLAscratch_end) } >  RAMLS4
    
       .scratchpad     : > RAMLS4
       .bss_cla		    : > RAMLS4
       .const_cla	    : > RAMLS4
       cla_shared      : > RAMLS4
    
        .TI.ramfunc : {} > RAMGS0
       Excitation_Array : > RAMGS1
    
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

    我没有问题出现时的映射文件、因此无法向您提供。

    就像我解释的那样、这个问题已经不是那么清楚了、但我真的不喜欢那些神奇地消失的东西、所以我很感激找到一个解释。

    此致、

    Cl é ment

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

    尊敬的  Cl é ment:

    很抱歉我的答复被推迟。 只是为了验证、这与你看到问题时所使用的链接器 cmd 版本相同吗? 我看到链接器 cmd 文件没有重大问题。  

    您是否看到 .word 0x7BC0指令显示在工程的工作版本的反汇编中? 或者、读入 V1的行是否具有与读入 G_U 结构其他部分类似的 MLSL32指令?

    此致、

    Delaney

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

    尊敬的 Delaney:

    不用担心。

    是的、这是同一个链接器命令文件。

    对于这两个版本、计算机上的拆卸都很好。

    或者说调试器中的地址。 当它工作时、调试器中的反汇编操作 与其他读取操作相同。

    Cl é ment

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

    尊敬的 Cl é ment

    Delaney 目前不在办公室、她将在下周返岗时尽快与您联系。 感谢您的耐心等待!

    此致、

    Allison

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

    尊敬的  Cl é ment:

    好的、我当时正在尝试查看 .word 0x7BC0指令是否是导致该问题的原因。 这里我想的是、 V1所在的行(错误)是反汇编中唯一一个具有.word 0x7BC0指令且缺少 MLSL32 MR0 #16的段。 因此、我当时想该行中的存储器以某种方式损坏。 但是、如果 CCS Disassembly 视图在工作案例中包含该行、则肯定不是问题。  

    我仍然认为这是一个存储器问题、是链接器分配的内容位于错误的位置、还是您的 存储器在设备上的该位置损坏。 不幸的是,因为你不能让问题再次出现,我不知道如何确定它到底是什么。 如果能够让它再次显示、请将错误的项目发送到此处、以便我尝试复制它。 很抱歉、我没有更准确的答案。  

    此致、

    Delaney

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

    尊敬的 Delaney:

    是的,这也是我相信的,我试图找到一个解释,但没有能够复制它,我们肯定是卡住的。

    我正在使用的评估板可能已经开始老化。

    感谢您的帮助、

    此致

    Cl é ment