Me estoy topando con algunos problemas de velocidad en el ISR. Debido a la naturaleza de mi código, necesito agregar 20 valores (16 bits) en un ISR. El código se ve así
#define Element_size 4
#define Chunk_size 5
void add(void)
{
int i;
int j;
for (i=0;i<Element_Size;i++)
{
sum[i]=0;
for (j=0;i<Chunk_Size;j++)
{
sum[i]+=data[j*4+i];
}
}
}
Este no es el código exacto pero el algo es idéntico. (los datos se presentan como fragmentos con tamaño de 4, en este caso tengo 5 fragmentos de datos. Agrego el primer elemento de cada fragmento, luego el segundo elemento, etc.) Supongamos que la suma y los datos son globales. Esto lleva más tiempo del que tengo. Estoy buscando una solución para acelerar las cosas. Hasta ahora, puedo pensar en:
-
Mejore el algo: puedo hacer esto un turno (o sin un bucle) en lugar de dos, pero si cambian los tamaños de trozos (ahora una opción de tiempo de compilación), se interrumpirá. Haré esto como último recurso una vez que el código sea definitivo y no se esperen otros cambios.
-
Mover al ensamblaje: haré esto pero tomará tiempo, una opción viable
-
Haga la función en línea: Esto ahorrará algo de tiempo, pero no mucho, ya que la mayoría del tiempo se pasa durante la suma, lo haré de todos modos.
-
Use algún bloque de hardware para la suma: estoy usando la familia STM32F2 (Arm Cortex M3), tiene varias cosas buenas allí, pero no ALU. Miré las librerías crc, hash y cyrpto, pero no pude encontrar nada que salte y que pueda usarse como un sumador de hardware.
Especialmente, si uno de los maestros entre ustedes sugiere una forma asistida por hardware para hacer este cálculo, estaría en deuda. Estoy buscando una forma de hacer esto fuera de la caja, no solo la optimización de código. Esta es realmente la pregunta clave que tengo.