@Black_and_green
Студент

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

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

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

Насколько я понимаю - это нужно делать с помощью цикла (event-loop'a) с задачами. (для micropython есть uasyncio)
Но как правильно выйти из задачи отправки, чтобы считать данные - я плохо представляю (или отправка одного eth(или tcp пакета?)-фрейма будет меньше 25 мс и вероятнее всего я успею вернутся из таска?)

Порекомендуйте литературу/сайты о том, как правильно писать для микроконтроллеров.
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 2
Jeer
@Jeer
уверенный пользователь
Очень много разномастных тем в одном вопросе. Вы начните делать и появятся более конкретные вопросы.

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

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

Насчет "раз в 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. Короче гугл в помощь
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы