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.

[参考译文] CCS/TMDXIDK5718:memcpy 失败

Guru**** 2036780 points
Other Parts Discussed in Thread: TMDXIDK5718, AM5716
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/858017/ccs-tmdxidk5718-memcpy-fails

器件型号:TMDXIDK5718
主题中讨论的其他器件: AM5716

工具/软件:Code Composer Studio

你(们)好

我正在使用"TMDXIDK5718"为 MPU (A15)创建引导程序。
如下所示、当描述四个进程时、只有第四个 memcpy 未正确处理。
在运行时停止。

请告诉我错误的地方。

#include 
#include 

/**
* main.c
*/
int main (void)
{

uint8_t buf[500];
uint8_t * setPos = buf;

memset (buf、0x00、500);

memcpy (setPos、"12345678"、4); //(1)确定
memcpy (setPos、"12345678"、8); //(2)确定
memcpy (setPos+1、"23456789"、4);//(3)确定
memcpy (setPos+1、"23456789"、8);//(4) NG

返回0;
} 

使用以下设置创建工程。

下图显示了执行处理至处理3时的存储器。
它设置正确。

下图显示了何时执行进程4。
调试器退出。

谢谢你。

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

    您好、Koji、

    在我看来、您的 C 程序不正确。 我不确定您确切需要做什么、但请注意 setPos、当指向0x80018EBC 时setPos、+ 1指向0x80018EBD

    我建议您探索下面的 memcpy 程序示例并与之保持一致。

    https://www.includehelp.com/c-programs/memcpy-function-in-c-with-example.aspx

    此致、
    帕维尔

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

    感谢你的答复。

    “SetPos + 1”是有意的,所以没有问题。
    更简单地介绍问题。
    在以下代码中、出于某种原因未处理(4)。
    调试器停止。
    它只能在我的环境中发生。
    请告诉我您是否有要检查的设置。

    #include 
    #include 
    
    
    /**
    * main.c
    */
    int main (void)
    {
    
    uint8_t buf[100];
    
    memset (buf、0x00、100);
    
    memcpy (buf、"123456789"、4);//(1)正常
    memcpy (buf、"123456789"、5);//(2)正常
    memcpy (buf、"123456789"、6);//(3)确定
    memcpy (buf、"123456789"、7);//(4) NG
    memcpy (buf、"123456789"、8);//无法访问
    
    返回0;
    } 

    谢谢你。

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

    Koji、

    我的方面工作正常。 执行所有 memcpy 操作。 请查看以下屏幕截图:


    您可以放置一个 printf 函数和 HW 断点、如我发送的屏幕截图中所示。

    对于 Cortex-A15中的裸机示例、您可以参阅以下 CCS 设置:

    http://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/index_examples_demos.html#id47

    此致、
    帕维尔

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

    software-dl.ti.com/.../index_examples_demos.html

    如果您按照此过程操作,则会重现问题。

    查看"拆卸"
    80000264:FA00002C blx memcpy
    执行该行会停止调试器。
    下面显示的对话框将始终显示。


    请注意、7字节复制失败、但8字节复制成功。


    此外、如果您创建自己的 memcopy 函数"myMemcpy"、则7字节复制成功。


    还有其他需要检查的地方吗?

    谢谢你。

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

    Koji、

    很抱歉、但我无法理解您的问题。

    请向我提供重现此问题所使用的确切步骤吗?

    此致、
    帕维尔

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

    感谢你的答复。
    步骤如下。

    --------------------------------------------------

    CCS 版本:7.4.0.00015

    1.启动 CCS、右键点击 Project Explorer、然后创建一个新的"CCS Project"。
    2.使用以下设置创建项目。
    ・目标=“AM571x-Cortex A15:AM5716”
    ・Project name = Test
    ・编译器版本= GNU v6.3.1 (Linaro)
    ・Tool-chain =默认值
    ・项目模板和示例=空项目(使用 main.c)


    3.将以下代码写入"main.c"。

    #include 
    #include 
    
    
    /**
    * main.c
    */
    int main (void)
    {
    
    uint8_t buf[100];
    
    memset (buf、0x00、100);
    
    memcpy (buf、"123456789"、4);//(1)正常
    memcpy (buf、"123456789"、5);//(2)正常
    memcpy (buf、"123456789"、6);//(3)确定
    memcpy (buf、"123456789"、7);//(4) NG
    memcpy (buf、"123456789"、8);//无法访问
    
    返回0;
    }
    

    4.构建并生成“Test.out”。
    5.连接到 EVM。 连接到"Texas Instruments XDS100v2USB Debug Probe_0/CortexA15_0"
    6.加载“Test.out”。
    7.步骤执行将在位置(4)终止调试器。

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

    [引用用户="koji ***"]7. 步骤执行将在位置(4)终止调试器。[/quot]

    请 在此处提供更多详细信息。 您是否收到任何错误消息? 您能否提供问题的屏幕截图?

    在我的一侧、当我通过按钮"步越(F6)"逐步执行代码时、我可以观察到只有最后一个 memcpy ()运算(在我们的 usecase 中为第5个)被执行、而4个 memcpy ()运算被跳过。 但我能够达到第5个 memcpy()并且能够通过分步执行成功执行它。 请查看下面的屏幕截图。

    请注意、我使用的是 CCS v9.1.0、GNU v7.2.1 (Linaro)工具链和 New–> CCS Project -> Basic Examples->Hello World

    此致、
    帕维尔

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

    感谢你的答复。

    "7. 步骤执行将在位置(4)终止调试器。"
    此时不会显示错误消息。
    请参阅第一个帖子以获取屏幕截图。
    ("反汇编窗口"在"无调试上下文"停止)
    ->下图显示了何时执行进程4。
       调试器退出。


    我发现了一些新东西。
    在项目创建设置中将编译器版本设置为“TI v16.9.11.TLS”时,所有 memcpy 都已正确执行。
    "GNU v7.3.1"和"GNU v6.3.1 (Linaro)"将失败。

    "当使用 GNU 编译器执行 memcpy 函数时、无法复制7个字节"
    这就是问题所在。

    幸运的是、有一种权变措施。
    ・使用您自己的 memcpy 函数
    ・使用 TI 编译器

    但是,当事业不明时,我感到不安,所以我想从根本上解决。
    请告诉我是否还有其他需要检查的东西。

    谢谢你。

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

    Koji、

    我建议您尝试使用 CCS v9.1.0。 使用此 CCS 版本和 GNU v7.2.1 (Linaro)齿链、我能够处理具有7个字节的 memcpy()函数。 请参阅以下截屏截图以供参考。第一个是在 memcpy (7)执行之前、第二个是在执行之后。


    此致、
    帕维尔

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

    确认 memcpy 与"CCS v9.1.0"和"GNU v7.2.1"组合正确工作。
    非常感谢。

    原因是什么?
    "CCS v7.3.1"的 GNU 编译器是否存在问题?

    我想知道原因、因为我必须将原因告诉客户。

    谢谢你。

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

    Koji、

    我同样成功地执行了具有7个字节的 memcpy()函数、CCS v9.1.0和 GNU v7.3.1 (Linaro)。

    此致、
    帕维尔

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

    这似乎只发生在我的环境中、您认为原因是什么?
    我想您可以比我更好地猜测原因。
    请告诉我、是否有任何必要的确认项目来确定原因。

    您是否还使用 TMDXIDK5718进行了验证?

    谢谢你。

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

    Koji、

    我怀疑使用旧版本的 CCS 是问题所在。

    对于具有7个字节、CCS v9.1.0和 GNU v7.3.1 (Linaro)的 memcpy()函数,您有什么结果?

    此致、
    帕维尔

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

    我再次尝试了、但在 CCSv9中失败了。
    以前成功了。
    结果不稳定。
    电路板侧可能存在问题。

    我尝试了以下组合、但所有"7byte memcpy"都失败了。
    ・CCSv7.4.0 x GNUv7.3.1
    ・CCSv7.4.0 x GNUv6.3.1(Linaro)
    ・CCSv9.1.0 x GNUv6.3.1(Linaro)
    ・CCSv9.1.0 x GNUv7.2.1(Linaro)
    ・CCSv9.1.0 x GNUv7.3.1(Linaro)


    执行"7byte memcpy"、并在没有响应时按下 SUSPEND 按钮。
    然后它在下捕获位置停止。
    我不知道这意味着什么。
    它对您有用吗?

    谢谢你。

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

    Koju、

    关于"CCSv9.1.0 x GNUv7.3.1(Linaro)"、您能否提供最新的 C 文件?

    当您进行分步执行时、结果是什么? 如果您有任何错误、您可以对该错误进行屏幕截图吗?

    [引用 user="koji ***"]是否有对您有用的信息?

    不客气。

    此致、
    帕维尔

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

    提供包含 C 文件的完整项目。
    这是一个在“CCSv9.1.0 x GNUv7.3.1 (Linaro)”中出现“7byte memcpy”故障的项目。

    谢谢你。

    e2e.ti.com/.../TEST20191202.zip

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

    Koji、

    我已经在 CCS v9.1.0和 GNU v7.3.1 (Linaro)的两个 TI 电路板上测试了“7byte memcpy”:

    1. AM572x IDK rev1.3B、XDS100v2 JTAG 仿真器

    AM572x EVM revA3A、USB560M 20引脚 JTAG 仿真器


    个电路板上的“7byte memcpy”操作均成功。

    我观察到只有最后一个 memcpy()操作被执行。 但代码永远不会卡住、也不会因错误而失败。 让我们以您的代码为例:

    memcpy (buf、"123456789"、4);  //(1)正常
    memcpy (buf、"123456789"、5);  //(2)正常
    memcpy (buf、"123456789"、6);  //(3)确定
    memcpy (buf、"123456789"、7);  //(4) NG -->根本不执行、但不会发生卡滞或错误
    memcpy (buf、"123456789"、8);  //无法访问 -->它是可访问的,但它是唯一执行的


    从该代码中仅执行最后一个"8byte memcpy"、其余4个 memcpy()函数将被跳过。

    如果我删除最后一个"8byte memcpy",则会成功执行"7byte memcpy"(现在是最后一个)。  

    memcpy (buf、"123456789"、4);  //(1)正常
    memcpy (buf、"123456789"、5);  //(2)正常
    memcpy (buf、"123456789"、6);  //(3)确定
    memcpy (buf、"123456789"、7);  //(4) NG -->执行成功、无卡滞、无错误
    //memcpy (buf、"123456789"、8);  //无法访问


    如果我只留下第一个"4byte memcpy"函数、则它已成功执行。


    总之,我建议您只使用一个 memcpy()函数。


    此致、
    帕维尔