Примерно с тех дней (даты исходного поста ветки), заприметил
прототреды Адама Дункелса. Было дело, даже заглянул под капот.
Впечатлился изяществом и, одновременно, кривизной решения. Задумал
когда-нибудь использовать. https://dunkels.com/adam/pt/
И вот момент настал. Сроки жмут, проект не сильно интересный. Делать конечные автоматы на switch() вручную, решил, для этого проекта жирно будет. А прототреды зайдут. Завелось с пол-пинка.
Плюсы: Ресурсов не жрёт, оптимизация LTO выполнение не ломает. Порог входа невысокий, документация с примерами. Добавлять/удалять блокирующие поток функции просто. Можно мониторить состояние потока по возвращаемому значению, вызывая поток без обёртки, если в конкретном месте нужно именно блокирующее поведение, например, на этапе инициализации после включения, например:
while (ADCcalDiag (&ADCcalDiag_pt) < PT_EXITED) { }
И ждём, пока выполнится диагностика и калибровка, не делая ничего другого.
Минусы: Не сохраняет контекст. Поэтому, если нужно продолжить работу функции, а не начинать каждый круг с чистого листа, приходится объявлять статические переменные или использовать глобальные. Нельзя разрывать функциям потоков switch(){}. Использовать можно, но без потоковых функций внутри. Поэтому некоторая внимательность требуется.
Ну и главный минус, с моей точки зрения, который коробит мой перфекционизм - предупреждения о проваливании в следующий case, предупреждения о неиспользуемой переменной YEILD.
В остальном штука удобная и замечательная. Рекомендую.