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.

[参考译文] PROCESSOR-SDK-AM64X:TI 循环运行缓慢

Guru**** 2487425 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1438706/processor-sdk-am64x-ti-loop-cycle-runs-slow

器件型号:PROCESSOR-SDK-AM64X

工具与软件:

您好、我运行的是默认 TI 示例、而不使用操作系统。  

我正在   C:\ti\default\mcu_plus_sdk_am243x_09_02_00_50\tools\ccs_load\am243x\sciclient_ccs_init.release.out 下使用   

然后、我将 在   C:\ti\default\mcu_plus_sdk_am243x_09_02_00_50\examples\hello_world 下运行 hello_world 示例

C:\ti\default\mcu_plus_sdk_am243x_09_02_00_50\examples\hello_world\am243x-evm\r5fss0-0_nortos

键入 hello_world.c


我添加了此函数  

static void __attribute__( naked) test_mem_read_stack_loop()

asm 易失性(
"LDR r0、=100000000\n"//将立即值加载到 r0中
"LDR R1、=memval\n"//将 memval 的地址加载到 R1中
"。 Lloop4:\n"
"Push{LR}\n"//保存链接寄存器
"LDR R2、[R1、#0]\n"//从 R1的存储器中加载值
"subs r0、r0、#1\n"//递减环路计数器
"弹出{LR}\n"//恢复链接寄存器
"BNE。 Lloop4\n"//如果 r0不为零、则循环
"bx LR\n"//从函数返回
".ltorg\n"
);
}

它是组件代码、基本上循环  10000000次、   

uint64_t StartTime、EndTime、finaltime;

StartTime = ClockP_getTimeUsec ();

test_mem_read_stack_loop();

EndTime = ClockP_getTimeUsec ();

finaltime = EndTime - StartTime   



我得到的最终时间= 1001038us 。  此数字对于800MHz 是否合理?

800MHz =  每 秒800,000,000条指令

1 (LDR)+ 1 (sub)+ 1 (bne)= 3个周期

1001038*1000  纳秒/ 100000000 *3 (指令)= 3.3纳秒/每指令。  我的计算结果是否正确?
  

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

    您好、Jun:

    请确认以上测试 是在释放模式还是调试模式下完成的?

    如果您已经在释放模式下运行了上述测试用例、请尝试将上述函数保留在 TCM 存储器中并查看结果?

    此致、

    Anil。

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

    您好!

    我认为在这种情况下、发布/调试不会有太大差异、因为循环被编码为汇编语言。 优化器也不会因此而妨碍它。

    循环包含5条指令:

    我认为每100,000,000个环路的周期为1001038us (1,001,038,000ns)、即每环路~10ns。 你的数字在上面有些模糊,正如你的代码所说的100,000,000 ,下一行是  "基本上循环10,000,000次",你最终用"/ 100,000,000 *3"计算。 我假设100,000,000对观测到的~1是正确的、对吧?

    你需要非常仔细地研究 R5f TRM 的"周期时序和互锁行为"一章、以了解每条指令将需要多长时间、并考虑潜在的双问题。

    "LDR R2..." "子服务器 r0..." 例如、双问题案例 B1符合条件、因此这些指令中的一条需要进行零周期计数。

    PUSH/ POP 和 LDR 的周期时序取决于当时基址寄存器的对齐情况。 您可以在按下/弹出时检查"sp"的值。 您还需要知道"memval"所在的位置。

    正如我说过的您的另一篇文章、这当然是一项有趣的练习、但可能需要一些时间才能充分理解。

    修改循环可能更容易、以包括一系列具有更明显时序的指令、并查看 ns/周期是否收敛为具有较长循环的1.25ns/周期。 或者、您也可以摆弄 LDR 和 push/pop 的基地址、并将影响考虑在内。

    此致、

    Dominic