El depurador de Code Composer Studio 6.1.0 no está actuando como debería

2

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 abajo

#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 de abajo.

Cuandoeldepuradoralcanzaelpuntodeinterrupción,veoenlaventanadevigilanciavariableunidades,decenas,centenas,milyththiguala10,queesloqueespero.

Perotambiénesperabakm=99999,encambiotengokm=34463,locualnotienesentidoyaquekmesununsignedlong

También.

Cuandomodificoelcódigoycambiounsignedinttnth,thou,hund,tens,onesasignedint,colocounpuntodeinterrupciónenP1OUT=~P1OUTconstrúyeloydepuré.Obtengokm=4294936223enlaventanadeobservaciónvariable.

HicelapreguntaenelforodeTI( enlace ), y un miembro dijo que en mi compilación

  

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

Por favor, ayúdame en este asunto, y disculpa el largo post.

    
pregunta Forat

1 respuesta

5

Su MSP430 es una máquina de 16 bits, por lo que el compilador está haciendo el (10000*tnth) como una multiplicación de números de 16 bits y truncando 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 emite la constante de 10000 enteros a 32 bits con algo como 10000UL y / o si convierte la variable con (unsigned long)tnth , debería ver los resultados esperados.

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

Cuando cambió su tipo de datos de 16 bits de no firmado a firmado, lo que sucede es que el valor 34463 (0x869F) se trata como un valor negativo 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 firmado de 32 bits, por lo que ahora es 0xFFFF869F. Pero como está colocando esto en una variable entera de 32 bits sin signo, este valor ahora se representa como 4294936223.

    
respondido por el brhans

Lea otras preguntas en las etiquetas