内蔵EEPROM / EEMEMマクロでアドレスの管理を簡易化する

pp.425ff.
EEMEMマクロを使えばアドレスではなく変数名で管理できる。
f:id:ti-nspire:20200303075950p:plain
宣言の順番と逆順にメモリーが確保されている。
f:id:ti-nspire:20200303092920p:plain

#include <avr/io.h>
#include <avr/eeprom.h>
#include "USART.h"

const char STR[] = "It started with a trivial-seeming observation.";
const int lenOfSTR = sizeof STR;

// EEMEMマクロを使って変数を宣言する。
char     romStr[lenOfSTR] EEMEM;
uint8_t  romByte          EEMEM;
uint16_t romWord          EEMEM;

int main(){
    initUSART();
    
    eeprom_update_block(STR, romStr, lenOfSTR); // (排列を, EEPROMのどこへ, 何バイト)書き込む。
    eeprom_update_byte(&romByte, 1);            // (EEPROMのどこへ, 1バイト値)を書き込む。
    eeprom_update_word(&romWord, 0xbcde);       // (EEPROMのどこへ, 2バイト値)を書き込む。
    
    char ramStr[lenOfSTR];
    eeprom_read_block(ramStr, romStr, lenOfSTR); // (RAMのどこへ, EEPROMのどこから, 何バイト)を読み出す。
    uint8_t b = eeprom_read_byte(&romByte);      // (EEPROMのどこから) 1バイト値を読み出す。
    uint16_t c = eeprom_read_word(&romWord);     // (EEPROMのどこから) 2バイト値を読み出す。
    
    printString(ramStr); printString("\n");
    printByte(b)       ; printString("\n");
    printHexWord(c)    ; printString("\n");

    return 0;
}