zephyr/samples/subsys/nvs
Laczen JMS 7d2e59813f subsys: fs/nvs: Rewrite for improved robustness
On flash NVS was stored one entry after another including the metadata
of each entry. This has the disadvantage that when an incomplete write
is performed (e.g. due to power failure) the complete sector had to be
rewritten to get a completely functional system.

The present rewrite changed the storage in flash of the data. For each
sector the data is now written as follows: the data itself at the
beginning of the sector (one after the other), the metadata (id, length,
data offset in the sector, and a crc of the metadata) is written from
the end of the sector. The metadata is of fixed size (8 byte) and for
a sector that is completely occupied a metadata entry of all zeros is
used.

Writing data to flash always is done by:
1. Writing the data,
2. Writing the metadata.

If an incomplete write is done NVS will ignore this incomplete write.

At the same time the following improvements were done:
1. NVS now support 65536 sectors of each 65536 byte.
2. The sector size no longer requires to be a power of 2 (but it
still needs to be a multiple of the flash erase page size).
3. NVS now also keeps track of the free space available.

Signed-off-by: Laczen JMS <laczenjms@gmail.com>
2018-08-10 14:16:06 -07:00
..
src subsys: fs/nvs: Rewrite for improved robustness 2018-08-10 14:16:06 -07:00
CMakeLists.txt
prj.conf subsys: fs/nvs: Rewrite for improved robustness 2018-08-10 14:16:06 -07:00
README.rst subsys: fs/nvs: Improved nvs for larger blocksizes 2018-08-10 14:16:06 -07:00
sample.yaml

.. _nvs-sample:

NVS: Non-Volatile Storage
#########################

Overview
********

This is a simple application demonstrating use of the NVS
module for non-volatile (flash) storage.  In this application,
a counter is incremented on every reboot and stored in flash,
the application reboots, and the reboot counter data is retrieved.

Requirements
************

* A board with flash support

Building and Running
********************

This sample can be found under :file:`samples/subsys/nvs` in the Zephyr tree.

The sample can be build for several platforms, the following commands build the
application for the nrf51_pca10028 board.

.. zephyr-app-commands::
   :zephyr-app: samples/subsys/nvs
   :board: nrf51_pca10028
   :goals: build flash
   :compact:

After flashing the image to the board the output on the console shows the
reboot counter and the boards reboots several times to show the reboot counter
is incremented.

Sample Output
=============

.. code-block:: console

   ***** Booting Zephyr OS v1.12.0-rc1-176-gf091be783 *****
   [fs/nvs] [DBG] nvs_reinit: (Re)Initializing sectors
   [fs/nvs] [DBG] _nvs_sector_init: f->write_location set to c
   [fs/nvs] [INF] nvs_init: maximum storage length 256 byte
   [fs/nvs] [INF] nvs_init: write-align: 1, write-addr: c
   [fs/nvs] [INF] nvs_init: entry sector: 0, entry sector ID: 1
   No address found, adding 192.168.1.1 at id 1
   No key found, adding it at id 2
   No Reboot counter found, adding it at id 3
   Id: 4 not found, adding it
   Longarray not found, adding it as id 4
   Reboot counter history: ...0
   Oldest reboot counter: 0
   Rebooting in ...5...4...3...2...1
   ***** Booting Zephyr OS v1.12.0-rc1-176-gf091be783 *****
   [fs/nvs] [INF] nvs_init: maximum storage length 256 byte
   [fs/nvs] [INF] nvs_init: write-align: 1, write-addr: c7
   [fs/nvs] [INF] nvs_init: entry sector: 0, entry sector ID: 1
   Entry: 1, Address: 192.168.1.1
   Id: 2, Key: ff fe fd fc fb fa f9 f8
   Id: 3, Reboot_counter: 1
   Id: 4, Data: DATA
   Id: 5, Longarray: 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18
   Reboot counter history: ...1...0
   Oldest reboot counter: 0
   Rebooting in ...5...4...3...2...1
   ...