Spa*_*ark 4 assembly arm windows-ce visual-studio neon
由于全世界专家的迅速回复,我很乐意提出堆栈溢出问题:-)我想清楚地解释我面临的问题.
我想做什么?
我的环境
我面临的问题
异常'数据中止'(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函数,一切都很顺利.希望我已经提供了所有信息来帮助解决这个问题.请帮我找出异常的确切原因.在调用霓虹灯功能之前是否需要执行任何步骤,或者应遵循任何其他特殊的霓虹灯指令?
在此先感谢您的帮助.
火花
你正在推动函数的序言中的寄存器:
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)