NEON指令在Windows CE 7上引发异常

Spa*_*ark 4 assembly arm windows-ce visual-studio neon

由于全世界专家的迅速回复,我很乐意提出堆栈溢出问题:-)我想清楚地解释我面临的问题.

我想做什么?

  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驱动程序(stream_interface.dll),它使用这个静态库在1280X720X2字节缓冲区上执行memcpy操作.我正在使用一个简单的应用程序(Neon_Test.exe)动态加载和卸载此驱动程序.

我面临的问题

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

异常'数据中止'(0x4):Thread-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
....
Run Code Online (Sandbox Code Playgroud)

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
.......
Run Code Online (Sandbox Code Playgroud)

我的汇编来源

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
Run Code Online (Sandbox Code Playgroud)

由布鲁斯·Eitman,根据文章http://geekswithblogs.net/BruceEitman/archive/2008/05/19/windows-ce--finding-the-cause-of-a-data-abort.aspx,位置在哪里异常发生了

00064   eb000000     bl          GetTickCount
Run Code Online (Sandbox Code Playgroud)

但我确信GetTickCount()中没有问题,如果我删除MemcpyCustom函数,一切都很顺利.希望我已经提供了所有信息来帮助解决这个问题.请帮我找出异常的确切原因.在调用霓虹灯功能之前是否需要执行任何步骤,或者应遵循任何其他特殊的霓虹灯指令?

在此先感谢您的帮助.

火花

Igo*_*sky 5

你正在推动函数的序言中的寄存器:

stmfd   sp!, {r4-r12,lr}
Run Code Online (Sandbox Code Playgroud)

但最后没有相应的弹出,也没有返回指令.因此,执行将继续执行函数之后的任何代码,接下来发生的事情是任何人的猜测.放在BGE之后的以下内容应解决问题:

ldmfd   sp!, {r4-r12,pc}
Run Code Online (Sandbox Code Playgroud)

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

MemcpyCustom
  PLD [r1, #0xC0]
  VLDM r1!,{d0-d7}
  VSTM r0!,{d0-d7}
  SUBS r2,r2,#0x40
  BGE MemcpyCustom
  BX lr
Run Code Online (Sandbox Code Playgroud)