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.

[参考译文] TMS320F28034:memcpy()生成无限递归周期

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1049754/tms320f28034-memcpy-generate-infinite-recursive-cycle

器件型号:TMS320F28034
主题中讨论的其他器件:C2000WARE

我看不清楚

main():
3ecdb1:FE08 ADDK SP、#8
504 memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(uint32)&RamfuncsLoadSize);
3ecdb9:28A90270 MOV @AL、#0x0270
3ecdbb:28A80000 MOV @AH、#0x0000
3ecdbd:8F008800 MOVL XAR4、#0x008800
3ecdbf:8F7F0AFF MOVL XAR5、#0x3f0Aff
3ecdc1:767F0AFC LCR memcpy

其中

8 /*如果符合以下条件,则允许进行修改*/
memcpy():
3f0afc:767F0AFC LCR memcpy
10 /**/
3f0afe:0006 LRETR

memcpy 称为 memcpy 和溢出堆栈。

我犯了什么错误?

编译器 TI v18.12.1.LTS

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

    您好、Sergey、

    请提供您的观察结果的更多详细信息吗? 您是否使用标准 memcpy 命令将函数复制到 C2000Ware 闪存示例中的 RAM 中并注意到这种行为、或者您是否正在执行特殊操作?

    您能告诉我 RamfuncsRunStart、RamfuncsLoadStart、RamfuncsLoadSize 是如何在链接器命令文件中定义的吗?

    谢谢、

    Ashwini

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

    你(们)好

    我包括 从标准编译器库中获取、其中

    _code_access void * memcpy (void *__ restrict s1、
    const void *_restrict s2、size_t n);

    链接器脚本中

    存储器

    第0页:
    RAML1    :origin = 0x008800,length = 0x000400
    FLASHFEDC   :origin = 0x3EC002,length = 0x007FDA
    (笑声)

    ramfuncs:load = FLASHFEDC,
    运行= RAML1、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    PAGE = 0

    如果我将复制数据的大小更改为255或更小、则 memcpy 编译为内联代码并正常工作

    505 memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、255);
    3ecdbc:76FF0AF5 MOVL XAR7、#0x3f0af5
    3ecdbe:8F008800 MOVL XAR4、#0x008800
    3ecdc0:F6FE RPT #254
    3ecdc1:2484 || PREAD *XAR4++,*XAR7

    ===================================================================================================================================

    我查看了我的另一个项目、其中 memcpy 反汇编正确:

    memcpy():
    3f16d1:5200 CMPB AL、#0x0
    40{
    3f16d2:A8AB MOVL @P、XAR4
    3f16d3:C5A4 MOVL XAR7、@XAR4
    51表示(rn = 0;rn < nn;rn++)* RTO ++=* rffrom ++;
    3f16d4:6107 SB C$L2、EQ
    3f16d5:88A9 MOVZ AR6、@AL
    3f16d6:DE81 SubB XAR6、#1
    C$L1:
    3f16d7:5C85 MOVZ AR4、* XAR5++
    3f16d8:7C87 MOV * XAR7++、AR4
    3f16d9:000EFFFE BANZ -2、AR6--
    52 if (nn == n) return (to);
    C$L2:
    3f16db:88A9 MOVZ AR6、@AL
    3f16dc:0FA6 cmpl acc、@XAR6
    3f16dd:610F SB C$L5、EQ
    3f16de:5300 CMPB AH、#0x0
    3f16df:610D SB C$L5、EQ
    3f16e0:9DFF ADDK AH、#-1
    3f16e1:5CA8 MOVZ AR4、@AH
    C$L3:
    3f16e2:76BFFFFE MOVL XAR6、#0x3ffe
    64 * RTO ++=* rffrom ++;
    C$L4:
    3f16e4:9285 MOV AL、* XAR5++
    3f16e5:9687 MOV * XAR7++、AL
    63表示(RN = 0;RN < 65535;RN++)
    3f16e6:000EFFFE BANZ -2、AR6--
    65 * RTO ++=* rffrom ++;
    3f16e8:9285 MOV AL、* XAR5++
    3f16e9:9687 MOV * XAR7++、AL
    61表示(tmp = 0;tmp <上部;tmp++)
    3f16ea:000CFFF8 BANZ -8、AR4--
    69返回(到);
    C$L5:
    3f16ec:A9A4 MOVL @XAR4、P
    3f16 ed:0006 LRETR

    可能需要包含或定义其他内容?

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

    您好、Sergey、

    我将跟进编译器团队并告知您。

    谢谢、

    Ashwini

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

    我解决了这个问题。

    常用项目文件的某个文件夹中有一个 rts2800_ml.lib 文件。  我不知道是谁和为什么要将此文件添加到公共文件中...

    在旧工程中、它被排除在编译之外。 我也从当前工程中的编译中排除 、并且 memcpy 开始正确编译。

    虽然 memcopy 的数据大小小于256、但我无法注意到这种肮脏的把戏