Как правильно спроектировать приложение для микроконтроллера?
===============================================================

**Задача, которую я решаю:**  

> Есть датчики, которые нужно опрашивать раз в 25 мс, кэшировать эти данные и отправлять на сервер в случае появления сети. Также хотелось бы добавить обработку нажатия клавиши - для сброса настроек. 

  

В качестве основы собираюсь взять **ESP-32**. Писать хотелось бы на **Micropython**, но не обязательно.  

  

Насколько я понимаю - это нужно делать с помощью цикла (event-loop'a) с задачами. (для micropython есть uasyncio)  

Но как правильно выйти из задачи отправки, чтобы считать данные - я плохо представляю (или отправка одного eth(или tcp пакета?)-фрейма будет меньше 25 мс и вероятнее всего я успею вернутся из таска?)  

  

Порекомендуйте литературу/сайты о том, как правильно писать для микроконтроллеров. 

 Очень много разномастных тем в одном вопросе. Вы начните делать и появятся более конкретные вопросы.  

  

Как спроектировать:  

Возьмите лист бумаги, выпишите на него построчно все свои хотелки, расставьте приоритеты и выполняйте задачи по очереди.  

  

Что значит цикл с задачами? В самом примитивном случае у вас в микроконтроллере обычно есть какой-то цикл, им и пользуйтесь. Задачи опроса датчиков или отправки данных оборачиваются в отдельные функции, а в цикле просто эти функции вызываются.  

  

Насчет "раз в 25 мс". Цикл простой, работает бесконечно и без остановок. Но в какой-то строчке появляется приостановление работы программы. То есть, не цикл запускается раз в 25 мс, а цикл приостанавливается на 25 мс. 

 Посмотри паттерны проектирования итератор и команда - для твоей задачи они зайдут как по-маслу. А архитектура очень простая: каждый датчик у тебя будет объектом структуры с одним единственным элементом - указателем на функцию измерения и записи в ethernet-пакет результатов измерения. Таким образом ты сможешь поддерживать совершенно разные типы датчиков (аналоговые с измерением через АЦП и цифровые с итерфейсами I2C, SPI, UART and etc.) В своем коде можешь реализовать любой алгоритм обхода и формирования пакета (от структуры пакета будет зависит порядок обхода датчиков). Как сформировал пакет сразу отправляешь его в контроллер на отправку (можешь делать через буферизацию и прерывания либо ждешь пока контроллер отправит предыдущий пакет, а вообще самый лучший способ отправки - через DMA). Отправка третьим способом займен несколько наносекунд, а всю остальную работу возмет на себя железо. Во втором случае - чуть дольше, в первом - на скорости в 10 мбит/с 150 мкс, на скорости 100 мбит/с 15 мкс, на скорости 1 Гбит/с - 1.5 мкс.   

  

По кнопке здесь тоже все достаточно просто - заводишь внешнее прерывание и делаешь что должна делать кнопка. А можешь применить паттер команда и сможешь буферизировать операции от целой приборной панели.  

  

P.S. Имхо писать под микроконтроллеры на python - это не лучшая идея. Куда проще на чистом Си, так как у тебя есть доступ ко всем возможностям железа и ты не ограничем расками языка и библиотек.  

P.P.S. Написание программ для микроконтроллеров практически ничем не отличается от написания программ под обычные компьютеры - код он и в африке код будет. Разница в том, что на микроконтроллере тебе придется напрямую работать с железом и понимать как оно работать и понимать физику работы коммуникационных интерфейсов. А сайты - благо их навалом: easyelecronics, microsin, osdev. Короче гугл в помощь