¿Cuántas líneas de código C (promedio) corresponden a 1Ko de memoria programable?

4

Me gustaría saber cuántas líneas de código C en promedio corresponden a 1Ko de memoria programable para microcontroladores PIC18F

¿O cuántas líneas de instrucciones de montaje?

    
pregunta aqww

2 respuestas

11

Tomemos algunos ejemplos del mundo real. Escribí un programa en C simple, que creo que representa el código C típico. Algunos podrían argumentar de una manera u otra que no lo hacen, pero creo que lo demostraré.

Aquí está el código C:

unsigned short m [20];

int main()
{
    unsigned char a, x, i;
    unsigned short b, y;
    unsigned long c, z;

    a = b = c = 0;

    for (i=0; i < 20; i++)
    {
        a++;
        b++;
        c++;

        x = a * 3;
        y = b * 3;
        z = c * 3;

        if (a > 50)
        {
            a = 0;
        }

        m[i] = a / (b / (c - z) * x) + i;
    }
}

Además del PIC18F de 8 bits solicitado por el OP, también lo compilé para otros tres procesadores: un 8051 de 8 bits, un PIC16F de 8 bits y un PIC32 de 32 bits, y para cada uno tomé un vistazo al código de desensamblaje para obtener el número de instrucciones y el número de bytes para cada línea de código C. Debido a la longitud, decidí no publicar el código de desensamblaje aquí.

Para el código C anterior, el PIC18F utilizó 168 instrucciones y 336 bytes de código (todas las instrucciones de la máquina tenían una longitud de dos bytes). Sin embargo, eso no incluye algunas rutinas de ayuda, ya que el PIC18F, por ejemplo, no tiene una instrucción de división de hardware, por lo que se realiza una llamada de subrutina para eso. Por supuesto, estas rutinas de ayuda se comparten para todo el código en un programa. Así que los ignoraré, ya que probablemente afecten el tamaño del código en un programa real en un pequeño porcentaje.

El PIC16F utilizó 272 instrucciones y 476 bytes de código (todas las instrucciones de la máquina en el PIC16F tienen una longitud de 14 bits, así que las convertí a bytes). Al igual que el PIC18F, el PIC16F no tiene una instrucción de división de hardware, por lo que también utiliza rutinas de ayuda que no se incluyeron en el recuento.

El 8051 utilizó 99 instrucciones y 175 bytes de código, o un promedio de 1.77 bytes por instrucción de máquina. Al igual que el PIC18F, el 8051 no tiene una instrucción de división de hardware, por lo que también utiliza rutinas auxiliares que no se incluyeron en el recuento.

El PIC32 utilizó 68 instrucciones y 272 bytes de código. Todas las instrucciones de la máquina en el PIC32 toman 4 bytes, a diferencia de, por ejemplo, el 8051, donde las instrucciones pueden tener una longitud variable: 1, 2 o 3 bytes.

Hay 11 líneas de código ejecutable en mi programa C. Así que eso equivale a 15.2 instrucciones por línea de C para el PIC18F; 24.7 instrucciones para el PIC16F; 9 instrucciones para el 8051; y 6.2 instrucciones para el PIC32.

En cuanto a los bytes del programa por línea de código, los números son 30.5 bytes para el PIC18F; 43,3 bytes para el PIC16F; 15,9 bytes para el 8051; y 24.7 bytes para el PIC32. Entonces, el 8051 gana en términos de la menor cantidad de bytes por línea de código C.

Sin embargo , para los tres compiladores PIC, no estaba usando las versiones optimizadas (tienen tres versiones de cada compilador: gratis, estándar y profesional). Yo estaba usando el libre. Microchip afirma que los compiladores profesionales pueden reducir el espacio de código en un 60%. En mi propia experiencia laboral con el compilador PIC32 pro, obtuve una reducción del 40-50%. Así que voy a usar el 50% aquí como un compromiso.

Entonces los números se convierten en:

          Instructions/line of code    Bytes/line of code

PIC18F          7.6 (est)                  15.2 (est)                
PIC16F          12.4 (est)                 21.6 (est)
8051            9                          15.9
PIC32           3.1 (est)                  12.3 (est)

Es interesante que el número de bytes por línea de código sea tan similar entre tres de los procesadores, y no mucho más alto para el PIC16F.

Entonces, para responder a la pregunta original, para el PIC18F, obtiene 1024/168 * 11 = 67.0 líneas de C por 1 K de código; para el PIC16F puede obtener 1024/272 * 11 = 41.4 líneas de C, para el 8051 puede obtener 1024/175 * 11 = 64.4 líneas de C, y para el PIC32, 1024/136 * 11 = 82.8 líneas de C. Entonces obtienes la mayor cantidad de líneas de C usando el PIC32. Creo que el número promedio de líneas de C (que es lo que solicitó el OP) para la mayoría de los programas es probablemente entre 25 y 120 líneas de código, dependiendo del procesador y del programa.

En cuanto a las líneas de instrucciones de montaje, para el PIC18F puede obtener 7.6 * 67.0 = 509 instrucciones; para el PIC16F puede obtener 12.3 * 40.4 * 16/14 = 567.9 instrucciones, para el 8051 puede obtener 9 * 62.8 = 565.2 y para el PIC32, 3.1 * 82.8 = 256.7

          Lines of C in 1K bytes    Instructions in 1K bytes

PIC18F          65.5 (est)               497.8 (est)                
PIC18F          40.4 (est)               567.9 (est)
8051            62.8                     565.2
PIC32           80.9 (est)               256.7 (est)

Tenga en cuenta que las "Instrucciones en 1K bytes" en realidad son algo más de 500 para el PIC18F, y 250 para el PIC32, ya que utilizan instrucciones de 2 y 4 bytes respectivamente. El número para el PIC16F es mayor debido a la tolerancia de sus palabras de 14 bits.

    
respondido por el tcrosley
8

En cuanto a C, puede ser una línea o puede ser mil. Dependiendo de las construcciones y optimización. Para el ensamblaje está claro: PIC18 tiene un conjunto de instrucciones compuesto por instrucciones largas de 16 y 32 bits. Entonces 1Kb puede contener a 1024/2 = 512 instrucciones como máximo.

    
respondido por el Eugene Sh.

Lea otras preguntas en las etiquetas