ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
14 мая
1517430 Топик полностью
Nikolay_Po (11.05.2025 16:55, просмотров: 222) ответил Скрипач на Все что пробовал еще более громоздко. Делаю if-ы с goto. Ну и *Дункельсовские prototreads для совсем элементарных вещей (задержки и т.п.).
Примерно с тех дней (даты исходного поста ветки), заприметил прототреды Адама Дункелса. Было дело, даже заглянул под капот. Впечатлился изяществом и, одновременно, кривизной решения. Задумал когда-нибудь использовать. 

https://dunkels.com/adam/pt/

И вот момент настал. Сроки жмут, проект не сильно интересный. Делать конечные автоматы на switch() вручную, решил, для этого проекта жирно будет. А прототреды зайдут. Завелось с пол-пинка.

Плюсы: Ресурсов не жрёт, оптимизация LTO выполнение не ломает. Порог входа невысокий, документация с примерами. Добавлять/удалять блокирующие поток функции просто. Можно мониторить состояние потока по возвращаемому значению, вызывая поток без обёртки, если в конкретном месте нужно именно блокирующее поведение, например, на этапе инициализации после включения, например:


while (ADCcalDiag (&ADCcalDiag_pt) < PT_EXITED) { }


И ждём, пока выполнится диагностика и калибровка, не делая ничего другого.


Минусы: Не сохраняет контекст. Поэтому, если нужно продолжить работу функции, а не начинать каждый круг с чистого листа, приходится объявлять статические переменные или использовать глобальные. Нельзя разрывать функциям потоков switch(){}. Использовать можно, но без потоковых функций внутри. Поэтому некоторая внимательность требуется.

Ну и главный минус, с моей точки зрения, который коробит мой перфекционизм - предупреждения о проваливании в следующий case, предупреждения о неиспользуемой переменной YEILD.

В остальном штука удобная и замечательная. Рекомендую.