2009-07-03 8 views
7

Intento medir los ciclos de reloj necesarios para ejecutar un código en el TMS32064x + DSP que viene con el OMAP ZOOM 3430 MDK. Miro la "Guía del programador" del chip DSP y dice que el DSP admite la función clock().¿Está roto el reloj time.h() en mi hardware?

Lo que sí es muy simple, sólo hago

start = clock(); 
for (i=0;i<100;i++){ 
    /* do something here */ 
} 
stop = clock(); 
total = stop - start; 

y luego poner los valores de "inicio", "parada" y "total" a una memoria compartida previamente asignado con el procesador ARM. Luego simplemente lo imprimo en la pantalla en el lado ARM.

El problema es que, en mis primeras ejecuciones, siempre obtengo el mismo valor "total", y luego en mis próximas ejecuciones siempre obtengo 0! Los valores "inicio" y "detener" van junto con el valor "total".

Lo más extraño es que parecen seguir un patrón de bits! Puse el resultado a continuación:

# ./sampleapp 
Total = 63744 
Start clock() value = 0x000000f9 
Stop clock() value = 0x0000f9f9 
# ./sampleapp 
Total = 4177526784 
Start clock() value = 0x00f9f9f9 
Stop clock() value = 0xf9f9f9f9 
# ./sampleapp 
Total clock cyles = 0 
Start clock() value = 0xf9f9f9f9 
Stop clock() value = 0xf9f9f9f9 

Aparentemente, reloj() no está funcionando bien, pero no estoy seguro si esto es debido a algo que he hecho mal o porque este tipo de cosas no es compatible con el hardware Yo tengo. Alguna idea de por qué esto esta pasando?

+0

¿Está absolutamente seguro de que el reloj está devolviendo estos valores? ¿Podría estar viendo un problema al acceder a la memoria compartida? – Vicky

+0

Para verificar esto, simplemente cambio uno de los valores de retorno, digamos "inicio", a un valor predefinido o al valor de la dirección de memoria compartida y obtengo lo correcto en la pantalla. –

+0

¿TI tiene algún ejemplo? Creo que con algunos de sus otros ejemplos de CODEC también estaban calculando un tiempo transcurrido de ejecución. No recuerdo si usaron la api clock(). Pero parece funcionar en el código de ejemplo del decodificador o codificador. – simon

Respuesta

2

De leer las preguntas hasta ahora, diría que el Cartel original tiene mucho más conocimiento de este asunto que los contribuyentes hasta ahora, y que la sospecha de que el reloj() está roto (o no es compatible, y devuelve resultado indefinido) en el DSP parece bastante probable.

+0

Empecé a creer que este es el caso también, por lo que no es necesario dejar esta pregunta como sin respuesta. Gracias a todos. –

+0

Qué humilde de usted Can Bal, que ha comenzado a aceptar creer que tiene mucho más conocimiento que los contribuyentes, y ha seleccionado como la respuesta la que dice eso. nice :) Estoy de acuerdo con que clock() también está roto, en OMAP. – ustun

+0

Parece que no eres la única persona que tiene problemas con clock(). Tal vez las soluciones proporcionadas aquí serán de ayuda. http://stackoverflow.com/questions/588307/c-obtaining-milliseconds-time-on-linux-clock-doesnt-seem-to-work-properly – Matt

0

Curiosamente, ¿Por qué necesita previamente asignado memoria compartida. ¿Por qué no intentas con una variable de pila normal? ¿Hay algo que me falta?

+2

Sí, le falta el hecho de que el código que se muestra se ejecuta en un procesador, el DSP, mientras que el código que muestra los resultados se ejecuta en otro, la CPU ARM principal. – unwind

0

Quizás necesite inicializar el reloj primero.

+0

Hasta donde yo sé, clock() toma el punto de referencia como la llamada inicial del ejecutable. No sé cómo inicializar/restablecer su valor manualmente. ¿Cómo haces eso? –

+0

Acabo de volver a leer las páginas man, el estándar no da forma de hacer tal cosa. – swegi

0

¿Cómo lo imprime? tal vez el problema es realmente mostrar el resultado?

en la mayoría de las plataformas clock_t es un long long. Si está utilizando printf con% d, puede obtener resultados variables, que es lo que está viendo.

+0

Imprimí sizeof (clock_t) y es 4. Se define como unsigned int. –

+0

Para persistir en esta línea, ¿su código de impresión es bueno? ¿Ha alimentado algunos valores con el mismo tipo de transferencia/impresión de memoria para verificar si se encuentran correctamente? – DevSolar

0

Suponiendo que las variables de inicio y final son del tipo 'clock_t', y su memoria compartida asume lo mismo al interpretar los números pasados, su problema no está en la llamada al reloj y su manejo del diferencia entre los tiempos de fin de final de inicio.

Creo que su problema está en la memoria compartida entre los dos. ¿Puede publicar el código para mostrar cómo está compartiendo memoria entre dos procesadores por separado?

+0

Simplemente uso el mismo método que utilicé a través de su muestra dmmcopy. MPU lateral de muestras: http://gitorious.org/ti-dspbridge/userspace/blobs/master/source/samples/mpu/src/dmmcopy/dmmcopy.c DSP muestra: http: // gitorious. org/ti-dspbridge/userspace/trees/master/source/samples/dsp Pero no creo que el problema sea con la memoria compartida, ya que puedo pasar valores codificados de DSP a la CPU correctamente en lugar de detener el inicio y variables totales –

0

Quizás podría utilizar un ensamblaje en línea para acceder a los registros de contador de la CPU directamente.

El TMS320C64x + tiene un registro de fecha y hora de 64 bits en TSCL, TSCH. El contador no está habilitado en el restablecimiento, primero debe escribir en el registro para iniciar el contador (¿tal vez este es el problema con clock?). Leer desde el registro no es del todo trivial ya que cada mitad debe leerse con una instrucción separada (y puede obtener interrupciones ...).

+0

No sabía que esta era una vieja pregunta. ¡Esto es lo que obtengo por no prestar atención a las marcas de tiempo! –

Cuestiones relacionadas