由于世界各地专家的迅速回复,我很乐意提出堆栈溢出问题:-)我希望清楚地解释我面临的问题。
我想做什么?
我的环境
问题我正面临
异常'数据中止'(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
....
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函数,一切都很顺利。希望我已经提供了所有信息来帮助解决这个问题。请帮我找出异常的确切原因。在调用霓虹功能之前是否需要执行任何步骤?或者应该遵循任何其他特殊的霓虹灯指示?
提前感谢您的帮助。
火花
答案 0 :(得分:5)
你正在推动函数的序言中的寄存器:
stmfd sp!, {r4-r12,lr}
但最后没有相应的弹出,也没有返回指令。因此,执行将继续执行函数之后的任何代码,接下来发生的事情是任何人的猜测。放在BGE之后的以下内容应解决问题:
ldmfd sp!, {r4-r12,pc}
编辑:顺便说一下,由于你实际上并没有在函数中使用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