4

世界中の専門家からの迅速な返信により、スタック オーバーフローで質問できることをうれしく思います:-) 私が直面している問題を明確に説明したいと思います。

私は何をしたいですか?

  1. 自分でアルゴリズムを作成するために、オンラインで入手できるさまざまな例を使用して NEON 命令セットを評価したいと考えています。
  2. 評価目的で、ARM 公式 Web サイトで入手可能な memcpy サンプルを使用しています。リンクはhttp://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.htmlです。

私の環境

  1. Platform Builder for Windows CE 7.0 を使用して、Visual Studio 2008 で NEON 命令セットをコンパイルしています。最新のプラットフォーム ビルダーは、NEON 命令のコンパイルをサポートしています。
  2. OMAP3530 Mistral EVM ボードでコードを実行しています。
  3. 必要な操作を実行するための NEON 命令を含む単純な静的ライブラリ (NEONLIB.lib) を作成しました。このスタティック ライブラリを使用して 1280X720X2 バイト バッファで memcpy 操作を実行する単純なストリーム ドライバ (stream_interface.dll) を作成しました。シンプルなアプリケーション (Neon_Test.exe) を使用して、このドライバーを動的にロードおよびアンロードしています。

私が直面している問題

  1. OS が起動したら、このアプリケーションを手動で起動し、受け取った例外に従います。

例外 'Data Abort' (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 関数を削除すると、すべてがうまくいきます。この問題の解決に役立つすべての情報を提供できたことを願っています。例外の正確な理由を見つけるのを手伝ってください。ネオン関数を呼び出す前に何らかの手順を実行する必要がありますか? または他の特別なネオン命令に従う必要がありますか?

よろしくお願いします。

スパーク

4

1 に答える 1

5

関数のプロローグでレジスタをプッシュしています。

stmfd   sp!, {r4-r12,lr}

しかし、最後に対応する pop はなく、return 命令もありません。したがって、実行は関数の後にあるコードまで続き、次に何が起こるかは誰にもわかりません。以下を BGE の後に配置すると、問題が解決するはずです。

ldmfd   sp!, {r4-r12,pc}

EDIT:ちなみに、関数で実際に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
于 2013-02-19T12:54:56.270 に答える