【问题标题】:Windows CE 6.0 replace memcpy Cortex A8Windows CE 6.0 替换 memcpy Cortex A8
【发布时间】:2014-09-01 14:46:39
【问题描述】:

我正在使用 Freescale i.Mx51,并希望将 Windows CE 6.0 memcpy 函数替换为基于 NEON 的 memcpy 函数。

我在 ARM 主页 (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.html) 上找到了一些应该如何工作的代码。

我的第一个问题是:我在哪里可以找到我的平台构建器项目中的 memcpy 代码以及如何更改代码?我找到了一个教程 (http://blogs.msdn.com/b/ce_base/archive/2007/01/15/replacing-a-coredll-component-in-yamazaki.aspx) 来替换 coredll 中的淋浴器,但是页面太旧了,没有截图了。

我尝试对 memcpy 做同样的事情,但我没有所有屏幕截图就卡住了。

第二个问题是:我是否必须做更多的事情来复制一些数据或者这些汇编代码是否足够:

NEONCopyPLD
      PLD [r1, #0xC0]
      VLDM r1!,{d0-d7}
      VSTM r0!,{d0-d7}
      SUBS r2,r2,#0x40
      BGE NEONCopyPLD

也许有人以前做过同样的事情,或者知道如何更改 memcpy 代码。

最好的问候 延斯

【问题讨论】:

  • 在后一点上,尝试使用该代码将memcpy 17 字节放入堆栈上的缓冲区中,看看会发生什么... ;)
  • 我的 NEON memcpy 有 344 行长 :)

标签: windows arm windows-ce memcpy neon


【解决方案1】:

您的代码很可能由于对齐错误而崩溃。

您应该使用 vld1.8 和 vst1.8 来避免这种情况。

此外,您应该检查开头的大小和对齐条件,然后转到单独优化的部分。

最后但同样重要的是,将目标对齐到 64 字节并在每次迭代中复制 64 字节以实现最大数据吞吐量。

您需要了解的不是 NEON,而是通过 ARM 的控制流和缓存行为。

【讨论】:

    【解决方案2】:

    您可以通过重新构建自己的 coredll 版本来替换它,但这很棘手,并且需要对构建系统有很好的了解。您还应该考虑默认情况下 CE 6 不会在上下文切换上保存 NEON 寄存器,这将需要 BSP 中的一些额外支持。 也许解释为什么要在 Windows CE 上对 memcpy 进行 iper 优化可能会导致有人提出更好的解决方案。

    【讨论】:

    • 是的,我在本教程blogs.msdn.com/b/ce_base/archive/2007/01/15/… 上卡住了“我们要执行的命令很简单——我们要设置本地环境,切换到我们的新“淋浴器”所在的目录库源是,并执行一个干净的构建。这些步骤是使用我们放入批处理文件的命令完成的:“因为没有包含信息的屏幕截图。我们正在发布很多东西,希望它能加快我们的系统速度。
    • 要加快系统上的 blitting,您需要优化显示驱动程序,而不是 memcpy。根本不允许显示驱动程序使用 memcpy。如果是您自己的代码使用 memcpy 来实现 blitting,那么在那里更改它会更容易。更改此函数的行为可能会因对齐问题等而影响系统的其他部分。而且,正如我在上一篇文章中告诉您的,CE6 不会在上下文切换时保存 NEON 寄存器。
    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多