visual-studio - tag - visual studio code html shortcut
La instrucción NEON arroja una excepción en Windows CE 7 (1)
Está presionando registros en el prólogo de la función:
stmfd sp!, {r4-r12,lr}
Pero no hay pop correspondiente al final, y no hay instrucción de retorno. Entonces, la ejecución continúa con el código que ocurra después de la función, y lo que suceda después es una incógnita. Lo siguiente, colocado después del BGE debería solucionar el problema:
ldmfd sp!, {r4-r12,pc}
EDITAR: Por cierto, dado que en realidad no está usando r4-r12 en la función, no necesita guardarlos. Tampoco necesita guardar d0-d7 ya que se consideran volátiles. Entonces puede eliminar stmfd
y reemplazar ldmfd
por solo bx lr
.
MemcpyCustom
PLD [r1, #0xC0]
VLDM r1!,{d0-d7}
VSTM r0!,{d0-d7}
SUBS r2,r2,#0x40
BGE MemcpyCustom
BX lr
Me complace hacer preguntas en desbordamiento de pila debido a la pronta respuesta de expertos de todo el mundo :-) Deseo explicar claramente el problema que estoy enfrentando.
¿Qué deseo hacer?
- Deseo evaluar la instrucción NEON a través de varios ejemplos disponibles en línea para escribir algunos algoritmos por mi cuenta.
- Para fines de evaluación, estoy haciendo uso de las muestras de memcpy disponibles en el sitio web oficial de ARM. Aquí está el enlace http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.html .
Mi entorno
- Estoy compilando la instrucción NEON establecida en Visual Studio 2008 con Platform Builder para Windows CE 7.0. El último desarrollador de plataforma es compatible con la compilación de instrucciones NEON.
- Estoy ejecutando mi código en la placa MAPALMM EVAP3530 EVM.
- Creé una biblioteca estática simple (NEONLIB.lib) que contiene instrucciones NEON para realizar la operación requerida. He creado un controlador simple Stream (stream_interface.dll) que usa esta biblioteca estática para realizar la operación memcpy en un búfer de 1280X720X2 bytes. Estoy cargando y descargando este controlador dinámicamente usando una aplicación simple (Neon_Test.exe).
Problema que estoy enfrentando
- Una vez que arranca el SO, estoy lanzando esta aplicación manualmente y siguiendo la excepción que recibo.
Excepción ''Anulación de datos'' (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 es una función en mi controlador que llama a la función NEON.
Archivo 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
....
Archivo 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
.......
Mi fuente de ensamblaje
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
Basado en el artículo de Bruce Eitman, http://geekswithblogs.net/BruceEitman/archive/2008/05/19/windows-ce--finding-the-cause-of-a-data-abort.aspx , la ubicación donde la excepción ocurre fue
00064 eb000000 bl GetTickCount
Pero estoy seguro de que no hay ningún problema en GetTickCount (), si elimino la función MemcpyCustom, todo va bien. Espero haber dado toda la información para ayudar a resolver este problema. Por favor, ayúdame a averiguar el motivo exacto de la excepción. ¿Debo seguir algunos pasos antes de llamar a las funciones de neón o seguir otras instrucciones especiales de neón?
Gracias de antemano por tu ayuda.
Chispa