ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Понедельник
27 июня
279767 Топик полностью
Связанные сообщения
BigloopМикропотреблениеАвтоматыАрхитектураFk0
[Ideal Diode] ORing мелкие микропотребляющие. MAX40203 LM66100 TPS2121 TPS2116 AP229132022-04-14
Доброе время суток, подскажите пожалуйста из личного опыта, в выборе микрокотроллера ультра минималка потребление, для батареечн...2022-01-25
Профиль потребления микроконтроллера от батарейки, кто чем смотрит?2021-01-20
Процитирую сам себя: "Разработка ПО большого объёма на языках с динамической типизацией, как правило затруднена, но в целом скор...2020-10-30
Классика жанра же: когда делаешь макрос, его всегда, кроме случаев когда невозможно, нужно делать выражением (а не оператором --...2020-09-11
Тебе не нужен STM32 + "Си". Тебе нужен Си отдельно и STM32, если вообще нужен, отдельно. Кусочно-выборочно процитирую сам себя: ...2020-09-10
const везде приведён разный (и непонятно почему именно такое значение), поэтому с ним сравнивать нет смысла. Можно...2020-08-14
Ну вот SOSUS свой доделаешь и предъявишь.2020-08-14
Субпороговое поведение MOSFET для аналоговых применений2020-07-20
Есть мысль перейти на RTOS для снижения временных затрат на реализацию программной части, отладку и профилировку. Важна поддержк...2020-06-18
Прототреды это биг-луп вывернутый наизнанку. Или наоборот. То же самое, что конечные автоматы им. Шалыто, switch-технология. Удо...2020-06-11
Пользуйся:2020-06-11
Надо понимать, что класс -- это не структура. Применительно к C++ мне больше нравится слово тип. Тип -- это сущность существующа...2020-04-26
Микропотребляющие сдвоенные компараторы со встроенной опорой2020-04-08
Микропотребление. Тема неплохо разработана для носимых устройств, но для embedded мало что есть. Если кого-то интересует данная ...2020-03-31
Железо нужно симулировать не на уровне битов и фронтов сигналов, а на уровне высокоуровневых операций (например, чтение-запись б...2019-11-07
Процитирую самого себя: "Зачем вообще использовать "экспоненциальное скользящее среднее", кроме как от бедности (не хватает ресу...2019-11-01
Да, примерно об этом я и думаю. Что систему КА можно запускать параллельно, на пуле потоков, по выбирая готовые к запуску по мер...2019-10-22
Как запустить параллельную систему КА написано у Шалыто лет 20 тому назад. Впрочем и самому додуматься можно. Тема уже изъезженн...2019-10-22
Ровно наоборот. Конечные автоматы подразумевают ЯВНОЕ выделение всех возможных состояний программы (как множества состояний сист...2019-10-21
Выскажу ещё раз: FreeRTOS сырая недоделка, смысла особого, без реализации ряда перечисленного (см. ниже) не имеет и, хуже того, ...2019-10-18
"В контексте МК" никаких задач не должно быть! :) Контроллер рассчитан на обслуживание периферии, а потому никаких других событи...2019-09-20
Кооперативную не хотите попробовать? Написана на С, без ассемблера2019-09-02
Ты что-то не то говоришь. В тикле там свой встроенный цикл обработки событий, либо можно свой написать вместо него, смотря как у...2018-12-01
Когда ПО прибора запускается на обычном ПК. Для этого обычно ПО разделяется на два слоя, как минимум: платформо-независимый (бол...2018-05-23
Подход, если не нужно реальное вытеснение (т.е. критично время реакции), порочный: сложные системы в "больших компьютерах", наоб...2015-09-12
Недавно делал такое. Если не к спеху - вечером из дома закину код. Upd:2014-08-28
Да, трэш угар и содомия. Иногда абстракции через край, поэтому я имею такое мнение, что иногда и не грех в исходники прямо вписа...2013-12-29
Не совсем. Над HAL может быть ещё один слой, уже нужный для совмещения разных программных интерфейсов. Т.е. есть модуль A, котор...2013-10-25
Вот и отличненько. Удалось значит понять суть: императивный стиль программирования повсеместно вдалбливаемый в (не)окрепший мозг...2013-07-31
Давно холиваров не было. Как насчёт RTOS vs Main Loop? Поделитесь практическим опытом. Сам RTOS не применял, да и не очень хочет...2013-07-24
Полезны аж 3 прослойки (ассемблеристам дальше лучше не читать):2011-10-13
Тут очень любят рассуждать о RTOS и всём таком. Но как-то массово замалчивается, что стандартная C-библиотека для неопределённог...2011-08-13
X-post: Необходим-ли низкочастотный кварц для AVR? Влияние CLKPR на энергопотребление.2010-08-31
fk0, легенда (24.10.2011 02:41, просмотров: 1312) ответил или нет? на Правильно, если нет select, значит write блокирующий.
Топик посвящён программированию микроконтроллеров в условиях необходимости экономии электроэнергии и архитектуре ПО в целом. Что касается архитектуры: в википедии (см. ссылку в начале топика) показано несколько вариантов Embedded software architectures. Если исключить вариант использования ОС, то практически часто используется так называемый big loop (Simple control loop). В википедии также отдельно выделяется Interrupt controlled system, но часто эти два метода объединены в один примерно следущим образом: есть "драйвера" различной аппаратуры, время-критичная часть которых исполняется в обработчике прерываний, всё остальное выполняется в основном цикле "big loop". В котором, как сказано в википедии, просто последовательно вызываются различные компоненты программы. Ввиду того, что компоненты могут быть относительно независимыми и при этом не могут блокировать выполнение цикла, например, зацикливанием в какой-либо подпрограмме, потому, что тогда прекратится выполнение других компонентов, то обычно состояние отдельных компонентов хранится в переменных, а сами компоненты реализуются как конечные автоматы, например. Также в главном цикле сбрасывается watchdog таймер например. Причём, возможно, по какому-либо условию, а не в каждом цикле, например, строго 10 раз в секунду, с использованием программного таймера, что гарантирует сброс при случаном запрещении прерываний (таймер остановится). Компоненты взаимодействуют между собой путём непосредственного вызова их функций, путём наблюдения за переменными состояния, путём переменных-флагов и т.п. Отдельным случаем "big loop" является такая архитектура, когда непосредственно большого цикла, в котором поочерёдно выполняются все компоненты нет. Это хорошо подходит для программ, где есть какой-то основной компонент. В таком случае состояние этого компонента может определяться счётчиком программных инструкций PC. Удобно, например, когда вся работа прибора управляется через GUI-интерфейс на дисплее. В таком случае во всех циклах внутри программы главного компонента (ожидание ввода-вывода, например) вызывается некоторая функция idle(), например, внутри которой находится тот же big loop, описанный в предыдущем абзаце -- что обеспечивает работу других компонентов. Собственно об экономии энергии. Классическая big loop программа будет на 100% загружать ядро микроконтроллера вычислениями и потреблять энергию. Это принципиальный недостаток big loop. Решением могла бы быть ОС или другая событийно-ориентированная система программирования. Можно ввести в цикл задержку, например, запускать исполнение цикла строго раз в N миллисекунд, например. На время задержки микроконтроллер переводится в SLEEP режим. Это так называемая time-triggered архитектура. Это подходит для каких-то простых задач. Но если компонентов относительно много, они между собой взаимодействуют, и какое-либо событие (смена состояния, установка флага...) в одном компоненте может повлечь изменения в ещё нескольких компонентах, то в time-triggered системе это всё может занять значительное время, по очевидным причинам. Возможен другой способ остановить процессор: в каждом цикле процессор засыпает до возникновения аппаратного прерывания, а после возникновения любого прерывания, наоборот, не засыпает в течении нескольких циклов. Это позволяет обойти ситуацию описанную выше (считается, что все компоненты провзаимодействуют за эти несколько циклов или вызовут аппаратное прерывание). В случае, если какому-либо компоненту требуется производить длительные вычисления, то можно ввести функцию, вызываемую этим компонентом, для запрета засыпания в следующем цикле. В ситуации, когда программа не может положиться только на прерывания и от неё требуется реакция с какой-то определённой задержкой -- используется таймер периодически генеририрующий прерывания с меньшим периодом. Да это всё плохие способы, но практически это работает. Странно, что это всё не описывается в литературе. Там всё больше биты, регистры и тому подобные вещи, в пересказе с ошибками -- эти сведения можно почерпнуть и из даташита. А на вопрос "а как писать сколько-нибудь большие программы для микроконтроллеров" умные дяди отвечают "ха! это и есть know-how, мы на этом деньги зарабатываем"... Сразу отвечаю на вопрос, откуда вызвавший нарекания на говнокод write() вообще взялся -- я хотел только сказать, что: во-первых вообще негоже вот-так в SFR-регистры что-то записывать из основного цикла, лучше иметь какой-то драйвер UART, к нему уже функцию write, а для UART и вовсе FIFO с прерываниям. Принцип один -- разделяй и властвуй. Когда в одной функции мешаются SFR и логика программы -- это ни перенести на другой контроллер, ни отладить. Во-вторых сама идея блокирующего цикла, ожидающего весьма заметное время, пока данные будут переданы через медленный UART -- порочна. Если есть FIFO, то ситуацию можно значительно сгладить, но не исключить вовсе. По-уму стоило бы либо довести логику этой функции до конечного автомата с двумя состояниями ("передача", "готов") и исключить блокировку при передаче. Либо предусмотреть вызов в цикле, в котором вызывается write(), некой функции idle()... Теперь отвечаю непосредственно на счёт select() -- надумано. Никто не мешает открывать файл с O_NONBLOCK и не использовать select(). Но в ОС это приводит к 100% cpu load, в микроконтроллере к потреблению электричества. С чем бороться можно и без select(), чем-то вроде usleep(100), например. Метод имеет очевидный недостаток: время исполнения цикла задерживается. В ОС данный недостаток без помощи select и т.п. функций не обойти. А в микроконтроллере можно по методике описанной выше.
[ZX]