AVR cargador de arranque simple: ¿cómo llamar al código de la aplicación?

3

Estoy usando el atmega328. Quiero crear una aplicación de prueba simple usando un gestor de arranque. Quiero: Parpadear un led a una velocidad en la sección de flash del cargador de arranque, y luego parpadear a otra velocidad en la sección de aplicación de flash. estos son mis bits de fusible:

Porloquesé,siconfiguroelfusibleBOOTRSTpuedoestablecerdesdedóndearrancaelprograma(odesdedóndeestá)Porlotanto,heconfiguradoelprogramaparaqueseejecutedesdeeliniciodelaseccióndelcargadordearranque,0x3800(parauntamañodepáginade2048).estoestáenlapágina282de hoja de datos ).

Esteeselcódigoactual:

#include<avr/io.h>#include<avr/delay.h>voidboot_program_page(){DDRC=0xFF;PORTC=0xFF;_delay_ms(1000);PORTC=0x00;_delay_ms(1000);}voidmain(void){boot_program_page();asm("jmp 0x0000" );// Jump to application code.   
    PORTC = 0xFF; 
    _delay_ms(10000); 
    PORTC= 0x00;  
    _delay_ms(10000);  
}

Este es mi entendimiento: Como he configurado el fusible BOOTRST al principio de la sección del cargador de arranque, este código se graba en el cargador de arranque. Tan pronto como el programa ve el salto al código de la aplicación (comando asm), graba el resto del siguiente código en la memoria de la aplicación. sin embargo, esto no es lo que sucede, el boot_program_page() solo se ejecuta indefinidamente.

¿Cómo puedo solucionar esto?

¡Gracias!

    
pregunta dgamma3

1 respuesta

1

Está malinterpretando la función del comando del ensamblador.

Si programa un "GOTO" en C, aparece el comando jmp assembler. Es justo lo que dice en la lata: Salta. No le dice al compilador nada sobre la ubicación del código.

En ninguna parte de su código especifica qué código va a dónde, por lo que el compilador simplemente decide por usted que desea que el código vaya a donde cree que es mejor. Lo que es más probable es el inicio del espacio de no arranque no vectorial.

Creo que estaría bien yendo a: enlace

Y busque "[TUT] Bootloader" y vea si hay un tutorial que aparezca y que se ajuste a su forma general de pensar. Te llevará al menos medio día, pero aprenderás lo que más necesitas para saberlo.

Editar:

Olvidé señalar que su código tampoco se detiene en un punto predecible. En estos días, a menudo el compilador le ayuda en el supuesto de que quiere detenerse al final de main (), pero es "bueno" incluir un tiempo (1) {}; al final, donde quieres que se detenga el código. De esa manera, usted tiene el control absoluto de lo que sucede y está absolutamente seguro de que su código no se ejecuta simplemente en una memoria flash vacía.

    
respondido por el Asmyldof

Lea otras preguntas en las etiquetas