Time to plug one of my favourite (semi-academic) programming languages targeting the embedded space: Céu[0].
It uses a Structured Synchronous Reactive Programming paradigm. Synchronously concurrency means that it is single-core, and not parallel. More accurately, it awaits events in parallel (hence "synchronous reactive programming"), using "trails" instead of threads.
An example from the documentation[1] below:
> The example in Céu that follows blinks a LED every second and terminates on a button press:
input none BUTTON;
output on/off LED;
par/or do
await BUTTON;
with
loop do
await 1s;
emit LED(on);
await 1s;
emit LED(off);
end
end
par/or do ... with ... end is an example of two parallel trails, each of which much have one or more await statements, meaning the block on these events. The or in par/or means that if either trail finishes, the whole section ends. In this case, the second trail has an infinite loop (which isn't a problem due to the await statements yielding control to the scheduler), so the program only ends if the first trail ends after a button press.
A more elaborate example by fellow Céu enthusiast Johnicholas can be found here[2][3].