  Sensing systems powered by energy harvesting have traditionally been designed
to tolerate long periods without energy. As the Internet of Things (IoT)
evolves towards a more transient and opportunistic execution paradigm, reducing
energy storage costs will be key for its economic and ecologic viability.
However, decreasing energy storage in harvesting systems introduces reliability
issues. Transducers only produce intermittent energy at low voltage and current
levels, making guaranteed task completion a challenge. Existing ad hoc methods
overcome this by buffering enough energy either for single tasks, incurring
large data-retention overheads, or for one full application cycle, requiring a
large energy buffer. We present Julienning: an automated method for optimizing
the total energy cost of batteryless applications. Using a custom specification
model, developers can describe transient applications as a set of atomically
executed kernels with explicit data dependencies. Our optimization flow can
partition data- and energy-intensive applications into multiple execution
cycles with bounded energy consumption. By leveraging interkernel data
dependencies, these energy-bounded execution cycles minimize the number of
system activations and nonvolatile data transfers, and thus the total energy
overhead. We validate our methodology with two batteryless cameras running
energy-intensive machine learning applications. Results demonstrate that
compared to ad hoc solutions, our method can reduce the required energy storage
by over 94% while only incurring a 0.12% energy overhead.
