Our machines have this requirement: if power failure occurs, many important variables are to be resumed from where they were interrupted after the machine is restarted (power on in this case). In other words, the basic idea is to keep a snapshot of the state machine before it is interrupted. The board is provided with:
- a 32-bit H8S/2633 Hitachi microprocessor;
- a battery-backed memory (BBM), where these variables are stored; BBM area involved is about 16 Kbytes (the whole BBM has a 128KB capability)
- 2 big capacitors; if a blackout occurs, they guarantee a 400 msec (Tsave) extra power supply time. When power supply is going to fall down, a function is invoked by power failure NMI. This function, within Tsave time, has to perform the following main operations:
- it calculates CRC16 checksum for the BBM variable area (for our 16KB, this requires a long time: 90 msec!).
- it saves the CRC16 checksum in BBM (of course, in a different BBM address from the previous variable area). Then, when machine is re-started, a new checksum of the interested BBM area is performed: the result is compared with the previous stored one. If they differ, a BBM corruption is assumed (error detection).
Now I am seeking a better solution: the target is to reduce the 2 big capacitors, i.e. to reduce Tsave time. The reason is to save space (and money) by reducing them. I'm looking for a way to anticipate CRC16 calculation in a safe and fast way, before power failure. One solution could be a CRC16 computation invoked at every time a BBM variable is changed, but this operation needs 90 msec (as I wrote before), while main loop now is about 10 msec. That's why this solution is not applicable at all.
Note: because of our application, I can't consider solutions like saving every second, i.e. loosing "only" last second changes. Thank you very much.