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.
工具/软件: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 编译器
但是,当事业不明时,我感到不安,所以我想从根本上解决。
请告诉我是否还有其他需要检查的东西。
谢谢你。
确认 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”故障的项目。
谢谢你。
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()函数。
此致、
帕维尔