Let’s talk about a hardware driver for a pushbutton. A pushbutton driver isn’t as completely trivial as it might sound because you need debouncing logic to ensure a crisp on/off signal, but it’s hard to imagine how it might need more than about 100 lines of C code.
After working on this particular embedded system, I didn’t need to stress my imagination any more. This pushbutton driver was modelled as an explicit finite state machine, and all the possible states and transitions were specified in a spreadsheet. Then there was a python script that processed this spreadsheet and generated state table data as C code. This was linked to an FSM evaluator in C. The FSM was controlled by a bare-metal driver and triggered callbacks on each state transition.
Most of the callbacks were marked “not yet implemented”. In fact, only two states were even reachable:
BUTTON_DOWN. Eventually the entire project was canned, but not
because of missing support for
BUTTON_TIMEOUT or any of
the other states.
The FSM didn’t do any debouncing, so the low-level driver had to do that before passing button up/down events to it.