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

时间:2013-02-19 12:27:01

标签: visual-studio assembly arm windows-ce neon

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

我想做什么?

  1. 我希望通过在线提供的各种示例来评估NEON指令集,以便自己编写一些算法。
  2. 出于评估目的,我正在使用ARM官方网站上提供的memcpy样本。这是链接http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.html
  3. 我的环境

    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)动态加载和卸载此驱动程序。
    4. 问题我正面临

      1. 操作系统启动后,我会手动启动此应用程序并遵循我收到的异常。
      2. 异常'数据中止'(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函数,一切都很顺利。希望我已经提供了所有信息来帮助解决这个问题。请帮我找出异常的确切原因。在调用霓虹功能之前是否需要执行任何步骤?或者应该遵循任何其他特殊的霓虹灯指示?

        提前感谢您的帮助。

        火花

1 个答案:

答案 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