Вы можете просто использовать схему страниц с двойным резервированием.Для двух 4 КБ страниц, организованных таким образом:
Page A Page B
+------------+ +------------+
| Sequence A | | Sequence B |
!~Sequence A | !~Sequence B |
+------------+ +------------+
| | | |
| | | |
| Data A | | Data B |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
+------------+ +------------+
Первоначально вы пишете Data A
и устанавливаете Sequence A
в ноль для его инверсии ~Sequence A
.При запуске вы проверяете порядковый номер каждой страницы и задаете для страницы самый высокий действительный порядковый номер (действительный, когда sequence ^ ~sequnece == 0xff
) в качестве текущей страницы чтения , а другой - в качестве текущей страницы записи.
Когда вы обновляете данные, вы стираете текущую страницу записи , записываете область data , затем устанавливаете порядковый номер равным порядковому номерупрочитанная страница плюс 1 (по модулю 256) и установите ее обратно.Затем поменяйте местами текущие страницы чтения / записи.При обновлении вы можете копировать данные с одной страницы на другую без буферизации всей страницы и изменять только ту часть, которую вы собираетесь изменить.
Если во время записи произошел сбой питания или произошел сброс, последовательность страницномер не будет действительным, так как он записан последним, и запись последовательности и обратной последовательности должна быть завершена, поэтому частично записанные данные будут недействительными, а предыдущая действительная страница будет выбрана при запуске.
При выборетекущая активная страница, вам, конечно, приходится иметь дело с циклическим изменением (т. е. когда порядковые номера равны 255 и нулю, ноль - новее).
Эта схема подходит для данных, которые будут часто читатьсяи написано редко.Характер и частота ваших циклов чтения / записи NV будут диктовать подходящий механизм, поскольку для последовательной регистрации или энергонезависимых счетчиков событий будут подходить разные решения.