[visual-studio]霓虹灯指示 Windows CE 7 上引发的异常

发布时间: 2014/3/1 3:18:02
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我很高兴地在堆栈溢出由于从专家世界迅速答复问宽:-)我想解释清楚我面对的问题。

我想做什么呢?

  1. 我想要评估通过各种例子可用在线按顺序设置上我自己写一些算法的霓虹灯指令。
  2. 用于评估目的,我在做 memcpy 样本可在 ARM 官方网站的使用。这是链接http://infocenter.arm.com/help/index.jsp?topic=/ com.arm.doc.faqs/ka13544.html

我的环境

  1. 我正在收集上与 Windows CE 7.0 为平台生成器的 Visual Studio 2008 设置霓虹灯指令。最新的平台生成器支持霓虹灯指令汇编。
  2. 我正在我的代码 OMAP3530 Mistral EVM 板上。
  3. 我创建了简单的静态库 (NEONLIB.lib),其中包含霓虹灯的指令执行所需的操作。我创建了简单流驱动程序 (stream_interface.dll) 使用此静态库执行 memcpy 操作上 1280 X 720 X 2 个字节的缓冲区。我加载和卸载此驱动程序动态地使用一个简单的应用程序 (Neon_Test.exe)。

我面对的问题

  1. 一次 OS 的靴子,我要发起此应用程序手动和之后收到的异常。

异常 '数据中止' (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=ef133.... 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 .... 8(stream_interface.dll+0x00003.... 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 .... 8) SP = d0f3fc84,BVA = 00000000

NeonMemcpy 是我驱动程序调用霓虹灯函数中的函数。

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

由布鲁斯 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 函数,一切都好。希望我已经让所有的信息来帮助解决这一问题。请帮我找出异常的确切原因。需要霓虹灯函数在调用之前做的任何步骤或应遵循任何其他特别霓虹灯说明吗?

提前谢谢你的帮助。

火花

解决方法 1:

在函数的 prolog 中,正在推动登记册:

stmfd   sp!, {r4-r12,lr}

但有没有相应的 pop 结束时,并没有返回指令。所以对任何代码发生在该函数后继续执行下, 一步会发生什么是任何人的猜测。以下,放置后 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
官方微信
官方QQ群
31647020