MSP430 printf() a través de Spy-Bi-Wire se bloquea

printf()para consolar a través de Spy-Bi-Wire debería ser compatible con TI Code Composer Studio. Encontré esta página , que explica cómo habilitar printf(). Pero parece que no puedo hacer que funcione. La ejecución del programa simplemente se bloquea cuando llega a printf().

Mi configuración consiste en:

Para intentar habilitar printf(), he cambiado esta configuración en Proyecto->Propiedades:

  • E/S de consola (CIO) habilitada
  • Tamaño de pila 768, tamaño de almacenamiento dinámico 1024. (También probé 300 y 400, respectivamente).
  • printf()soporte establecido enminimal
/*
 * ======== Standard MSP430 includes ========
 */
#include <msp430.h>
#include <stdio.h>

/*
 * ======== Grace related includes ========
 */
#include <ti/mcu/msp430/Grace.h>

/*
 *  ======== main ========
 */
int main(void)
{
    Grace_init();                   // Activate Grace-generated configuration

    while (1)
    {
        P1OUT |= BIT0;
        __delay_cycles(100000);
        P1OUT &= ~ (BIT0);
        __delay_cycles(100000);

        printf("*\n");    // hangs here
    }

    return (0);
}

El problema es que la ejecución del programa se bloquea cuando llega a printf().

En la vista de desensamblado, el código cuelga en esta línea

000004  3FFF  JMP  (0x0004)

¿Es esto un salto sin fin?

En un momento, pensé que había un problema con mi instalación de CCStudio. Inicialmente, instalé 5.3 encima de 4. Instalé CCStudio 5.3 en otra computadora (virgen). Estoy viendo exactamente el mismo problema.

Ahora que lo pienso, estoy usando el mismo FET430. Puede ser que el problema esté en mi FET430 o en su firmware.

¿Qué me estoy perdiendo? ¿Qué puede salir mal?
¿Alguien más ha tenido problemas como este?
¿Es esto algo que funciona con JTAG de 4 hilos, pero no funciona con Spy-Bi-Wire?

Aquí hay una página wiki más actualizada con respecto a la compatibilidad con printf: procesadores.wiki.ti.com/index.php/… No sé por qué no funciona para usted, pero ¿ha intentado sin usar Grace?
Solo un pensamiento:printf("*\n\r"); -- or \r\n

Respuestas (1)

Suena como un problema de asignación de memoria, aunque no he usado mucho la serie MSP430, veo que el MSP430FR5739 solo tiene 1K de SRAM, por lo que algunas configuraciones que ha probado no tienen mucho sentido. Para empezar, debe intentar leer el mapa de memoria y ver cuánto espacio ocupan las variables estáticas para que pueda calcular cuánto de 1K queda para la pila y el montón. También lea la documentación de printf para ver cuánto de cada uno requiere. .

0x3FFF corresponde a un jmp relativo -1, en otras palabras, un bucle infinito. No estoy seguro con CCStudio en particular, pero muchos compiladores llenan la memoria no utilizada con esa instrucción. Eso significa que si el código salta a una ubicación que no contiene código, la ejecución se detiene en lugar de continuar, lo que podría causar más problemas.

Personalmente, nunca uso printf en microcontroladores pequeños, es mucho mejor comenzar con rutinas simples de salida de caracteres como putchar y puts. Luego, si necesita una salida numérica, por ejemplo, ejecute sus propias rutinas mínimas para hacer lo que necesita. La biblioteca printf puede ser bastante grande incluso en variantes compactas debido a la gran cantidad de formatos que admite, aunque probablemente no los esté utilizando.