How fast does it need to start up? Can you reload RAM from EEPROM when it wakes up? Otherwise sleeping on a timer interrupt that either checks the CRC of RAM or compares the RAM to the EEPROM at regular intervals should do a good job of making sure the RAM contents are correct. As it is only a few hundred bytes, either approach should be very quick and consume very little power.
It doesn't need to start up particularly fast - even a few hundred milliseconds would not have any effect on anything - so I suppose I could reload from EEPROM. Yes, I may do that.
In the power-down mode I'm using, the only timer that can cause wake-up is the watchdog timer, and that has a maximum period of 8 seconds; that seems far, far too frequent for that kind of thing, so I'm not sure I'd want to do that. I suppose I would need to measure the current draw during a wake-up-and-check event to see if it was acceptable in terms of power usage.
Check the ram retention voltage in your datasheet. It would be odd if not below brown-out reset voltage (possibly quite a bit below).
If you doubt your ram is being retained 100% in sleep, its not going to do much good to just check the config data in ram, now you will have to check everything in ram and at that point you may as well reset on every wake-up.
If you have power above ram retention voltage, your ram remains as it was. If you go below that voltage, the brown-out reset already tripped long ago. If you don't use brown-out reset, then the por arm/rearm voltages may need to be checked in the datasheet against the ram retention voltage. You probably then want to reset after a wakeup if the possibility exists to get close to the ram retention voltage without a por.
I checked the datasheet, and it doesn't give a RAM retention voltage. But it does specify a minimum voltage to sustain power-down sleep mode, which is 2.5V. I'm running the device at 5V, and I have the brown-out detection enabled and set to 4.3V, so corrupting memory due to voltage drop isn't really a concern, as the device will reset in those situations.
Checking a CRC is a good idea. You could also keep a CRC in EEPROM while you're at it, so you can check integrity of data in EEPROM while you read it from there. EEPROM data corruption can also happen. So keeping two identical blocks of configuration data in EEPROM (ideally in completely different "pages") could be a good idea too, so you have a fallback if one of them gets corrupted.
Good point, yes, I could also keep a CRC of the EEPROM contents too. Wouldn't hurt to apply belt and braces.

If RAM shadowing is a necessity due to performance reasons, an additional strategy can be to keep two RAM shadows of the EEPROM data (each with its CRC). Then you can read from either (in an alternate way for instance). If the CRC of the current shadow is wrong, then you read from the other. If both CRCs are wrong, you update both shadows from EEPROM. This would lower the probability of having to read from EEPROM, which can be an advantage for performance or power consumption reasons.
Yes, RAM shadowing is fairly important for performance reasons. Part of the configuration data is several 'programs' in bytecode for a stack-based VM that get executed hundreds of times per second, so delays in accessing that data are particularly undesirable.
Not sure whether I may have the spare RAM to keep two copies of the configuration data. Besides that, I'm not sure how I would go about abstracting the swapping between the two copies. I suppose it could be as simple as changing a pointer to a struct. Perhaps have a timer interrupt (maybe the watchdog, as mentioned above) do the CRC check on the secondary copy, re-load from EEPROM upon failure, then if all okay swap pointers. I wouldn't want to do any verification and re-loading on the active copy, as that would probably delay normal functions too much.
Before you start working on a problem that does not exist.
What happens if the data gets corrupted?
Does it stop working? Does it damage something? Is it dangerous for people?
What is the probability of read errors?
Corruption could lead to totally incorrect behaviour, which at worst would mean the device becomes useless. Would that lead to damage or danger? No. But it sure would piss off the user.
I of course can't say with any certainty what the probabilities of failure might be. Just that the thought occurred to me that when dealing with run times potentially extending into the months, well, entropy happens, so...
