  Programming embedded systems applications involve writing concurrent,
event-driven and timing-aware programs. Traditionally, such programs are
written in low-level machine-oriented programming languages like C or Assembly.
We present an alternative by introducing Synchron, an API that offers
high-level abstractions to the programmer while supporting the low-level
infrastructure in an associated runtime system and one-time-effort drivers.
Embedded systems applications exhibit the general characteristics of being (i)
concurrent, (ii) I/O-bound and (iii) timing-aware. To address each of these
concerns, the Synchron API consists of three components: (1) a Concurrent ML
(CML) inspired message-passing concurrency model, (2) a message-passing--based
I/O interface that translates between low-level interrupt based and
memory-mapped peripherals, and (3) a timing operator, $syncT$, that marries
CML's $sync$ operator with timing windows inspired from the TinyTimber kernel.
We implement the Synchron API as the bytecode instructions of a virtual machine
called SynchronVM. SynchronVM hosts a Caml-inspired functional language as its
frontend language, and the backend of the VM supports the STM32F4 and NRF52
microcontrollers, with RAM in the order of hundreds of kilobytes. We illustrate
the expressiveness of the Synchron API by showing examples of expressing state
machines commonly found in embedded systems. The timing functionality is
demonstrated through a music programming exercise. Finally, we provide
benchmarks on the response time, jitter rates, memory, and power usage of the
SynchronVM.
