This timing additions to a language is also at the core of imperative synchronous programming languages like Este rel, Céu or Blech.
HN user
syncurrent
A way to implement coroutines in C is via protothreads. I admit that they are a bit hacky - but you can get quite far with them. I used them to implement an Esterel/Blech like environment: https://github.com/frameworklabs/proto_activities
In `proto_activities` this blinking would look like this:
pa_activity (Blinker, pa_ctx_tm(), uint32_t onMs, uint32_t offMs) {
pa_repeat {
turn_on_LED();
pa_delay_ms (onMs);
turn_off_LED();
pa_delay_ms (offMs);
}
} pa_end
Here the activity definition automatically creates the structure to hold the pc, timer and other variables which would outlast a single tick.A similar approach, but rooted in the idea of synchronous languages like Esterel or Blech:
Proto-Activities have this context to store the state in the caller.
Somewhat related to Fibres are the Trails of synchronous reactive programming languages. Both allow efficient logical concurrency based on cooperative scheduling. The nice thing with Trails is that the scheduling can be determined by the compiler by extracting dependencies from the synchronous reactive program thus increasing determinism of your app.
Drakon uses Silhouettes to show code linearly and abstracted at the same time:
Right, imperative synchronous programming simplifies real time processing a lot.
Somehow it does not get the attention it should, which is IMHO due to the fact that it is not available in common programming languages.
This is why I tried to create DSLs for C and Swift so that more people could potentially play around with that.
The magic source of Contiki is IMHO the use of protothreads as a lightweight concurrency system. Protothreads can also be used to implement synchronous programming models - like this one: https://github.com/frameworklabs/proto_activities
This paper: https://past.date-conference.com/proceedings-archive/2017/py... is on Sequentially Constructive Synchronous Concurrency which is also the base for the synchronous language Blech (https://www.blech-lang.org/)
This is a small project using Blech on an ESP-32 using PlatformIO: https://github.com/frameworklabs/ranger
It doesn’t use Blechs newer module system though.
I created two „offsprings“ of Blech:
1. A C based lib using protothreads: https://github.com/frameworklabs/proto_activities
2. A Swift DSL: https://github.com/frameworklabs/Pappe
I think the synchronous approach is really profound and hope more people look into it.
Synchronous programming is also a good choice IMHO to handle multiple concurrent activities in a simple way on an embedded system.
I find synchronous languages like Esterel, Céu, or Blech both weird and eye opening. I created a DSL for Swift (called Pappe) to bring some of the ideas to a more mainstream language.