¿Dónde colocar la clave del gestor de arranque en la RAM, en qué dirección se encuentra la última dirección de RAM?

0

Estoy programando un cargador de arranque CDC. Lo que quiero hacer es ejecutar el programa, desde allí escribir una clave del gestor de arranque en el ram en una dirección específica y el watchdog reiniciar la MCU. El cargador de arranque lee exactamente la misma dirección y comprueba si tiene la clave del cargador de arranque. Si es la clave del gestor de arranque, ejecutará el protocolo del gestor de arranque, de lo contrario, volverá a iniciar el boceto.

Ahora la pregunta es: ¿Qué dirección usar? He escuchado que algunas direcciones del puntero del ram están reservadas para algunos registros periféricos. También he oído hablar de la gestión de pila en ram. Entonces, ¿cuál sería el mejor lugar para poner una clave de arranque tan mágica?

Como ejemplo en un Arduino Leonardo (32u4) con un ram de 2,5kb, lo guardan en la dirección de 2kb: enlace

¿Alguna sugerencia para un 16u2 y 32u2 con 500/1000 byte ram? ¿O tal vez otra forma de pasar el gestor de arranque esta información? ¿Alguien me puede explicar por qué usaron 0x0800 para un 32u4 o fue esto quizás un lugar 'aleatorio'? No quiero entrar en conflicto con ningún programa lo menos posible y no quiero interrumpir los programas con este tipo de escritura de ram.

Editar: Es importante encontrar una dirección RAM normalmente no utilizada, ya que puede revertir el reinicio de la vigilancia del gestor de arranque. Mira esto: enlace

    
pregunta

1 respuesta

1

Realmente no importa mucho dónde pones tu clave, siempre y cuando tu programa y el cargador de arranque estén de acuerdo.

Simplemente configurará un par de bytes en la RAM, configurará el perro guardián, luego deberá ingresar un bucle while(1); para que no suceda nada más. También debe desactivar las interrupciones antes de comenzar. No importa si sobrescribe la memoria utilizada por el programa, ya que ese programa ya no se está ejecutando. Una vez que el gestor de arranque está terminado y terminado, no importa lo que haga con ese poco de RAM, así que puede usarlo según lo normal en su programa.

Si desea "reservar" la memoria en su programa para que no se use para otra cosa, puede colocar una variable en una sección separada ubicada en una dirección específica, y nada más se pondrá allí. Algo como:

volatile uint32_t blkey __attribute__((section(".blkey")));

y luego diga al compilador dónde se encuentra esa sección agregando esto al vinculador:

-Wl,-section-start=.blkey=0x<ADDRESS>

De esa manera, realmente no te importa lo que esté sucediendo, esa sección se apartará del resto de tu programa.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas