volatile uint32_t * DWT_CTRL = (uint32_t *)0xE0001000;
volatile uint32_t * DWT_CYCCNT = (uint32_t *)0xE0001004;
Luego hay que activar el contador con el bit 0 del registro de control de la DWT y ponerlo en cero:
*DWT_CTRL |= 1;
*DWT_CYCCNT = 0;
Y listo. Cuando pongan un breakpoint o halteen el procesador, analicen el contenido de *DWT_CYCCNT para ver cuántos ciclos de clock pasaron hasta ese momento, o si tienen un visor de expresiones en su IDE pueden escribir algo como (float)*DWT_CYCCNT/(float)SystemCoreClock para ver directamente el tiempo en segundos. Luego le escriben cero al contador (*DWT_CYCCNT = 0;) por si necesitan reiniciarlo.--
-- Recibiste este mensaje porque estás suscripto al Grupo Google Embebidos32. Para postear en este grupo, escribe un email a embeb...@googlegroups.com. Para des-suscribirte, envía un email a embebidos32...@googlegroups.com. Para más opciones, visita el sitio del grupo en https://groups.google.com/d/forum/embebidos32?hl=es
---
Has recibido este mensaje porque estás suscrito al grupo "Embebidos32" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a embebidos32...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
Habría que leer la letra chica del manual, pero yo estimo que si un lee el contador antes del CALL y después del RET el OOO no debería ser un problema (que por otro lado lo más lógico es medirlos dentro de una función, que es como más probablemente se vaya a usar).
Por otro lado el OOO solo representa un problema en funciones cortas, donde +/- 1 ciclo pesa, en funciones grandes (las que vale la pena optimizar) no sé si sea un factor decisivo, si bien hay que saber que está ahí.
De hecho, ya poner la instrucción que hace la lectura del contador podría estar modificando el tiempo de ejecución si hilamos fino.
Habría que leer la letra chica del manual, pero yo estimo que si un lee el contador antes del CALL y después del RET el OOO no debería ser un problema (que por otro lado lo más lógico es medirlos dentro de una función, que es como más probablemente se vaya a usar).
Por otro lado el OOO solo representa un problema en funciones cortas, donde +/- 1 ciclo pesa, en funciones grandes (las que vale la pena optimizar) no sé si sea un factor decisivo, si bien hay que saber que está ahí.
Depende para que... Si lo que nos importa es la respuesta fina, ejemplo un PWM (ok, nadie hace un PWM con un A9, pero haganme la banca con el ejemplo) podemos terminar con un problema de jitter orrendo. Esto es extrapolable a cualquier situacion donde queramos tener tiempos precisos, no necesariamente cortos. Yo puedo querer una respuesta dentro de 40 segundos +/-10ps y para eso, la OOO presenta un verdadero probleema.
/* enable user-mode access to the performance counter*/
asm ("MCR p15, 0, %0, C9, C14, 0\n\t" :: "r"(1));
/* disable counter overflow interrupts (just in case)*/
asm ("MCR p15, 0, %0, C9, C14, 2\n\t" :: "r"(0x8000000f));
static inline unsigned int get_cyclecount (void)
{
unsigned int value;
// Read CCNT Register
asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(value));
return value;
}
Es justo el código que mandó Alfonso
El punto es como asegurar que get_cyclecount se ejecute " en orden "
SETEND.
Para lo que se quiere hacer se debe tener en cuenta que hay que inhabilitar/prevenir cualquier fuente de bifurcacion, (excepcion/interrupcion), ya que al modificar el orden de los bits, la ejecucion no prevista seguramente reiniciare al uP.
Atte