  We present ALFRED: a virtual memory abstraction that resolves the dichotomy
between volatile and non-volatile memory in intermittent computing.
Mixed-volatile microcontrollers allow programmers to allocate part of the
application state onto non-volatile main memory. Programmers are therefore to
explore manually the trade-off between simpler management of persistent state
against the energy overhead for non-volatile memory operations and
intermittence anomalies due to re-execution of non-idempotent code. This
approach is laborious and yields sub-optimal performance. We take a different
stand with ALFRED: we provide programmers with a virtual memory abstraction
detached from the specific volatile nature of memory and automatically
determine an efficient mapping from virtual to volatile or non-volatile memory.
Unlike existing works, ALFRED does not require programmers to learn a new
programming model or language syntax, while the mapping is entirely resolved at
compile-time, reducing the run-time energy overhead. We implement ALFRED
through a series of program machine-level code transformations. Compared to
existing systems, we demonstrate that ALFRED reduces energy consumption by up
to two orders of magnitude given a fixed workload. This enables the workloads
to finish sooner, as the use of available energy shifts from ensuring forward
progress to useful application processing.
