{"id":467797,"date":"2025-07-20T21:07:47","date_gmt":"2025-07-20T21:07:47","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=467797"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=467797","title":{"rendered":"<span>\u0425\u0430\u043a\u0430\u0435\u043c \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0432 C<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3b4\/2ed\/04b\/3b42ed04b0ec07e46675db5b043a875e.jpg\" width=\"604\" height=\"416\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3b4\/2ed\/04b\/3b42ed04b0ec07e46675db5b043a875e.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3b4\/2ed\/04b\/3b42ed04b0ec07e46675db5b043a875e.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u0437\u0430\u043d\u0438\u043c\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u041f\u041e. \u042d\u0442\u043e \u041f\u041e \u0432 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0418 \u0445\u043e\u0442\u044f \u0442\u0430\u043a\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0430 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0431\u0435\u0437 \u041e\u0421, \u044f \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c: \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043d\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0441\u0442\u043e?<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043d\u043e \u0438\u0445 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0431\u043e\u043b\u044c. \u0412 \u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u043f\u043b\u044e\u0441 \u043e\u043d\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0438 \u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0436\u043e\u043d\u0433\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u0430\u043c\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043e\u043f\u0440\u043e\u0441\u0430. <\/p>\n<p>\u041c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u043b\u0430 \u043c\u044b\u0441\u043b\u044c: \u00ab\u0410 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043f\u0440\u043e\u0449\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0435\u0439 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0449\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u043c\u0435\u0441\u0442\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438?\u00bb<\/p>\n<p>\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 RTOS, \u043f\u043e\u0441\u0435\u043c\u0443 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0441\u044f. \u041d\u043e \u044f \u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0435\u043a\u0430\u044f \u0437\u043e\u043b\u043e\u0442\u0430\u044f \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438 \u0432 Python, JavaScript, Dart \u0438 Rust. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043d\u0435 \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043f\u043e\u0442\u043e\u043a\u0438 \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u044d\u0434\u0430\u043a\u0443\u044e \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u043c\u0435\u043d\u044f \u043e\u0441\u0435\u043d\u0438\u043b\u043e: \u00ab\u041a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u041e\u0421\u00bb.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0448\u0443 \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043c\u0438\u0433\u0430\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043a <code>p<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0438\u043e\u0434 \u043c\u0438\u0433\u0430\u043d\u0438\u044f. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u043c\u0438\u0433\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u0438 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438. \u041f\u0440\u0438 \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0446\u0438\u043a\u043b \u043c\u0438\u0433\u0430\u043d\u0438\u044f \u0443\u0436\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c, \u0432\u0434\u0432\u043e\u0435 \u043a\u043e\u0440\u043e\u0447\u0435 \u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 (<code>p\/2<\/code>).<\/p>\n<p>\u0414\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/081\/35f\/9fb\/08135f9fb153182e4bc7c60e801e2738.jpg\" width=\"2442\" height=\"1167\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/081\/35f\/9fb\/08135f9fb153182e4bc7c60e801e2738.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/081\/35f\/9fb\/08135f9fb153182e4bc7c60e801e2738.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439, <code>led_blinker<\/code>, \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: <code>LED_ON<\/code>\u00a0\u0438\u00a0<code>LED_OFF<\/code>. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 <code>LED_ON<\/code>\u00a0\u0432\u00a0<code>LED_OFF<\/code>\u00a0\u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0432 <code>p\/2<\/code>, \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0438\u0437 <code>LED_OFF<\/code> \u0432\u00a0<code>LED_ON<\/code>\u00a0\u043f\u043e\u0441\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u043e\u0442 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>resetLed<\/code>,\u00a0<code>led_blinker<\/code>\u00a0\u0442\u0443\u0442 \u0436\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>LED_OFF<\/code>, \u0432 \u043a\u0430\u043a\u043e\u043c \u0431\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u043d \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>LED_OFF<\/code>.<\/p>\n<p>\u0423 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430,\u00a0<code>button_record<\/code>, \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:\u00a0<code>WAIT_BUTTON_PRESSED<\/code>\u00a0\u0438\u00a0<code>WAIT_BUTTON_UNPRESSED<\/code>. \u0412 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u043c\u0451\u0442 \u043a\u043d\u043e\u043f\u043a\u0443. \u041f\u043e\u0441\u043b\u0435 \u0435\u0451 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f <code>t_s<\/code> \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u00a0<code>WAIT_BUTTON_UNPRESSED<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u043f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043e\u0442\u043f\u0443\u0441\u0442\u0438\u0442 \u043a\u043d\u043e\u043f\u043a\u0443. \u041a\u043e\u0433\u0434\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430, \u043e\u043d \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f <code>t_e<\/code>, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u0443\u043f\u0435\u0440\u0438\u043e\u0434 \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 <code>p\/2 = t_e - t_s<\/code>, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u00a0<code>resetLed<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e <code>WAIT_BUTTON_PRESSED<\/code>.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u043e\u043f\u0440\u043e\u0441\u0430 \u0434\u043b\u044f Arduino \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#define BUTTON_PIN 2  enum led_blink_state {   STATE_LED_OFF = 0,   STATE_LED_ON };  uint64_t led_blink_duration_ms = 1000; uint64_t led_blink_toggle_time = 0; uint8_t reset_led_requested = 0;  enum button_record_state {   STATE_WAIT_BUTTON_PRESSED = 0,   STATE_WAIT_BUTTON_UNPRESSED };  void setup() {   led_blink_state = STATE_LED_OFF;   button_record_state = STATE_WAIT_BUTTON_PRESSED;   led_blink_toggle_time = millis() + led_blink_duration_ms;    pinMode(LED_BUILTIN, OUTPUT);   pinMode(BUTTON_PIN, INPUT_PULLUP); }  void poll_led_blink() {   static enum led_blink_state = STATE_LED_OFF;   if (led_blink_state == STATE_LED_OFF) {     digitalWrite(LED_BUILTIN, LOW);   } else if (led_blink_state == STATE_LED_ON) {     digitalWrite(LED_BUILTIN, HIGH);   }       if (reset_led_requested) {       reset_led_requested = 0;       led_blink_state = STATE_LED_OFF;       led_blink_toggle_time = millis() + led_blink_duration_ms;   } else if (millis() &gt;= led_blink_toggle_time) {     if (led_blink_state == STATE_LED_OFF) {       led_blink_state = STATE_LED_ON;     } else if (led_blink_state == STATE_LED_ON) {       led_blink_state = STATE_LED_OFF;     }     led_blink_toggle_time = millis() + led_blink_duration_ms;   } }  void poll_button_record() {   static enum button_record_state = STATE_WAIT_BUTTON_PRESSED;   static int button_pressed_start_time = 0;   if (button_record_state == STATE_WAIT_BUTTON_PRESSED) {     if (digitalRead(BUTTON_PIN) == LOW) {       button_record_state = STATE_WAIT_BUTTON_UNPRESSED;       button_pressed_start_time = millis();     }    } else if (button_record_state == STATE_WAIT_BUTTON_UNPRESSED) {     if (digitalRead(BUTTON_PIN) == HIGH) {       button_record_state = STATE_WAIT_BUTTON_PRESSED;       int button_pressed_end_time = millis();       led_blink_duration_ms = button_pressed_end_time - button_pressed_start_time;       reset_led_requested = 1;     }   } }  void loop() {   poll_led_blink();   poll_button_record(); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430\u0448\u0438\u0445 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432 \u043d\u0430 C. \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0432 \u043a\u043e\u0434 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u0434, \u0442\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 <code>poll_led_blink<\/code>\u00a0\u0438\u00a0<code>poll_button_record\u00a0functions<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044f, \u0430 \u044d\u0442\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0438 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043f\u0440\u043e\u0449\u0435, \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0436\u0430\u0442\u0438\u044f\/\u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438, \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>resetLed<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0451 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u0442\u043e\u0433\u043e \u0436\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u0430? \u0422\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0447\u0438\u0441\u0442\u043e\u043c\u0443, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 FreeRTOS \u2014 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043c\u043e\u0436\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;Arduino_FreeRTOS.h&gt;  #define BUTTON_PIN 2  TickType_t led_blink_duration_ticks = pdMS_TO_TICKS(1000);  TaskHandle_t led_blink_task_handle; #define NOTIFYBIT_RESET_LED 0x80  void led_blink() { \u00a0 while (true) { \u00a0\u00a0\u00a0 digitalWrite(LED_BUILTIN, LOW); \u00a0\u00a0\u00a0 \/\/ \u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f resetLed \u0438\u043b\u0438 \u043e\u0442\u0441\u0447\u0451\u0442\u043e\u0432 led_blink_duration_ticks. \u00a0\u00a0\u00a0 if (xTaskNotifyWait(0, NOTIFYBIT_RESET_LED, NULL, led_blink_duration_ticks) == pdTRUE) { \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u0421\u043e\u0431\u044b\u0442\u0438\u0435 resetLed \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e -&gt; \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a. \u00a0\u00a0\u00a0\u00a0\u00a0 continue; \u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 digitalWrite(LED_BUILTIN, HIGH); \u00a0\u00a0\u00a0 \/\/ \u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f resetLed \u0438\u043b\u0438 \u043e\u0442\u0441\u0447\u0451\u0442\u043e\u0432 led_blink_duration_ticks. \u00a0\u00a0\u00a0 xTaskNotifyWait(0, NOTIFYBIT_RESET_LED, NULL, led_blink_duration_ticks); \u00a0 } }  void wait_pin(int pin, int level) { \u00a0 while (digitalRead(pin) == level) \u00a0\u00a0\u00a0 ; }  void button_record() { \u00a0 while (true) { \u00a0\u00a0\u00a0 wait_pin(BUTTON_PIN, HIGH); \u00a0\u00a0\u00a0 TickType_t start_time_ticks = xTaskGetTickCount();  \u00a0\u00a0\u00a0 wait_pin(BUTTON_PIN, LOW); \u00a0\u00a0\u00a0 TickType_t end_time_ticks = xTaskGetTickCount(); \u00a0\u00a0\u00a0 led_blink_duration_ticks = end_time_ticks - start_time_ticks; \u00a0\u00a0\u00a0 xTaskNotify(led_blink_task_handle, NOTIFYBIT_RESET_LED, eSetBits);\u00a0 \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 resetLed \u0432 \u0437\u0430\u0434\u0430\u0447\u0443 led_blink. \u00a0 } }  void setup() { \u00a0 pinMode(LED_BUILTIN, OUTPUT); \u00a0 pinMode(BUTTON_PIN, INPUT_PULLUP);  \u00a0 xTaskCreate(led_blink, \"led_blink\", 512, NULL, 1, &amp;led_blink_task_handle); \u00a0 xTaskCreate(button_record, \"button_record\", 512, NULL, 1, NULL); }  void loop() {}<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c. \u041e\u043d \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u2014 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u043c\u0435\u0448\u0430\u043d \u0432\u0430\u0436\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441: \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043e\u043d\u043e \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 (\u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435) \u0440\u0430\u0441\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432\u0440\u043e\u0434\u0435 FreeRTOS.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0433\u0440\u0443\u0431\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 FreeRTOS. \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>button_recorder<\/code>:<\/p>\n<pre><code class=\"cpp\">CORO(button_recorder_fn, \u00a0\u00a0\u00a0\u00a0 CORO_NO_ARGS, \u00a0\u00a0\u00a0\u00a0 CORO_LOCALS(uint64_t button_pressed_start_time;), \u00a0\u00a0\u00a0\u00a0 CORO_CALLS( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CORO_CALL(wait_pin_low, wait_pin), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CORO_CALL(wait_pin_high, wait_pin)), { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_res_t res; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (true) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CALL(res, wait_pin_low, wait_pin, BUTTON_PIN, LOW); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCAL(button_pressed_start_time) = millis();  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CALL(res, wait_pin_high, wait_pin, BUTTON_PIN, HIGH); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint64_t button_pressed_end_time = millis(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 led_blink_duration_ms = button_pressed_end_time - LOCAL(button_pressed_start_time); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_cond_var_notify(&amp;reset_led_signal); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return CORO_RES_DONE; \u00a0\u00a0\u00a0\u00a0 })<\/code><\/pre>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u0441\u043f\u043b\u043e\u0448\u043d\u0430\u044f \u0441\u0442\u0435\u043d\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432. \u041d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e\u0442 \u0447\u0442\u043e. \u042d\u0442\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u043f\u043e \u0441\u0443\u0442\u0438, \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442. \u0427\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u0434\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u0430\u0447\u0435.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 C \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0435\u0434\u0451\u0442 \u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0444\u0440\u0435\u0439\u043c\u0430 \u0441\u0442\u0435\u043a\u0430 \u0432 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u043e.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0442\u0435\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u0412\u0441\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 \u0445\u043e\u0434\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u043d\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u2014 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u043a \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u0417\u0430 \u0435\u0451 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 <code>CORO_LOCALS<\/code>.<\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435\u0442 \u0441\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u043e\u0447\u043a\u0443, \u0433\u0434\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0432\u0438\u0434\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430), \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u044f\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 <code>CALL<\/code> \u0441\u0443\u0431-\u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c\u043e\u0435 \u0447\u0435\u0440\u0435\u0437 <code>CORO_CALLS<\/code>, \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u0443\u0431-\u043a\u043e\u0440\u0443\u0442\u0438\u043d \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 C \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430 \u0432\u0430\u0441 \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u0451\u043c C, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043a\u0430\u043a \u00ab\u043c\u0435\u0442\u043e\u0434 \u0414\u0430\u0444\u0444\u0430\u00bb \u2014 \u0442\u0435\u0445\u043d\u0438\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>switch<\/code> \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0441 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0446\u0438\u043a\u043b\u0430 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0438\u043b\u0438 \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0441\u0442\u0438. \u0418 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0436\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c: \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <code>switch<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u0432\u043d\u043e \u0432 \u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u0433\u0434\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430. \u0414\u043b\u044f \u043f\u0443\u0449\u0435\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u00a0<code>button_recorder<\/code>\u00a0\u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">enum button_recorder_fn_fct_state { \u00a0 button_recorder_fn_state_initial = 0, \u00a0 coro_state_wait_pin_low, \u00a0 coro_state_wait_pin_high }; struct button_recorder_fn_fct_ctx { \u00a0 enum button_recorder_fn_fct_state state; \u00a0 uint64_t button_pressed_start_time; \u00a0 union { \u00a0\u00a0\u00a0 uint8_t placeholder; \u00a0\u00a0\u00a0 struct wait_pin_fct_ctx wait_pin_low; \u00a0\u00a0\u00a0 struct wait_pin_fct_ctx wait_pin_high; \u00a0 } calls; };  coro_res_t button_recorder_fn_fct(struct button_task_fn_fct_ctx *ctx) { \u00a0 switch (ctx-&gt;state) { \u00a0 case button_recorder_fn_state_initial: { \u00a0\u00a0\u00a0 coro_res_t res; \u00a0\u00a0\u00a0 while (1) { \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ CALL(res, wait_pin_low, wait_pin, BUTTON_PIN, LOW); \u00a0\u00a0\u00a0\u00a0\u00a0 ctx-&gt;state = coro_state_wait_pin_low; \u00a0\u00a0\u00a0\u00a0\u00a0 ctx-&gt;calls.wait_pin_low.state = (enum wait_pin_fct_state)0; \u00a0\u00a0\u00a0\u00a0\u00a0 case coro_state_wait_pin_low: \u00a0\u00a0\u00a0\u00a0\u00a0 res = wait_pin_fct(&amp;ctx-&gt;calls.wait_pin_low, 2, LOW); \u00a0\u00a0\u00a0\u00a0\u00a0 if (res &amp; CORO_RES_PENDING) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res;  \u00a0\u00a0\u00a0\u00a0\u00a0 (ctx-&gt;button_pressed_start_time) = millis();  \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ CALL(res, wait_pin_low, wait_pin, BUTTON_PIN, HIGH); \u00a0\u00a0\u00a0\u00a0\u00a0 ctx-&gt;state = coro_state_wait_pin_high; \u00a0\u00a0\u00a0\u00a0\u00a0 ctx-&gt;calls.wait_pin_high.state = (enum wait_pin_fct_state)0; \u00a0\u00a0\u00a0\u00a0\u00a0 case coro_state_wait_pin_high: \u00a0\u00a0\u00a0\u00a0\u00a0 res = wait_pin_fct(&amp;ctx-&gt;calls.wait_pin_high, 2, HIGH); \u00a0\u00a0\u00a0\u00a0\u00a0 if (res &amp; CORO_RES_PENDING) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res;  \u00a0\u00a0\u00a0\u00a0\u00a0 uint64_t button_pressed_end_time = millis(); \u00a0\u00a0\u00a0\u00a0\u00a0 led_blink_duration_ms = \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 button_pressed_end_time - (ctx-&gt;button_pressed_start_time); \u00a0\u00a0\u00a0\u00a0\u00a0 coro_cond_var_notify(&amp;reset_led_signal); \u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 return CORO_RES_DONE; \u00a0 } \u00a0 } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442. \u041a\u0430\u0436\u0434\u044b\u0439 <code>CALL<\/code>, \u043f\u043e \u0441\u0443\u0442\u0438, \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0443\u043d\u043a\u0442\u043e\u043c <code>case<\/code> \u0432 <code>switch<\/code>, \u0430\u00a0<code>ctx-&gt;state<\/code>\u00a0\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0435\u0451 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438. \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u0441\u0443\u0431-\u043a\u043e\u0440\u0443\u0442\u0438\u043d \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438), \u0430 \u043d\u0435 \u043d\u0430 \u0441\u0442\u0435\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/www.chiark.greenend.org.uk\/~sgtatham\/coroutines.html\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0421\u0430\u0439\u043c\u043e\u043d\u0430 \u0422\u044d\u0442\u0445\u0430\u043c\u0430, \u0433\u0434\u0435 \u0430\u0432\u0442\u043e\u0440 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043b\u043e\u0432\u043a\u0438\u0439 \u043f\u0440\u0438\u0451\u043c:<\/p>\n<p>\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u0430 \u0443\u043b\u043e\u0432\u043a\u0430 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0430. \u0420\u0438\u0441\u043a\u043d\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a \u0432 \u043a\u043e\u0434\u0435 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043b\u0438\u0431\u043e \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0432\u044b\u0433\u043e\u0432\u043e\u0440, \u043b\u0438\u0431\u043e \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0432\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u0435. \u0417\u0434\u0435\u0441\u044c \u0443 \u0432\u0430\u0441 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0435\u043f\u0430\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b <code>case<\/code> \u0432 \u043f\u043e\u0434\u0431\u043b\u043e\u043a\u0430\u0445, \u0438 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u0441\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0410\u0439-\u0430\u0439-\u0430\u0439! \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0432\u0430\u0441 \u0432\u043e\u043e\u0431\u0449\u0435 \u0441 \u0445\u043e\u0434\u0443 \u043d\u0435 \u0443\u0432\u043e\u043b\u0438\u043b\u0438 \u0437\u0430 \u0441\u0442\u043e\u043b\u044c \u0431\u0435\u0437\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430. \u041a\u0430\u043a \u0432\u0430\u043c \u043d\u0435 \u0441\u0442\u044b\u0434\u043d\u043e.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443 <code>wait_ms<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434:<\/p>\n<pre><code class=\"cpp\">CORO(wait_ms,  \u00a0\u00a0\u00a0\u00a0 CORO_ARGS(uint64_t delay),  \u00a0\u00a0\u00a0\u00a0 CORO_LOCALS(uint64_t end_time;), \u00a0\u00a0\u00a0\u00a0 CORO_CALLS(CORO_CALL(wait_ms_yield, coro_yield)), { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_res_t res; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCAL(end_time) = millis() + delay; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (LOCAL(end_time) &gt;= millis()) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CALL(res, wait_ms_yield, coro_yield); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return CORO_RES_DONE; \u00a0\u00a0\u00a0\u00a0 })<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u043f\u043e\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0412 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043e\u043d\u0430 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0434\u0430\u0451\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (yield) \u0447\u0435\u0440\u0435\u0437 \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>coro_yield<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0432 \u0441\u0445\u0435\u043c\u0435 \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c \u0438\u043b\u0438 \u043b\u043e\u0433\u0438\u043a\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430.<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0432\u043e \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">enum wait_ms_fct_state { wait_ms_state_initial = 0, coro_state_wait_ms_yield }; struct wait_ms_fct_ctx { \u00a0 enum wait_ms_fct_state state; \u00a0 uint64_t end_time; \u00a0 union { \u00a0\u00a0\u00a0 uint8_t placeholder; \u00a0\u00a0\u00a0 struct coro_yield_fct_ctx wait_ms_yield; \u00a0 } calls; }; coro_res_t wait_ms_fct(struct wait_ms_fct_ctx *ctx, uint64_t delay) { \u00a0 switch (ctx-&gt;state) { \u00a0 case wait_ms_state_initial: { \u00a0\u00a0\u00a0 coro_res_t res; \u00a0\u00a0\u00a0 (ctx-&gt;end_time) = millis() + delay; \u00a0\u00a0\u00a0 while ((ctx-&gt;end_time) &gt;= millis()) {  \u00a0\u00a0 \u00a0\u00a0\u00a0ctx-&gt;state = coro_state_wait_ms_yield; \u00a0\u00a0\u00a0\u00a0\u00a0 ctx-&gt;calls.wait_ms_yield.state = (enum coro_yield_fct_state)0; \u00a0\u00a0\u00a0\u00a0\u00a0 case coro_state_wait_ms_yield: \u00a0\u00a0\u00a0\u00a0\u00a0 res = coro_yield_fct(&amp;ctx-&gt;calls.wait_ms_yield); \u00a0\u00a0\u00a0\u00a0\u00a0 if (res &amp; CORO_RES_PENDING) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res;  \u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 return CORO_RES_DONE; \u00a0 } \u00a0 } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443 \u043d\u0430\u0441 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0430\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0435. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>state<\/code> \u00ab\u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u00bb, \u0433\u0434\u0435 \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430, \u0438 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>end_time<\/code>) \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b. <\/p>\n<p>\u0426\u0438\u043a\u043b <code>while<\/code> \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, \u0438 \u0432\u044b\u0437\u043e\u0432 <code>coro_yield<\/code>\u00a0\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0435 <code>wait_ms<\/code>\u00a0\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u0440\u0443\u0442\u0438\u043d. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435.<\/p>\n<p>\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c-\u0442\u043e \u0438 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0441\u0438\u043b\u0430 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u043a\u0438. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438\u043b\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0438\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430 \u0441\u0447\u0451\u0442 \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u0434\u0430 \u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430. \u0421\u0432\u044f\u0437\u044b\u0432\u0430\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u2014 \u043a\u0430\u0436\u0434\u0443\u044e \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u2014 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u043e\u0442\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c. <\/p>\n<p>\u041f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443, \u043c\u044b \u0440\u0430\u0437\u043c\u0435\u043d\u0438\u0432\u0430\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u044b \u0441\u0442\u0435\u043a\u0430 \u0438 \u043f\u0440\u0435\u0432\u0435\u043d\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0440\u0443\u0447\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u0430 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u043e\u043b\u043d\u0443\u044e \u043e\u0442\u0440\u0435\u0448\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c, \u0430 \u043f\u043e \u043c\u043d\u0435\u043d\u0438\u044e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u0434\u0430\u0436\u0435 \u043a\u043e\u0449\u0443\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430 \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043e\u0431\u0449\u0435\u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 C.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438, \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u0432\u0440\u043e\u0434\u0435 <code>wait_ms<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>button_recorder_fn<\/code>\u00a0\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u0436\u0435 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f. \u0412\u043e\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0440\u0435\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">enum coro_task_state { \u00a0 coro_task_state_not_started = 0, \u00a0 coro_task_state_running = 1, \u00a0 coro_task_state_waiting_for_execution = 2, \u00a0 coro_task_state_parked = 3, \u00a0 coro_task_state_finished = 4, \u00a0 coro_task_state_failed = 5, };  struct coro_task; \u00a0 struct coro_task *current_task = NULL;  struct coro_executor { \u00a0 struct coro_task *task_queue_head; \u00a0 struct coro_task *task_queue_tail; };  typedef coro_res_t (*coro_task_root_fct)(void *ctx); \u00a0 struct coro_task { \u00a0 enum coro_task_state state;  \u00a0 struct coro_executor *executor; \u00a0 struct coro_task *next; \u00a0 coro_task_root_fct root_fct; \u00a0 uint8_t canceled; \u00a0 void *context; };  void coro_executor_enqueue_task(struct coro_executor *executor, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 struct coro_task *task) {  \u00a0 assert(task-&gt;state == coro_task_state_waiting_for_execution); \u00a0 assert(task-&gt;executor == executor);  \u00a0 struct coro_task **task_queue_tail = &amp;executor-&gt;task_queue_tail; \u00a0 if (*task_queue_tail)\u00a0 \/\/ \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430. \u00a0\u00a0\u00a0 (*task_queue_tail)-&gt;next = task; \u00a0 else\u00a0 \/\/ if(!executor-&gt;task_queue_head) \u00a0\u00a0\u00a0 executor-&gt;task_queue_head = task; \u00a0 *task_queue_tail = task; }  void coro_executor_start_task(struct coro_executor *executor, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 struct coro_task *task) {  \u00a0 assert(task-&gt;state == coro_task_state_not_started); \u00a0 assert(task-&gt;executor == NULL); \u00a0 task-&gt;state = coro_task_state_waiting_for_execution; \u00a0 task-&gt;executor = executor;  \u00a0 coro_executor_enqueue_task(executor, task); }  void coro_executor_process(struct coro_executor *executor) { \u00a0 struct coro_task **task_queue_head = &amp;executor-&gt;task_queue_head;  \u00a0 while (*task_queue_head != NULL) { \u00a0\u00a0\u00a0 struct coro_task task = task_queue_head; \u00a0\u00a0\u00a0 if (task-&gt;state == coro_task_state_waiting_for_execution) { \u00a0\u00a0\u00a0\u00a0\u00a0 task-&gt;state = coro_task_state_running;        \u00a0\u00a0\u00a0\u00a0\u00a0 current_task = task; \u00a0\u00a0\u00a0\u00a0\u00a0 coro_res_t res = task-&gt;root_fct(task-&gt;context); \u00a0\u00a0\u00a0\u00a0\u00a0 if (res == CORO_RES_DONE) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 task-&gt;state = coro_task_state_finished; \u00a0\u00a0\u00a0\u00a0\u00a0 } else if (res == CORO_RES_CANCELED) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 task-&gt;state = coro_task_state_failed; \u00a0\u00a0\u00a0\u00a0\u00a0 } else if (res == CORO_RES_PENDING) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 task-&gt;state = coro_task_state_parked; \u00a0\u00a0\u00a0\u00a0\u00a0 } else if (res == CORO_RES_PENDING_NON_PARKING) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 task-&gt;state = coro_task_state_waiting_for_execution; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_executor_enqueue_task(executor, task); \u00a0\u00a0\u00a0\u00a0\u00a0 } else { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 assert(0); \u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 *task_queue_head = task-&gt;next; \u00a0\u00a0\u00a0 task-&gt;next = NULL; \u00a0 } \u00a0 executor-&gt;task_queue_tail = NULL; \u00a0 current_task = NULL; }  enum coro_yield_fct_state { \u00a0 yield_state_init = 0, \u00a0 yield_state_after_yield = 1, }; struct coro_yield_fct_ctx { \u00a0 enum coro_yield_fct_state state; }; coro_res_t coro_yield_fct(struct coro_yield_fct_ctx *ctx) { \u00a0 if (current_task-&gt;canceled) \u00a0\u00a0\u00a0 return CORO_RES_CANCELED; \u00a0 if (ctx-&gt;state == yield_state_init) { \u00a0\u00a0\u00a0 ctx-&gt;state = yield_state_after_yield; \u00a0\u00a0\u00a0 return CORO_RES_PENDING_NON_PARKING; \u00a0 } else { \u00a0\u00a0\u00a0 return CORO_RES_DONE; \u00a0 } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c <code>coro_executor<\/code> \u2014 \u044d\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a. \u041e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0434\u0430\u0447 \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e. <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0<code>coro_executor_process<\/code>, \u043e\u043d:<\/p>\n<ol>\n<li>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0435\u0451 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><code>CORO_RES_DONE<\/code>: \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p><code>CORO_RES_CANCELED<\/code>: \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0431\u044b\u043b\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u2014 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0451 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0435.<\/p>\n<\/li>\n<li>\n<p><code>CORO_RES_PENDING<\/code>: \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 (PARKING), \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><code>CORO_RES_PENDING_NON_PARKING<\/code>: \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u043b\u0430 \u0432\u044b\u0434\u0430\u0447\u0443 \u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u0440\u0435\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0446\u0438\u043a\u043b\u0435).<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0434\u0430\u0451\u0442 <code>CORO_RES_PENDING_NON_PARKING<\/code>, \u043e\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c <code>led_task<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043a\u043e\u0440\u0443\u0442\u0438\u043d. \u0415\u0451 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043c\u0438\u0433\u0430\u0442\u044c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u044f \u0435\u0433\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430. \u041d\u043e \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0432\u043e\u0445: \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u00a0resetLed, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0447\u0435\u0440\u0435\u0437 \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0430\u0437\u044b <code>on<\/code>\/<code>off<\/code> \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u0432\u0443\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u0418\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 <code>(wait_ms)<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u0433\u043d\u0430\u043b\u0430 <code>(coro_cond_var_wait)<\/code>, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e, \u0447\u0442\u043e \u043f\u0435\u0440\u0438\u043e\u0434 \u043c\u0438\u0433\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418 \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u043d\u0430\u0441 \u043d\u0435 \u0432\u043e\u043b\u043d\u0443\u0435\u0442, \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u043f\u0435\u0440\u0432\u044b\u043c, \u043d\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>resetLed<\/code>, \u043e\u0442\u0441\u0447\u0451\u0442 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u00a0<code>ANY_CALL<\/code>\u00a0\u0441 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u043e\u0442\u043c\u0435\u043d\u044b \u043a\u043e\u0440\u0443\u0442\u0438\u043d.<\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u0430 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430:<\/p>\n<pre><code class=\"cpp\">CORO(led_task_fn, \u00a0\u00a0\u00a0\u00a0 CORO_NO_ARGS, \u00a0\u00a0\u00a0\u00a0 CORO_NO_LOCALS, \u00a0\u00a0\u00a0\u00a0 CORO_CALLS( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CORO_ANY_CALL(wait_a, wait_ms, coro_cond_var_wait),  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CORO_ANY_CALL(wait_b, wait_ms, coro_cond_var_wait)), { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_res_t res_wait_ms; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_res_t res_reset_led; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (true) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(LED_BUILTIN, LOW); \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0ANY_CALL(res_wait_ms, res_reset_led, wait_a,  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wait_ms, (led_blink_duration_ms), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_cond_var_wait, (&amp;reset_led_signal) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (res_reset_led == CORO_RES_DONE) continue; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(LED_BUILTIN, HIGH); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ANY_CALL(res_wait_ms, res_reset_led, wait_b,  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wait_ms, (led_blink_duration_ms),  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_cond_var_wait, (&amp;reset_led_signal) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (res_reset_led == CORO_RES_DONE) continue; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return CORO_RES_DONE; \u00a0\u00a0\u00a0\u00a0 })<\/code><\/pre>\n<p>\u0422\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0432 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">enum led_task_fn_fct_state { \u00a0 led_task_fn_state_initial = 0, \u00a0 coro_state_wait_a, \u00a0 coro_state_wait_b }; struct led_task_fn_fct_ctx { \u00a0 enum led_task_fn_fct_state state; \u00a0 union { \u00a0\u00a0\u00a0 uint8_t placeholder; \u00a0\u00a0\u00a0 struct { \u00a0\u00a0\u00a0\u00a0\u00a0 struct wait_ms_fct_ctx a; \u00a0\u00a0\u00a0\u00a0\u00a0 struct coro_cond_var_wait_fct_ctx b; \u00a0\u00a0\u00a0 } wait_a; \u00a0\u00a0\u00a0 struct { \u00a0\u00a0\u00a0\u00a0\u00a0 struct wait_ms_fct_ctx a; \u00a0\u00a0\u00a0\u00a0\u00a0 struct coro_cond_var_wait_fct_ctx b; \u00a0\u00a0\u00a0 } wait_b; \u00a0 } calls; }; coro_res_t led_task_fn_fct(struct led_task_fn_fct_ctx *ctx) { \u00a0 switch (ctx-&gt;state) { \u00a0 case led_task_fn_state_initial: { \u00a0\u00a0\u00a0 coro_res_t res_wait_ms; \u00a0\u00a0\u00a0 coro_res_t res_reset_led; \u00a0\u00a0\u00a0 while (1) { \u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(LED_BUILTIN, LOW); \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ ANY_CALL(res_a, res_b, wait_a,  \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 wait_ms, (led_blink_duration_ms), \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 coro_cond_var_wait, (&amp;reset_led_signal) \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ ); \u00a0\u00a0\u00a0\u00a0\u00a0 ctx-&gt;state = coro_state_wait_a; \u00a0\u00a0\u00a0\u00a0\u00a0 ctx-&gt;calls.wait_a.a.state = (enum wait_ms_fct_state)0; \u00a0\u00a0\u00a0\u00a0\u00a0 ctx-&gt;calls.wait_a.b.state = (enum coro_cond_var_wait_fct_state)0; \u00a0\u00a0\u00a0\u00a0\u00a0 case coro_state_wait_a: \u00a0\u00a0\u00a0\u00a0\u00a0 res_wait_ms = wait_ms_fct(&amp;ctx-&gt;calls.wait_a.a, led_blink_duration_ms); \u00a0\u00a0\u00a0\u00a0\u00a0 res_reset_led = coro_cond_var_wait_fct(&amp;ctx-&gt;calls.wait_a.b, &amp;reset_led_signal); \u00a0\u00a0\u00a0\u00a0\u00a0 if (res_wait_ms &amp; CORO_RES_DONE &amp;&amp; !(res_reset_led &amp; CORO_RES_DONE)) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 current_task-&gt;canceled++; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 res_reset_led = \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_cond_var_wait_fct(&amp;ctx-&gt;calls.wait_a.b, &amp;reset_led_signal); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 current_task-&gt;canceled--; \u00a0\u00a0\u00a0\u00a0\u00a0 } else if (res_reset_led &amp; CORO_RES_DONE &amp;&amp; !(res_wait_ms &amp; CORO_RES_DONE)) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 current_task-&gt;canceled++; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 res_wait_ms = wait_ms_fct(&amp;ctx-&gt;calls.wait_a.a, led_blink_duration_ms); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 current_task-&gt;canceled--; \u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0 if ((res_wait_ms | res_reset_led) &amp; CORO_RES_PENDING) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return (res_wait_ms | res_reset_led); \u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 if (res_reset_led == CORO_RES_DONE) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 continue; \u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(LED_BUILTIN, HIGH); \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ ANY_CALL(res_a, res_b, wait_a,  \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 wait_ms, (led_blink_duration_ms), \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 coro_cond_var_wait, (&amp;reset_led_signal) \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ );\u00a0  \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ ...\u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 return CORO_RES_DONE; \u00a0 } \u00a0 } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441\u00a0<code>ANY_CALL<\/code>\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0434\u0432\u0435 \u0441\u0443\u0431-\u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445. \u041a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043c\u0430\u043a\u0440\u043e\u0441 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0444\u043b\u0430\u0433 <code>canceled<\/code> \u0432 <code>current_task<\/code>, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u0443\u044e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443. \u042d\u0442\u043e \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u043d\u0443 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d.<\/p>\n<p>\u041e\u0442\u043c\u0435\u043d\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e. \u041a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0435 \u0431\u044b\u043b\u0430 \u043b\u0438 \u043e\u043d\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430, \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u0443\u044f \u0444\u043b\u0430\u0433 <code>current_task-&gt;canceled<\/code>. \u0415\u0441\u043b\u0438 \u0444\u043b\u0430\u0433 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u043d\u043e (\u043e\u0431\u044b\u0447\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0432\u00a0<code>CORO_RES_CANCELED<\/code>). \u0422\u0430\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u00ab\u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c\u00bb \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044f \u0438\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u044f \u0438 \u0431\u0435\u0437 \u0440\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0442\u043c\u0435\u043d\u044b \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0432 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0435\u00a0<code>coro_cond_var_wait<\/code>.<\/p>\n<p><code>coro_cond_var<\/code>\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0445 (waiter), \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439 \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u00a0<code>coro_cond_var_waiter<\/code>, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u042d\u0442\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0432 \u043a\u0443\u0447\u0435, \u043d\u043e \u043e\u043d \u0432\u043d\u043e\u0441\u0438\u0442 \u043e\u0449\u0443\u0442\u0438\u043c\u044b\u0439 \u043f\u043e\u0434\u0432\u043e\u0445: \u0435\u0441\u043b\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430 \u0438\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438 \u043d\u0435 \u043f\u043e\u0434\u0447\u0438\u0441\u0442\u0438\u0442 \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c, \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0448\u0438\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u2014 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0436\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0422\u043e \u0435\u0441\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u0430\u0442\u0430\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c, <code>coro_cond_var_wait<\/code>\u00a0\u0441\u0442\u0430\u0440\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430, \u0435\u0441\u043b\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0431\u044b\u043b\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430 \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void coro_unpark_task(struct coro_task *task) { \u00a0 assert(task-&gt;state != coro_task_state_not_started); \u00a0 assert(task-&gt;executor != NULL);  \u00a0 if (task-&gt;state == coro_task_state_parked) { \u00a0\u00a0\u00a0 task-&gt;state = coro_task_state_waiting_for_execution;  \u00a0\u00a0\u00a0 coro_executor_enqueue_task(task-&gt;executor, task); \u00a0 } }  enum coro_cond_var_waiter_state { \u00a0 coro_cond_var_waiter_idle = 0, \u00a0 coro_cond_var_waiter_waiting = 1, \u00a0 coro_cond_var_waiter_signaled = 2, };  struct coro_cond_var_waiter { \u00a0 enum coro_cond_var_waiter_state state; \u00a0 struct coro_cond_var_waiter *next; \u00a0 struct coro_task *parked_task; };  struct coro_cond_var { \u00a0 struct coro_cond_var_waiter *waiter_head; };  void coro_cond_var_notify(struct coro_cond_var *cond_var) { \u00a0 struct coro_cond_var_waiter **waiter_head = &amp;cond_var-&gt;waiter_head; \u00a0 while (*waiter_head != NULL) { \u00a0\u00a0\u00a0 if ((*waiter_head)-&gt;state == coro_cond_var_waiter_waiting) { \u00a0\u00a0\u00a0\u00a0\u00a0 (*waiter_head)-&gt;state = coro_cond_var_waiter_signaled; \u00a0\u00a0\u00a0\u00a0\u00a0 coro_unpark_task((*waiter_head)-&gt;parked_task); \u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 waiter_head = (waiter_head)-&gt;next; \u00a0 } }  static void coro_cond_var_add_waiter(struct coro_cond_var *cond_var, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 struct coro_cond_var_waiter *waiter) { \u00a0 struct coro_cond_var_waiter **waiter_head = &amp;cond_var-&gt;waiter_head; \u00a0 waiter-&gt;next = *waiter_head; \u00a0 *waiter_head = waiter; }  static void coro_cond_var_remove_waiter(struct coro_cond_var *cond_var, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 struct coro_cond_var_waiter *waiter) {  \u00a0 for (struct coro_cond_var_waiter **waiter_head = &amp;cond_var-&gt;waiter_head; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 waiter_head != NULL; waiter_head = &amp;(waiter_head)-&gt;next) { \u00a0\u00a0\u00a0 if (*waiter_head == waiter) { \u00a0\u00a0\u00a0\u00a0\u00a0 waiter_head = (waiter_head)-&gt;next; \u00a0\u00a0\u00a0\u00a0\u00a0 break; \u00a0\u00a0\u00a0 } \u00a0 } }  CORO(coro_cond_var_wait, CORO_ARGS(struct coro_cond_var *cond_var), \u00a0\u00a0\u00a0\u00a0 CORO_LOCALS(struct coro_cond_var_waiter waiter;), \u00a0\u00a0\u00a0\u00a0 CORO_CALLS(CORO_CALL(coro_cond_var_wait_park, coro_park)), { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_res_t res;  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_cond_var_add_waiter(cond_var, &amp;LOCAL(waiter));  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 do { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCAL(waiter).state = coro_cond_var_waiter_waiting; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCAL(waiter).parked_task = current_task; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CALL(res, coro_cond_var_wait_park, coro_park); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (res == CORO_RES_CANCELED &amp;&amp; ctx-&gt;waiter.state != coro_cond_var_waiter_signaled) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_cond_var_remove_waiter(cond_var, &amp;LOCAL(waiter)); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return CORO_RES_CANCELED; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } while (ctx-&gt;waiter.state != coro_cond_var_waiter_signaled); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return CORO_RES_DONE; \u00a0\u00a0\u00a0\u00a0 })<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0430\u0441\u043f\u0435\u043a\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u0440\u0443\u0442\u0438\u043d: \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439 \u0441\u0432\u043e\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u2014 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0441\u0432\u0435\u0442\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u043e\u0442\u043c\u0435\u043d\u044b. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b <code>waiter<\/code> \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u044b \u0441\u0442\u0435\u043a\u0430 \u043a\u043e\u0440\u0443\u0442\u0438\u043d (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0442\u0430\u043a \u0438 \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438), \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u0441\u043d\u044f\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0438\u0445 \u0441\u0442\u0435\u043a \u0438\u0441\u0447\u0435\u0437\u043d\u0435\u0442.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0451 \u0433\u043b\u0430\u0434\u043a\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c. \u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0440\u0435\u0434\u0435 \u0432\u0440\u043e\u0434\u0435 Arduino:<\/p>\n<pre><code class=\"cpp\">DECLARE_TASK(led_task, led_task_fn); DECLARE_TASK(button_task, button_task_fn); DECLARE_EXECUTOR(exe);  void setup() { \u00a0 pinMode(LED_BUILTIN, OUTPUT); \u00a0 pinMode(BUTTON_PIN, INPUT_PULLUP);  \u00a0 coro_executor_start_task(&amp;exe, &amp;led_task); \u00a0 coro_executor_start_task(&amp;exe, &amp;button_task); }  void loop() { \u00a0 coro_executor_process(&amp;exe); }<\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0431\u043b\u0430\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 <code>setup<\/code> \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u043c (executor) \u0438 \u043e\u0442\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e. \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>loop<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0435\u0434\u043e\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Arduino, \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0442\u043e\u0432\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u043c\u0438 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0446\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043b\u0435\u0436\u0438\u0442 <a href=\"https:\/\/gist.github.com\/wiomoc\/8f9882eea79f17c419f04539173ea66d\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412\u0441\u044f \u044d\u0442\u0430 \u0445\u0438\u0442\u0440\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u0430\u043b\u044c\u044f\u043d\u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 C \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0438\u043c\u043e\u0439 \u0432\u043e\u043b\u0438. \u0414\u0430, \u043e\u043d\u0430 \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u0430\u044f, \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430 \u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u0437\u0430\u043d\u044f\u0442\u043d\u0430. \u041d\u043e \u0431\u0443\u0434\u0435\u043c \u0447\u0435\u0441\u0442\u043d\u044b \u2014 \u0432 2025 \u0433\u043e\u0434\u0443 \u0437\u0434\u0440\u0430\u0432\u043e\u043c\u044b\u0441\u043b\u044f\u0449\u0438\u0435 \u043b\u044e\u0434\u0438 \u043d\u0435 \u0441\u0442\u0430\u043d\u0443\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u041f\u041e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435: \u00ab\u041d\u0438\u0447\u0435\u0433\u043e \u0441\u0435\u0431\u0435, \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043f\u043e\u043c\u0438\u0433\u0430\u0442\u044c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c\u00bb, \u0442\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043f\u0440\u0430\u0432\u044b. \u0417\u0434\u0435\u0441\u044c \u043c\u044b, \u043f\u043e \u0441\u0443\u0442\u0438, \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0435\u0438\u043c\u0443\u0449\u0438\u0445. \u041e\u0447\u0435\u043d\u044c \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e, \u043e\u0447\u0435\u043d\u044c \u0441\u043c\u0435\u043b\u0443\u044e \u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0451\u0440\u0442\u0443\u044e \u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u043d\u0435\u0438\u043c\u0443\u0449\u0438\u0445. <\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044e \u0441\u0435\u0431\u0435 \u043b\u0451\u0433\u043a\u0443\u044e \u0438\u0440\u043e\u043d\u0438\u044e: <\/p>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u0432\u043e\u0434\/\u0432\u044b\u0432\u043e\u0434 \u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u0434\u0430\u0447 \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043d\u0430 Rust. <\/p>\n<\/blockquote>\n<p>Rust \u0434\u0430\u0451\u0442 \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0441\u043a\u0440\u0435\u0431\u043b\u0438 \u0438 \u0441\u043e\u0441\u0442\u0440\u044f\u043f\u0430\u043b\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u043e. \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c async\/await \u0432 \u043d\u0451\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 \u0441\u0442\u0435\u043a\u0430 \u0438 \u043d\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043b\u0438\u0448\u043d\u0438\u0445 \u0437\u0430\u0442\u0440\u0430\u0442, \u0437\u0430\u0442\u043e \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f\u043c\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u043e\u0439 \u043e\u0442\u043c\u0435\u043d\u044b \u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438 \u043f\u0440\u043e\u043c\u0438\u0441\u0430\u043c\u0438 \u2014 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0433\u0440\u044f\u0437\u043d\u043e\u0433\u043e \u0430\u0434\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0441 \u043d\u0435\u0431\u0440\u0435\u0436\u043d\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043e\u0442\u043c\u0435\u043d\u044b.<\/p>\n<p>\u0422\u043e, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u0430 C, \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u0437\u043d\u0443\u0442\u0440\u0438. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0438\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0442\u044c \u0432 3 \u0443\u0442\u0440\u0430 \u043f\u043e \u0441\u043b\u0443\u0447\u0430\u044e \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u043e\u0433\u043e \u0436\u0451\u0441\u0442\u043a\u043e\u0433\u043e \u0441\u0431\u043e\u044f, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0438\u0437\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u044f \u043e\u0442 \u044d\u0442\u043e\u0439 \u0431\u043e\u043b\u0438.<\/p>\n<h3>\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e, \u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434: \u0410\u0434\u0430\u043c \u0414\u0430\u043d\u043a\u0435\u043b\u044c\u0441 \u043f\u0440\u0435\u0432\u0437\u043e\u0448\u0451\u043b \u043c\u0435\u043d\u044f \u0432 \u0441\u0432\u043e\u0451\u043c \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435\u00a0<a href=\"https:\/\/dunkels.com\/adam\/pt\/index.html\" rel=\"noopener noreferrer nofollow\">Protothreads<\/a>, \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u0438\u0437\u044f\u0449\u043d\u0435\u0439.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>state<\/code>, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043c\u044b, \u0432 Protothreads \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441 <code><em>_<\/em>LINE_<\/code>\u2014 \u0434\u0430, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u043c \u043a\u043e\u043c\u0430\u043d\u0434 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430. \u042d\u0442\u043e \u0441\u043c\u0435\u043b\u044b\u0439 \u0445\u0430\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0434\u0430\u0451\u0442 \u043d\u0430\u0448\u0435\u043c\u0443 \u0438\u0437\u043e\u0449\u0440\u0451\u043d\u043d\u043e\u043c\u0443 \u0444\u0438\u043d\u0442\u0443 \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u044b\u0439 \u0432\u0438\u0434. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/dunkels.com\/adam\/pt\/expansion.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. <\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/928860\/\"> https:\/\/habr.com\/ru\/articles\/928860\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u0437\u0430\u043d\u0438\u043c\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u041f\u041e. \u042d\u0442\u043e \u041f\u041e \u0432 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0418 \u0445\u043e\u0442\u044f \u0442\u0430\u043a\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0430 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0431\u0435\u0437 \u041e\u0421, \u044f \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c: \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043d\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0441\u0442\u043e?<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043d\u043e \u0438\u0445 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0431\u043e\u043b\u044c. \u0412 \u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u043f\u043b\u044e\u0441 \u043e\u043d\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0438 \u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0436\u043e\u043d\u0433\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u0430\u043c\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043e\u043f\u0440\u043e\u0441\u0430. <\/p>\n<p>\u041c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u043b\u0430 \u043c\u044b\u0441\u043b\u044c: \u00ab\u0410 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043f\u0440\u043e\u0449\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0435\u0439 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0449\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u043c\u0435\u0441\u0442\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438?\u00bb<\/p>\n<p>\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 RTOS, \u043f\u043e\u0441\u0435\u043c\u0443 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0441\u044f. \u041d\u043e \u044f \u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0435\u043a\u0430\u044f \u0437\u043e\u043b\u043e\u0442\u0430\u044f \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438 \u0432 Python, JavaScript, Dart \u0438 Rust. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043d\u0435 \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043f\u043e\u0442\u043e\u043a\u0438 \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u044d\u0434\u0430\u043a\u0443\u044e \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u043c\u0435\u043d\u044f \u043e\u0441\u0435\u043d\u0438\u043b\u043e: \u00ab\u041a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u041e\u0421\u00bb.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0448\u0443 \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043c\u0438\u0433\u0430\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043a <code>p<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0438\u043e\u0434 \u043c\u0438\u0433\u0430\u043d\u0438\u044f. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u043c\u0438\u0433\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u0438 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438. \u041f\u0440\u0438 \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0446\u0438\u043a\u043b \u043c\u0438\u0433\u0430\u043d\u0438\u044f \u0443\u0436\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c, \u0432\u0434\u0432\u043e\u0435 \u043a\u043e\u0440\u043e\u0447\u0435 \u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 (<code>p\/2<\/code>).<\/p>\n<p>\u0414\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439, <code>led_blinker<\/code>, \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: <code>LED_ON<\/code>\u00a0\u0438\u00a0<code>LED_OFF<\/code>. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 <code>LED_ON<\/code>\u00a0\u0432\u00a0<code>LED_OFF<\/code>\u00a0\u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0432 <code>p\/2<\/code>, \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0438\u0437 <code>LED_OFF<\/code> \u0432\u00a0<code>LED_ON<\/code>\u00a0\u043f\u043e\u0441\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u043e\u0442 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>resetLed<\/code>,\u00a0<code>led_blinker<\/code>\u00a0\u0442\u0443\u0442 \u0436\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>LED_OFF<\/code>, \u0432 \u043a\u0430\u043a\u043e\u043c \u0431\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u043d \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>LED_OFF<\/code>.<\/p>\n<p>\u0423 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430,\u00a0<code>button_record<\/code>, \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:\u00a0<code>WAIT_BUTTON_PRESSED<\/code>\u00a0\u0438\u00a0<code>WAIT_BUTTON_UNPRESSED<\/code>. \u0412 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u043c\u0451\u0442 \u043a\u043d\u043e\u043f\u043a\u0443. \u041f\u043e\u0441\u043b\u0435 \u0435\u0451 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f <code>t_s<\/code> \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u00a0<code>WAIT_BUTTON_UNPRESSED<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u043f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043e\u0442\u043f\u0443\u0441\u0442\u0438\u0442 \u043a\u043d\u043e\u043f\u043a\u0443. \u041a\u043e\u0433\u0434\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430, \u043e\u043d \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f <code>t_e<\/code>, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u0443\u043f\u0435\u0440\u0438\u043e\u0434 \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 <code>p\/2 = t_e - t_s<\/code>, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u00a0<code>resetLed<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e <code>WAIT_BUTTON_PRESSED<\/code>.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u043e\u043f\u0440\u043e\u0441\u0430 \u0434\u043b\u044f Arduino \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#define BUTTON_PIN 2  enum led_blink_state {   STATE_LED_OFF = 0,   STATE_LED_ON };  uint64_t led_blink_duration_ms = 1000; uint64_t led_blink_toggle_time = 0; uint8_t reset_led_requested = 0;  enum button_record_state {   STATE_WAIT_BUTTON_PRESSED = 0,   STATE_WAIT_BUTTON_UNPRESSED };  void setup() {   led_blink_state = STATE_LED_OFF;   button_record_state = STATE_WAIT_BUTTON_PRESSED;   led_blink_toggle_time = millis() + led_blink_duration_ms;    pinMode(LED_BUILTIN, OUTPUT);   pinMode(BUTTON_PIN, INPUT_PULLUP); }  void poll_led_blink() {   static enum led_blink_state = STATE_LED_OFF;   if (led_blink_state == STATE_LED_OFF) {     digitalWrite(LED_BUILTIN, LOW);   } else if (led_blink_state == STATE_LED_ON) {     digitalWrite(LED_BUILTIN, HIGH);   }       if (reset_led_requested) {       reset_led_requested = 0;       led_blink_state = STATE_LED_OFF;       led_blink_toggle_time = millis() + led_blink_duration_ms;   } else if (millis() &gt;= led_blink_toggle_time) {     if (led_blink_state == STATE_LED_OFF) {       led_blink_state = STATE_LED_ON;     } else if (led_blink_state == STATE_LED_ON) {       led_blink_state = STATE_LED_OFF;     }     led_blink_toggle_time = millis() + led_blink_duration_ms;   } }  void poll_button_record() {   static enum button_record_state = STATE_WAIT_BUTTON_PRESSED;   static int button_pressed_start_time = 0;   if (button_record_state == STATE_WAIT_BUTTON_PRESSED) {     if (digitalRead(BUTTON_PIN) == LOW) {       button_record_state = STATE_WAIT_BUTTON_UNPRESSED;       button_pressed_start_time = millis();     }    } else if (button_record_state == STATE_WAIT_BUTTON_UNPRESSED) {     if (digitalRead(BUTTON_PIN) == HIGH) {       button_record_state = STATE_WAIT_BUTTON_PRESSED;       int button_pressed_end_time = millis();       led_blink_duration_ms = button_pressed_end_time - button_pressed_start_time;       reset_led_requested = 1;     }   } }  void loop() {   poll_led_blink();   poll_button_record(); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430\u0448\u0438\u0445 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432 \u043d\u0430 C. \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0432 \u043a\u043e\u0434 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u0434, \u0442\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 <code>poll_led_blink<\/code>\u00a0\u0438\u00a0<code>poll_button_record\u00a0functions<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044f, \u0430 \u044d\u0442\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0438 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043f\u0440\u043e\u0449\u0435, \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0436\u0430\u0442\u0438\u044f\/\u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438, \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>resetLed<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0451 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u0442\u043e\u0433\u043e \u0436\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u0430? \u0422\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0447\u0438\u0441\u0442\u043e\u043c\u0443, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 FreeRTOS \u2014 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043c\u043e\u0436\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;Arduino_FreeRTOS.h&gt;  #define BUTTON_PIN 2  TickType_t led_blink_duration_ticks = pdMS_TO_TICKS(1000);  TaskHandle_t led_blink_task_handle; #define NOTIFYBIT_RESET_LED 0x80  void led_blink() { \u00a0 while (true) { \u00a0\u00a0\u00a0 digitalWrite(LED_BUILTIN, LOW); \u00a0\u00a0\u00a0 \/\/ \u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f resetLed \u0438\u043b\u0438 \u043e\u0442\u0441\u0447\u0451\u0442\u043e\u0432 led_blink_duration_ticks. \u00a0\u00a0\u00a0 if (xTaskNotifyWait(0, NOTIFYBIT_RESET_LED, NULL, led_blink_duration_ticks) == pdTRUE) { \u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ \u0421\u043e\u0431\u044b\u0442\u0438\u0435 resetLed \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e -&gt; \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a. \u00a0\u00a0\u00a0\u00a0\u00a0 continue; \u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 digitalWrite(LED_BUILTIN, HIGH); \u00a0\u00a0\u00a0 \/\/ \u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f resetLed \u0438\u043b\u0438 \u043e\u0442\u0441\u0447\u0451\u0442\u043e\u0432 led_blink_duration_ticks. \u00a0\u00a0\u00a0 xTaskNotifyWait(0, NOTIFYBIT_RESET_LED, NULL, led_blink_duration_ticks); \u00a0 } }  void wait_pin(int pin, int level) { \u00a0 while (digitalRead(pin) == level) \u00a0\u00a0\u00a0 ; }  void button_record() { \u00a0 while (true) { \u00a0\u00a0\u00a0 wait_pin(BUTTON_PIN, HIGH); \u00a0\u00a0\u00a0 TickType_t start_time_ticks = xTaskGetTickCount();  \u00a0\u00a0\u00a0 wait_pin(BUTTON_PIN, LOW); \u00a0\u00a0\u00a0 TickType_t end_time_ticks = xTaskGetTickCount(); \u00a0\u00a0\u00a0 led_blink_duration_ticks = end_time_ticks - start_time_ticks; \u00a0\u00a0\u00a0 xTaskNotify(led_blink_task_handle, NOTIFYBIT_RESET_LED, eSetBits);\u00a0 \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 resetLed \u0432 \u0437\u0430\u0434\u0430\u0447\u0443 led_blink. \u00a0 } }  void setup() { \u00a0 pinMode(LED_BUILTIN, OUTPUT); \u00a0 pinMode(BUTTON_PIN, INPUT_PULLUP);  \u00a0 xTaskCreate(led_blink, \"led_blink\", 512, NULL, 1, &amp;led_blink_task_handle); \u00a0 xTaskCreate(button_record, \"button_record\", 512, NULL, 1, NULL); }  void loop() {}<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c. \u041e\u043d \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u2014 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u043c\u0435\u0448\u0430\u043d \u0432\u0430\u0436\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441: \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043e\u043d\u043e \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 (\u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435) \u0440\u0430\u0441\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432\u0440\u043e\u0434\u0435 FreeRTOS.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0433\u0440\u0443\u0431\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 FreeRTOS. \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>button_recorder<\/code>:<\/p>\n<pre><code class=\"cpp\">CORO(button_recorder_fn, \u00a0\u00a0\u00a0\u00a0 CORO_NO_ARGS, \u00a0\u00a0\u00a0\u00a0 CORO_LOCALS(uint64_t button_pressed_start_time;), \u00a0\u00a0\u00a0\u00a0 CORO_CALLS( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CORO_CALL(wait_pin_low, wait_pin), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CORO_CALL(wait_pin_high, wait_pin)), { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_res_t res; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (true) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CALL(res, wait_pin_low, wait_pin, BUTTON_PIN, LOW); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LOCAL(button_pressed_start_time) = millis();  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CALL(res, wait_pin_high, wait_pin, BUTTON_PIN, HIGH); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint64_t button_pressed_end_time = millis(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 led_blink_duration_ms = button_pressed_end_time - LOCAL(button_pressed_start_time); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 coro_cond_var_notify(&amp;reset_led_signal); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return CORO_RES_DONE; \u00a0\u00a0\u00a0\u00a0 })<\/code><\/pre>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u0441\u043f\u043b\u043e\u0448\u043d\u0430\u044f \u0441\u0442\u0435\u043d\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432. \u041d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e\u0442 \u0447\u0442\u043e. \u042d\u0442\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u043f\u043e \u0441\u0443\u0442\u0438, \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442. \u0427\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u0434\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u0430\u0447\u0435.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 C \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0435\u0434\u0451\u0442 \u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0444\u0440\u0435\u0439\u043c\u0430 \u0441\u0442\u0435\u043a\u0430 \u0432 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u043e.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0442\u0435\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438\u0437<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-467797","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=467797"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467797\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}