Hola.
He pensado mucho en lo escribiré jaja porque cada vez que analizaba el asm generado por el ccs, me cambiaba la perspectiva. En fin en vez de montar un discurso, mejor resumo el análisis:
en base a los 2 ejemplos montados por Gonzalo:
1) con punteros:
#include <18F2525.h>
#fuses HS
#use Delay(clock=20M)
short Matriz[32][128];
void Main()
{
long *P;
long A;
int16 espacio;
P=Matriz;
espacio=sizeof(Matriz);
for(A=0;A<=espacio;A++){
*P=0xFFFF;
P++;
}
delay_cycles(1);
}
no entiendo porque puntero es long ¿? Gonzalo el tamaño del puntero es independiente del tipo de datos que manejes.
en este caso vamos a rellenar bytes con 0xff, el código iría así:
#include <18F2525.h>
#fuses HS
#use Delay(clock=20M)
short Matriz[32][128];
void Main()
{
int *P;
long A;
int16 espacio;
P=Matriz;
espacio=sizeof(Matriz);
for(A=0;A<=espacio;A++){
*P=0xFF;
P++;
}
delay_cycles(1);
}
el tiempo: 1,95ms sigue alto. ¿porque? bueno es por el overhead o como lo llamo yo, el factor de multiplicación, que se monta en asm, el contador A se comprueba mediante restas, lo cuál aumenta el tiempo de cálculo y se ve reflejado al final del bucle.
2) con memset
#include <18F2525.h>
#fuses HS
#use Delay(clock=20M)
short Matriz[32][128];
void Main()
{
int16 espacio;
espacio=sizeof(Matriz);
delay_cycles(1);
}
Digamos que para este ejemplo, el compilador optimiza al máximo en asm con memset, la instrucción con menos factor de multiplicación es decfsz.
En ambos casos, el compilador usa Direccionamiento indirecto, el asunto es que en algunos casos puede no optimizar del todo.
Este estudio me llevó a una conclusión: mientras menos variables usemos para hacer calculos en un bucle, menos tiempo se llevará. porque el factor de multiplicación será menor, (y además que liberas preciada RAM)
pd: a lo que yo llamo factor de multiplicación es la misma operación de cálculo que tiene que hacer el pic en cada pasada del bucle.