由于来自世界各地的专家的及时回复,我很高兴在堆栈溢出中提出问题:-) 我希望清楚地解释我面临的问题。
我想做什么?
- 我希望通过在线提供的各种示例来评估 NEON 指令集,以便自己编写一些算法。
- 出于评估目的,我正在使用 ARM 官方网站上提供的 memcpy 示例。这是链接http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.html。
我的环境
- 我正在使用 Platform Builder for Windows CE 7.0 在 Visual Studio 2008 上编译 NEON 指令集。最新的平台构建器支持 NEON 指令编译。
- 我在 OMAP3530 Mistral EVM 板上运行我的代码。
- 我创建了一个简单的静态库 (NEONLIB.lib),其中包含执行所需操作的 NEON 指令。我创建了简单的流驱动程序 (stream_interface.dll),它使用这个静态库对 1280X720X2 字节缓冲区执行 memcpy 操作。我正在使用一个简单的应用程序 (Neon_Test.exe) 动态加载和卸载此驱动程序。
我面临的问题
- 操作系统启动后,我将手动启动此应用程序并遵循收到的异常。
异常“数据中止”(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 函数,一切都会好起来的。希望我已经提供了所有信息来帮助解决这个问题。请帮助我找出异常的确切原因。在调用霓虹灯功能或任何其他特殊的霓虹灯指令之前我需要做任何步骤吗?
在此先感谢您的帮助。
火花