tsk: no he dicho que en este caso sea más rápido. Depende de la velocidad del hardware y del software y del tamaño de la tabla.
Lo que si puedes ver en tu comparativa es que el CRC16 soft es casi tan rápido como el CRC32 hard.
Y el CRC32 soft no es más lento que el CRC16 por soft en un micro de 32 bit.
Por lo tanto la opción software no es tan lenta como ponías en un mensaje anterior.
Un saludo.
Ve lo que pusiste, por eso mi incognita.
El cálculo CRC por software puede llegar a ser más rápido que por hardware si trabaja con tablas
Si lees el pdf, viene el diagrama del algoritmo que usaron, por eso lo puse, para que vieran contra que lo están comparando. Es claro que tu como fabricante siempre vas a alterar de alguna forma los resultados de tus pruebas e incluso comparar con los peores algoritmos.
Aquí está la estimación para el algoritmo que pusiste (que al final es similar al crc32)
8000f4c: 8802 ldrh r2, [r0, #0] ; 1
8000f4e: ea82 2213 eor.w r2, r2, r3, lsr #8 ; 1
8000f52: 4907 ldr r1, [pc, #28] ; (8000f70 <CalculateCRC16+0x2c>) 2
8000f54: f931 2012 ldrsh.w r2, [r1, r2, lsl #1] ; 2
8000f58: ea82 2303 eor.w r3, r2, r3, lsl #8; 1
8000f5c: b29b uxth r3, r3 ; 1
8000f5e: 4621 mov r1, r4 ;1
8000f60: 3002 adds r0, #2 ;1
8000f62: 1e4c subs r4, r1, #1 ; 1
8000f64: 2900 cmp r1, #0 ;1
8000f66: d1f1 bne.n 8000f4c <CalculateCRC16+0x8> ;1
Tomando en cuenta que el sitio de ARM coloca
EOR Rd, Rn, <op2> dode <op2> puede ser
#0xXXXXX - Valor inmediato
Rm - Registro
Rm, LSL #8 - Shift inmediato
Rm, LSL Rs
Con un tiempo de ejecución de 1 ciclo de reloj. Tendrías un aproximado de 13 ciclos de reloj, lo que te daría un aproximado de 0.3698ms por cada 2048 palabras, lo que al final te representaría alrededor de 2.22ms para procesar una imagen, contra los 1.542ms por usarlo en hardware.
Ahora vamos a la práctica:
Los dos en las mismas condiciones, 1000 repeticiones dentro de un ciclo for
CRC16 time: 601ms
CRC32 time: 286ms
Porque subió el tiempo en CRC32, con respecto a los anteriores, porque estoy tomando encuenta todo el ciclo for.
¿Porqué el tiempo en el CRC16 sube más de lo que se espera (0.3698 a 0.601)?
Tengo la impresión que es aquí.
8000f52: 4907 ldr r1, [pc, #28] ; (8000f70 <CalculateCRC16+0x2c>) 2
8000f54: f931 2012 ldrsh.w r2, [r1, r2, lsl #1] ; 2
Hay dependencia, y como estos trabaja a través de un pipeline le tenemos que agregar unos cuantos ciclos mas.
Saludos