2010-12-07 52 views
0

L'architecture de processeur avec laquelle je travaille comporte un compteur d'horodatage que je veux lire pour effectuer des mesures de performance. Le compteur d'horodatage est mappé en mémoire à l'adresse 0x90000008. J'ai utilisé la routine suivante pour lire la valeur du compteur de temps , mais la différence dans l'impression est toujours zéro. Quelqu'un d'une idée ce que je suis manquant?Lecture à partir du registre mappé en mémoire

char* const ADDR = (char *) 0x90000008; 

unsigned long cycle_count_val() { 

    unsigned long res; 

    asm volatile (

    "set ADDR, %%l0   \n\t" 
    "ld [%%l0], %0   \n\t" 

    : "=r" (res) 
    : 
    : "%l0" 
); 

    return res; 
} 

.... 
unsigned long start = cycle_count_val(); 
execute_benchmark(); 
unsigned long end = cycle_count_val(); 

printf("Benchmark performance(in clock cycles) = %ld \r\n", end-start); 

Un grand merci pour votre aide, Phil

+0

Etes-vous sûr votre horodatage est un 'char'? – ruslik

+0

non, c'est une valeur de 30 bits dans un emplacement de mémoire de 32 bits (MSB sont 0) –

Répondre

6

Je ne pense pas que vous devez recourir à Assember - pourquoi tu ne peux pas lire:

uint32_t tbr = (*((uint32_t volatile *) 0x90000008)) 
+0

juste '# define' l'expression entière comme' now'. – ruslik