# Reliance Edge

Reliance Edge is a small, portable, highly reliable power-fail safe file system
for resource-constrained embedded systems like microcontrollers.  It is written
in C and provides a familiar POSIX-like file system API, making it easy to use
in your application; or an alternate minimalist API if your application has
simple storage needs.  Reliance Edge is highly configurable and can be tuned to
the precise needs of your application.

## Getting Help

You will find this section later in our readme as well - but we wanted to tell
you up front: DATALIGHT WANTS TO HEAR FROM YOU!  Whether it's just to make
comments about the product, to suggest new features, or to tell us what you
don't like - reach out!  All comments and inquiries can be directed to
<RelianceEdgeSupport@datalight.com>.

## Documentation

The complete documentation for Reliance Edge is distributed separately.  It
includes an API reference and detailed discussions of various aspects of using
Reliance Edge, including porting, building, configuring, and testing.  This
complete documentation, called the _Developer's Guide_, can be obtained for free
from here:

<http://www.datalight.com/reliance-edge>

In addition this README, see doc/release_notes.md for a list of updates
to Reliance Edge and a list of known issues. There is also a quick-start
guide in the doc/ directory that describes step-by-step how to compile
and run Reliance Edge in a simulated Windows environment.

## Why Use Reliance Edge?

Reliance Edge is ideal for small embedded systems with data storage
requirements, especially if there is a chance of sudden power loss or other
system failures.  Compared to "raw" disk access, using a file system like
Reliance Edge removes the burden of tracking which sectors belong to which
objects, and allows data to be updated more reliably.  Compared to the FAT file
system, using Reliance Edge eliminates the possibility that file system data
will be left in an inconsistent state, corrupting the disk; Reliance Edge does
not need a fsck/CHKDSK utility.  Compared to journaling file systems, Reliance
Edge has less overhead and results in less storage media wear for longer device
lifetimes.

Reliance Edge uses a unique transactional model that not only prevents file
system corruption but also allows a set of changes to be made in an atomic "all
or nothing" fashion.  This is very useful for applications that make sets of
interrelated changes.  By using the features of Reliance Edge, a set of changes
can be incorporated into a single atomic transaction, which is committed in its
entirety or not at all even if interrupted by power loss; this means the
application does not need code to recover from partially-finished updates.

## Hardware

The typical hardware for Reliance Edge is a 32-bit microcontroller, but other
targets are possible.  In its typical configurations, Reliance Edge needs at
least 4 KB to 5 KB of RAM, 11 to 18 KB of code space (on the ROM or NOR flash),
and 500 to 700 bytes of stack.

Reliance Edge is not designed for high-end embedded systems that run complicated
operating systems like Linux or Windows Embedded Compact.  Embedded systems of
that variety are better served by other file systems, like Datalight's
[Reliance Nitro](http://www.datalight.com/products/embedded-file-systems/reliance-nitro).

## Getting Reliance Edge Working

Before you can use Reliance Edge, it must be ported and configured.  At a
minimum, porting includes filling-in functions so that Reliance Edge can issue
commands to your storage medium; depending on your needs, other functions may
need to be filled in as well.  These functions reside in a subdirectory in the
os/ directory; see os/stub/ for a blank set of functions.  Configuring includes
creating a project directory (start by copying projects/newproj) and creating
the two configuration files (redconf.h/redconf.c) using the Reliance Edge
Configuration Utility (which can be downloaded from
<http://www.datalight.com/reliance-edge>).

These topics are covered in much greater detail in the _Developer's Guide_,
linked above.

## Using Reliance Edge

Using Reliance Edge is a simple matter of including the primary Reliance Edge
application header in your application (either include/redposix.h or
include/redfse.h) and compiling and linking against Reliance Edge binaries.
The Reliance Edge driver must be initialized before it is used (via the
red\_init() or RedFseInit() functions) and then volumes can be mounted and file
and directory functions invoked.  The Reliance Edge API is documented in the
_Developer's Guide_ (linked above) and also via comments in the source code.

## Licensing

Reliance Edge is an open-source project licensed under the GNU General Public
License v2 (GPLv2).  Businesses and individuals that for commercial or other
reasons cannot comply with the terms of the GPLv2 license may obtain a
commercial license before incorporating Reliance Edge into proprietary software
for distribution in any form.  Visit <http://www.datalight.com/reliance-edge>
for more information.  The commercial distribution also includes extra tests and
tools not distributed with the GPLv2 version.

See LICENSE.txt for the full license terms of this distribution of the product.

## Getting Help

If you need assistance using Reliance Edge, and you have already consulted the
_Developer's Guide_, contact <RelianceEdgeSupport@datalight.com>.

In the near future, a community forum or message board will be set up to
facilitate discussion of Reliance Edge and allow users to get help from
Datalight and from each other.  In the meantime, please use the email address
given above.

## Contributing

Contributions to Reliance Edge are welcome.  Our policy is that Datalight must
own the copyright of all code incorporated into Reliance Edge; if contributing a
significant amount of code, you will be asked to file a copyright assignment
agreement.  See CONTRIBUTING.txt for further details and contribution
guidelines.

To report bugs, please create a GitHub issue or contact
<RelianceEdgeSupport@datalight.com>.

