visual tag studio snippets snippet crear code autocompletar visual-studio assembly arm windows-ce neon

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?

  1. Deseo evaluar la instrucción NEON a través de varios ejemplos disponibles en línea para escribir algunos algoritmos por mi cuenta.
  2. 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

  1. 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.
  2. Estoy ejecutando mi código en la placa MAPALMM EVAP3530 EVM.
  3. 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

  1. 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