gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:52:56 24 4
gpt4 key购买 nike

由于世界各地专家的及时答复,我很高兴在堆栈溢出中提问:-) 我想清楚地解释我面临的问题。

我想做什么?

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

  • 我的环境
  • 我正在使用 Platform Builder for Windows CE 7.0 在 Visual Studio 2008 上编译 NEON 指令集。最新平台构建器支持NEON指令编译。
  • 我在 OMAP3530 Mistral EVM 板上运行我的代码。
  • 我创建了一个简单的静态库 (NEONLIB.lib),其中包含用于执行所需操作的 NEON 指令。我创建了简单的流驱动程序 (stream_interface.dll),它使用这个静态库在 1280X720X2 字节缓冲区上执行 memcpy 操作。我正在使用一个简单的应用程序 (Neon_Test.exe) 动态加载和卸载此驱动程序。

  • 我面临的问题
  • 操作系统启动后,我将手动启动此应用程序并遵循收到的异常。

  • 异常“数据中止”(0x4):Thread-Id=047d002a(pth=c049c990),Proc-Id=00400002(pprc=8a3425e0)“NK.EXE”,VM-active=05420012(pprc=c049c990)“N334c04a1” '
    PID:00400002 TID:047D002A PC=ef135120(stream_interface.dll+0x00005120) RA=ef133c18(stream_interface.dll+0x00003c18) SP=d0f3fc84, BVA=​​00000

    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 函数,一切都会好起来的。希望我已经提供了所有信息来帮助解决这个问题。请帮我找出异常的确切原因。在调用 NEON 函数之前是否需要执行任何步骤或应遵循任何其他特殊的 NEON 指令?

    在此先感谢您的帮助。

    Spark

    最佳答案

    您正在函数的序言中推送寄存器:

    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

    关于visual-studio - NEON 指令在 Windows CE 7 上引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14957476/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com