4

由于来自世界各地的专家的及时回复,我很高兴在堆栈溢出中提出问题:-) 我希望清楚地解释我面临的问题。

我想做什么?

  1. 我希望通过在线提供的各种示例来评估 NEON 指令集,以便自己编写一些算法。
  2. 出于评估目的,我正在使用 ARM 官方网站上提供的 memcpy 示例。这是链接http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.html

我的环境

  1. 我正在使用 Platform Builder for Windows CE 7.0 在 Visual Studio 2008 上编译 NEON 指令集。最新的平台构建器支持 NEON 指令编译。
  2. 我在 OMAP3530 Mistral EVM 板上运行我的代码。
  3. 我创建了一个简单的静态库 (NEONLIB.lib),其中包含执行所需操作的 NEON 指令。我创建了简单的流驱动程序 (stream_interface.dll),它使用这个静态库对 1280X720X2 字节缓冲区执行 memcpy 操作。我正在使用一个简单的应用程序 (Neon_Test.exe) 动态加载和卸载此驱动程序。

我面临的问题

  1. 操作系统启动后,我将手动启动此应用程序并遵循收到的异常。

异常“数据中止”(0x4):线程 ID=047d002a(pth=c049c990),Proc-Id=00400002(pprc=8a3425e0)“NK.EXE”,VM-active=05420012(pprc=c04a1344)“Neon_Test.exe ' PID:00400002 TID:047D002A PC=ef135120(stream_interface.dll+0x00005120) RA=ef133c18(stream_interface.dll+0x00003c18) SP=d0f3fc84, BVA=​​00000000

NeonMemcpy 是我的驱动程序中调用 NEON 函数的函数。

Stream_Interface.map 文件

....
0001:000029f0       ?NeonInit@@YAHXZ           100039f0 f   Neon_Process.obj
0001:00002bb4       ?NeonMemcpy@@YAXXZ         10003bb4 f   Neon_Process.obj
0001:00002c58       NKDbgPrintfW               10003c58 f   coredll:COREDLL.dll
0001:00002c68       SetLastError               10003c68 f   coredll:COREDLL.dll
....

Neon_Process.cod 文件

.......
; 108  :    MemcpyCustom((void*)g_pOUTVirtualAddr, (void*)g_pINPVirtualAddr, 1280 * 720 * 2);

00050   e5951000     ldr         r1,[r5]
00054   e1a04000     mov         r4,r0
00058   e5950004     ldr         r0,[r5,#4]
0005c   e3a02ae1     mov         r2,#0xE1000
00060   eb000000     bl          MemcpyCustom

; 109  :    RETAILMSG(1, (L"Time for Copy using Neon %d\r\n", GetTickCount() - dwStartTime));

00064   eb000000     bl          GetTickCount
00068   e1a03000     mov         r3,r0
.......

我的汇编源

AREA    omap_neoncoding, CODE, READONLY

EXPORT  MemcpyCustom

INCLUDE omap_neoncoding.inc

MemcpyCustom
stmfd   sp!, {r4-r12,lr}
NEONCopyPLD
PLD [r1, #0xC0]
VLDM r1!,{d0-d7}
VSTM r0!,{d0-d7}
SUBS r2,r2,#0x40
BGE NEONCopyPLD

END

根据 Bruce Eitman 的文章http://geekswithblogs.net/BruceEitman/archive/2008/05/19/windows-ce--finding-the-cause-of-a-data-abort.aspx,发生异常是

00064   eb000000     bl          GetTickCount

但我确信 GetTickCount() 没有问题,如果我删除 MemcpyCustom 函数,一切都会好起来的。希望我已经提供了所有信息来帮助解决这个问题。请帮助我找出异常的确切原因。在调用霓虹灯功能或任何其他特殊的霓虹灯指令之前我需要做任何步骤吗?

在此先感谢您的帮助。

火花

4

1 回答 1

5

您正在函数的序言中推送寄存器:

stmfd   sp!, {r4-r12,lr}

但是最后没有对应的pop,也没有return指令。因此,执行将继续执行到函数之后发生的任何代码,接下来发生的事情是任何人的猜测。以下放在 BGE 之后应该可以解决问题:

ldmfd   sp!, {r4-r12,pc}

编辑:顺便说一句,由于您实际上并没有在函数中使用 r4-r12 ,因此您不需要保存它们。您也不需要保存 d0-d7,因为它们被认为是易失的。因此,您可以删除stmfd并替换ldmfdbx lr.

MemcpyCustom
  PLD [r1, #0xC0]
  VLDM r1!,{d0-d7}
  VSTM r0!,{d0-d7}
  SUBS r2,r2,#0x40
  BGE MemcpyCustom
  BX lr
于 2013-02-19T12:54:56.270 回答