El depurador de Code Composer Studio 6.1.0 no funciona como debería

Estoy aprendiendo a codificar en un microcontrolador de Texas Instruments, MSP430FR6969 ( enlace ), usando la plataforma de lanzamiento MSP-EXP430FR6969 ( enlace ).

También estoy usando un IDE CCS 6.1.0 ( enlace ).

Estoy haciendo un odómetro simple, donde el programa cuenta de 0 a 99 999 y luego se reinicia nuevamente.

código a continuación

#include <msp430.h> 

#define DEVELOPMENT 0x5A80
#define ENABLE_PINS 0xFFFE

int main(void)
{
    WDTCTL = DEVELOPMENT;//disable WDT
    PM5CTL0 = ENABLE_PINS;//this is needed in order to enable pins

    P1DIR = 0x01;//P1.1 is output
    P1OUT = 0x00;//port 1 = 0x00

    unsigned int tnth, thou, hund, tens, ones;

    unsigned long km = 0;

    while(1)
    {
        for(tnth = 0;tnth < 10;tnth++)
        {
            for(thou = 0;thou<10;thou++)
            {
                for(hund = 0;hund<10;hund++)
                {
                    for(tens = 0;tens<10;tens++)
                    {
                        for(ones = 0;ones<10;ones++)
                        {
                            km = 10000*tnth + 1000*thou + 100*hund +10*tens+ 
                            ones;
                        }

                    }
                }
            }
        }

        P1OUT = ~P1OUT;//I added a breakpoint there.
        km = 0;
    }


    return 0;
}

Agregué un punto de interrupción en P1OUT = ~P1OUT;, lo construí y lo depuré como en la imagen a continuación.

ingrese la descripción de la imagen aquí

Cuando el depurador alcanza el punto de interrupción, veo en la ventana de visualización de variables unidades, decenas, centenas, mil y tnth todas iguales a 10, que es lo que espero.

Pero también esperaba km = 99999, en cambio tengo km = 34463, lo cual no tiene sentido ya que kmes ununsigned long

También.

Cuando modifico el código y cambio unsigned int tnth, thou, hund, tens, onesa signed int, coloco un punto de interrupción en P1OUT = ~P1OUTla compilación y la depuración me aparece km = 4294936223en la ventana de visualización de variables.

Hice la pregunta en el foro de TI ( enlace ), y un miembro dijo que en mi compilación

"../main.c", línea 16: advertencia #552-D: se configuró la variable "km" pero nunca se usó

Amablemente ayúdame en este asunto, y perdón por la larga publicación.

Code Composer Studio 8.0 está disponible.

Respuestas (1)

Su MSP430 es una máquina de 16 bits, por lo que el compilador lo hace (10000*tnth)como una multiplicación de números de 16 bits y trunca el resultado a 16 bits antes de continuar con el resto del cálculo.

10000 * 9 = 90000 = 0x15F90  
truncate to 16-bits = 0x5F90 = 24464  
24464 + 9999 = 34463  

Si convierte la constante entera de 10000 a 32 bits con algo como 10000ULy/o convierte la variable con (unsigned long)tnthdebería ver los resultados esperados.

Se espera la advertencia para 'la variable "km" se configuró pero nunca se usó'.
Está asignando valores a km, pero nunca los vuelve a leer ni los usa kmde ninguna otra manera, pero esto no tiene nada que ver con su comportamiento no deseado.

Cuando cambió su tipo de datos de 16 bits de sin firmar a firmado, lo que sucede es que el valor 34463 (0x869F) se trata como un valor negativo de 16 bits de -31073 (ya que el MSB es un 1).
Al convertir esto en un valor de 32 bits, primero se extiende el signo a un valor con signo de 32 bits, por lo que ahora es 0xFFFF869F.
Pero dado que está colocando esto en una variable entera de 32 bits sin signo, este valor ahora se representa como 4294936223.

¿Alguna posibilidad de que el código sea optimizado (por el compilador) porque nunca se usa km?
Algunos compiladores pueden hacer eso, pero el resultado que obtiene el OP (34463) es exactamente lo que obtendría cuando la primera multiplicación se truncara a 16 bits, por lo que parece que no se está optimizando.
@ChrisKnudsen, la optimización estaba desactivada
@brhans Entonces, ¿cómo es que cuando cambié int sin firmar a int, obtengo km > 4000000, no debería obtener 34463también?
@brahans tu respuesta tiene sentido para cuando llegue a km = 34463, pero si cambio unsigned int tntha int tnth90,000 seguirá siendo 24465, lo que debería darmekm = 34463
@Forat - ver actualización.