Escribir flash en ATmega328

0

Me ha costado entender este código, pero no puedo entender el endian de little endian. ¿Por qué es necesario? ¿Y cómo podría volver a leer la página? Un byte a la vez como una matriz? ¿Es incluso posible? Código desde aquí

#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
void boot_program_page(uint32_t page, uint8_t *buf) {
    uint16_t i;
    uint8_t sreg;
    // Disable interrupts.
    sreg = SREG;
    cli();
    eeprom_busy_wait();
    boot_page_erase(page);
    boot_spm_busy_wait(); // Wait until the memory is erased.
    for (i = 0; i < SPM_PAGESIZE; i += 2) {
        // Set up little-endian word.
        uint16_t w = *buf++;
        w += (*buf++) << 8;
        boot_page_fill (page + i, w);
    }
    boot_page_write(page); // Store buffer in flash page.
    boot_spm_busy_wait(); // Wait until the memory is written.
    // Reenable RWW-section again. We need this if we want to jump back
    // to the application after bootloading.
    boot_rww_enable();
    // Re-enable interrupts (if they were ever enabled).
    SREG = sreg;
}
    
pregunta Worakls

1 respuesta

1

Busqué en la hoja de datos, no hay nada de endian-ness. El problema podría ser simplemente cómo se escribe en la memoria flash. Parece que se escribe en la memoria flash, las "palabras" tienen dos bytes de longitud, pero la dirección en sí es por byte. El programador original era obviamente un buen chico y leía esta parte de la referencia AVR-libc: "Nota La dirección es una dirección de byte. Los datos son una palabra. El AVR escribe datos en el búfer una palabra a la vez, pero dirige el búfer por byte. ¡Entonces, incremente su dirección en 2 entre llamadas y envíe 2 bytes de datos en un formato de palabra! El LSB de los datos se escribe en la dirección inferior; el MSB de los datos se escribe en la dirección superior ".

source

La primera mitad (byte) de 'w' es el byte al que apunta el puntero no referenciado 'buf', que luego se incrementa en 1 (por el ++). La segunda mitad de la palabra 'w' se realiza con esta línea "w + = (* buf ++) < < 8" y lo que esto hace es agregar la mitad superior (que es el contenido de la dirección señalada por 'buf 'en el siguiente byte) desplazando el byte a la izquierda 8 bits. Esto lo pone en la mitad superior, como dije.

Ahora tiene 'w' que contiene dos bytes de datos, como una 'palabra' lista para escribir con la función boot_page_fill, una función de la biblioteca AVR-Libc.

Si alguna vez no comprende las entradas de las funciones, siempre debe intentar buscar la referencia y ver los comentarios que encontré y mostré anteriormente.

    
respondido por el KyranF

Lea otras preguntas en las etiquetas