世界中の専門家からの迅速な返信により、スタック オーバーフローで質問できることをうれしく思います:-) 私が直面している問題を明確に説明したいと思います。
私は何をしたいですか?
- 自分でアルゴリズムを作成するために、オンラインで入手できるさまざまな例を使用して NEON 命令セットを評価したいと考えています。
- 評価目的で、ARM 公式 Web サイトで入手可能な 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 ボードでコードを実行しています。
- 必要な操作を実行するための NEON 命令を含む単純な静的ライブラリ (NEONLIB.lib) を作成しました。このスタティック ライブラリを使用して 1280X720X2 バイト バッファで memcpy 操作を実行する単純なストリーム ドライバ (stream_interface.dll) を作成しました。シンプルなアプリケーション (Neon_Test.exe) を使用して、このドライバーを動的にロードおよびアンロードしています。
私が直面している問題
- 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 関数を削除すると、すべてがうまくいきます。この問題の解決に役立つすべての情報を提供できたことを願っています。例外の正確な理由を見つけるのを手伝ってください。ネオン関数を呼び出す前に何らかの手順を実行する必要がありますか? または他の特別なネオン命令に従う必要がありますか?
よろしくお願いします。
スパーク