Tengo una duda conceptual: ¿Qué significa "alta" densidad de código? ¿y por qué es tan importante?
Respuestas
¿Demasiados anuncios?Código de densidad se refiere vagamente a cuántas instrucciones del microprocesador que se necesita para realizar la acción solicitada, y la cantidad de espacio que cada instrucción ocupa. Generalmente hablando, el espacio menos una instrucción toma y el trabajo más que por la instrucción de que un microprocesador puede hacer, el más denso de su código.
Me doy cuenta de que usted ha etiquetado su pregunta con el 'brazo' de la etiqueta; me puede ilustrar código de densidad usando el BRAZO de instrucciones.
Digamos que usted quiere copiar un bloque de datos de un lugar en la memoria a otro. Conceptualmente, su alto nivel de código sería algo como esto:
void memcpy(void *dest, void *source, int count_bytes)
{
char *s, *d;
s = source; d = dest;
while(count_bytes--) { *d++ = *s++; }
}
Ahora un simple compilador para un simple microprocesador puede convertir esto en algo como la siguiente:
movl r0, count_bytes
movl r1, s
movl r2, d
loop: ldrb r3, [r1]
strb [r2], r3
movl r3, 1
add r1, r3
add r2, r3
sub r0, r3
cmp r0, 0
bne loop
(mi BRAZO está un poco oxidado, pero usted consigue la idea)
Ahora esta sería una muy simple compilador y un microprocesador simple, pero se puede ver en el ejemplo que estamos viendo en 8 instrucciones por cada iteración del bucle (7 si movemos el '1' a otro registrar y mover la carga fuera del bucle). Eso no es muy densa. Código de densidad también afecta al rendimiento; si tus ciclos son más largos porque el código no es densa, usted puede ser que necesite más caché de instrucciones para sostener el bucle. Más de caché de medios más caros, procesador, pero a la vez complejo de la instrucción decodificación de los medios más transistores para descifrar solicitada en la instrucción, por lo que es un clásico problema de ingeniería.
El BRAZO bastante bien en este sentido. Cada instrucción puede ser condicional, la mayoría de las instrucciones se puede aumentar o disminuir el valor de los registros, y la mayoría de las instrucciones, opcionalmente, puede actualizar el procesador de banderas. En el BRAZO y con un moderadamente útil compilador, el mismo bucle puede ser algo como esto:
movl r0, count_bytes
movl r1, s
movl r2, d
loop: ldrb r3, [r1++]
strb [r2++], r3
subs r0, r0, 1
bne loop
Como se puede ver, el bucle principal es ahora de 4 instrucciones. El código es más densa, ya que cada instrucción en el bucle principal no más. Esto generalmente significa que usted puede hacer más con una determinada cantidad de memoria, porque a menos de que se utiliza para describir la forma de realizar el trabajo.
Ahora nativo BRAZO código tenido a menudo la queja de que no era muy denso; esto es debido a dos razones principales: en primer lugar, de 32 bits es una muy "largo" de la instrucción, por lo que un montón de bits parecen estar bien para el más simple de instrucciones y, en segundo, el código conseguido hinchado debido a un BRAZO de la naturaleza: cada uno y cada instrucción es de 32 bits de largo, sin excepción. Esto significa que hay un gran número de 32-bit valores literales que no se puede cargar en un registro. Si yo quería cargar "0x12345678" en r0, ¿cómo puedo código de una instrucción que no sólo ha 0x12345678 en ella, sino que también describe "la carga de la literal a r0"? No hay bits a la izquierda sobre el código de la operación real. El BRAZO de carga literal de la instrucción es un poco interesante bestia, y el BRAZO ensamblador debe también ser un poco más inteligente de lo normal, montadores, porque tiene que "coger" estos tipos de instrucciones y el código como un valor que se almacena en el archivo de objeto y una indirecta de la carga de que la dirección a la que solicita el registro.
De todos modos, para responder a estas quejas, el BRAZO se vino arriba con el Pulgar modo. En lugar de 32 bits por instrucción, la instrucción de longitud es ahora de 16 bits para casi todas las instrucciones y 32 bits para las ramas. Hubo un par de sacrificios con el Pulgar modo, pero por lo general estos sacrificios son fáciles de hacer porque Pulgar tengo algo así como un 40% de mejora en la densidad del código sólo mediante la reducción de la instrucción de longitud.
El código de "densidad" de un conjunto de instrucciones es una medida de la cantidad de cosas que usted puede obtener en una determinada cantidad de memoria de programa, o cuántos bytes de memoria de programa que usted necesita para almacenar una determinada cantidad de funcionalidad.
Como Andrew Kohlsmith señalado, incluso en el mismo MCU, diferentes compiladores pueden obtener diferentes de código de densidad.
Usted puede disfrutar de la lectura "Los insectos del mundo de la informática" por Miguel Samek, el cual se compara una variedad de Mcu.