• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь МНОГОПОТОЧНОСТЬ

=AK=

New member
Я вообще-то сначала думаю а потом пишу.
Попробуйте сделать на ESP8266 на RTOS измерение температуры с интервалом 1 сек с передачей по WIFI и средним потребляемым током за секунду не более 20 ма.
На немножко другом процессоре я это делал со средним потребляемым током 40 мкА. Использовал простенькую RTOS. Вместо WIFI был другой радиоканал, у которого потребление при передаче не 400 мА, как у ESP, а 40 мА. Десять раз разницы в токе передатчика, а средний ток в 500 раз меньше, чем вам хотелось бы получить. Причем не термистор мерял, а Pt100, два канала. И не просто термометр, а даталоггер. Год автономной работы от батарейки.

И чё?
 

Grem_line

New member
Вы просто напишите код который даст лучше результаты тем те, которые получаются при работе на металле в ESP8266 .
Что Вы понимаете под работой на металле? В какой среде Вы ведете разработку?
Напишите "Hello World" на металле. Какой объем образа, загружаемого во флэш, у Вас получится? Сравните с объемом Ваших объектных кодов до линковки ...
 

nikolz

Well-known member
Что Вы понимаете под работой на металле? В какой среде Вы ведете разработку?
Напишите "Hello World" на металле. Какой объем образа, загружаемого во флэш, у Вас получится? Сравните с объемом Ваших объектных кодов до линковки ...
пишу в UDK. объем кода будет не более 1 Кбайт (примерно столько получается размер rboot, который содержит deep-sleep и прерывание от pin и выводит сообщение)
если тоже будет на SDK то во флеш загрузится примерно 200 Кбайт.
Позже выложу, сейчас занят.
 

rst

Member
А я думаю, что Вы слишком высокого мнения о возможностях компилятора. :)
В обработчике прерывания никто не мешает использовать вызовы процедур, в том числе и библиотечных.
А Вы не думайте, а откройте проект с обычным ISR, нажмите "скомпилить" и откройте листинг.
А если обойтись без вызова функций в ISR, не думали?
И если Вы не можете даже простейший ISR написать без "библиотек", ну что-ж - мне Вас жаль.

Вот код для переключения контекста RTOS Multex для процессоров ARMv6:
...
Вы правы - "куча действий";)
Ну да ну да. Вы форумом не ошиблись? Здесь вроде не форум кухарок, чтобы нести ахинею. Я думаю здесь всё-таки есть люди, которые знают предмет не в теории.
а) конечно забыли о вызове собственно прерывания (стекинг на входе в ISR PendSV);
б) сохранение/восстановление контекста;
в) а если задача использует FPU? ещё 33 регистра сохранить и 33 восстановить!;
г) выход из ISR;
д) а теперь самое главное, что конечно же забыли само собой: то что вы привели это только собственно переключение контекста; а теперь вопрос - в Вашем примере выбор задачи, следующей для выполнения (NextTask у Вас) где и кем выполняется? Чтобы переключиться на другую задачу ОС, надо её выбрать из списка готовых, активных, наиболее приоритетную, т.е. - просмотреть список задач, проанализировать их состояния, просмотреть таймеры ожидания этих зада и пр. И всё это называется решедулинг. Это где в Вашем примере? Конечно же забыли :cool:
А говорили, что ОС там какую-то писали. Ну-ну! :D
А эти операции как раз и будут составлять львиную долю затрат производительности МК в случае ОС. Теперь прикиньте сколько операций потребуется для периодического переключения между Вашими тремя задачами, которые Вы приводили выше, если частота SysTick скажем ==1КГц?
Так вот: если то же самое реализовать на ISR-е (а тем более в стиле tick-less переключения), то затраты времени на такие переключения между "псевдо-задачами" будут на порядки меньше. Так как для входа/выхода в обычный ISR требуются только пункты а) и г) и всё! :eek:

PS: И тот кусок что привели выше: зачем так много команд? Нафига повторно сохранять R0-R3,R12, которые и так записываются в стек при стекинге на входе в PendSV? Изучите готовые примеры прежде чем изобретать свой деревянный велосипед с квадратными колёсами. :)
 
Последнее редактирование:

Grem_line

New member
Здесь вроде не форум кухарок, чтобы нести ахинею.
Ну вы, батенька и хам! Когда нечего сказать - переходите на оскорбления?
В чем тут ахинея - это абсолютно рабочий фрагмент, реализующий переключение контекста.
Выбор задачи - это совсем другое. Я не собираюсь тут выкладывать алгоритмы, но все отлично работает.
При двух задачах - вообще не медленнее ваших ISR-костылей.
Частота системного таймера 1 КГц, но вполне можно выставить и 20.
а) конечно забыли о вызове собственно прерывания (стекинг на входе в ISR PendSV);
Прерывание не вызывают! Это прерывание вызывает ISR. Такие оговорки вызывают сомнения в вашей компетентности.
Смена контекста происходит не в ISR. После обработки любого прерывания вызывается диспетчер задач, который и осуществляет переключение.
Кроме того, переключение происходит при попытке захвата закрытого семафора, при выполнении функций типа taskDelay и т.п.
Теперь прикиньте сколько операций потребуется для периодического переключения между Вашими тремя задачами, которые Вы приводили выше
Ничуть не больше, чем в вашей ISR от таймера! Каждая из трех задач будет однократно активирована раз в 50, 70 и 90 мсек.
И тот кусок что привели выше: зачем так много команд? Нафига повторно сохранять R0-R3,R12, которые и так записываются в стек при стекинге на входе в PendSV?
Че? Вы сами-то поняли, что сказали? Когда задача хочет перейти из состояния ACTIVE в состояние DELAYED это просто вызов процедуры переключения контекста. Для ARM-процессора при вызове процедуры в стек вообще ничего не записывается, чтоб вы знали. Адрес возврата передается в LR.
Так как для входа/выхода в обычный ISR требуются только пункты а) и г) и всё! :eek:
:mad:А вы попробуйте дизассемблировать код ISR. Или просто реализуйте ISR на ассемблере. Разглагольствовать все горазды, а разок попробовать - вся спесь куда-то девается.
 

nikolz

Well-known member
Ну вы, батенька и хам! Когда нечего сказать - переходите на оскорбления?
В чем тут ахинея - это абсолютно рабочий фрагмент, реализующий переключение контекста.
Выбор задачи - это совсем другое. Я не собираюсь тут выкладывать алгоритмы, но все отлично работает.
При двух задачах - вообще не медленнее ваших ISR-костылей.
Частота системного таймера 1 КГц, но вполне можно выставить и 20.

Прерывание не вызывают! Это прерывание вызывает ISR. Такие оговорки вызывают сомнения в вашей компетентности.
Смена контекста происходит не в ISR. После обработки любого прерывания вызывается диспетчер задач, который и осуществляет переключение.
Кроме того, переключение происходит при попытке захвата закрытого семафора, при выполнении функций типа taskDelay и т.п.

Ничуть не больше, чем в вашей ISR от таймера! Каждая из трех задач будет однократно активирована раз в 50, 70 и 90 мсек.

Че? Вы сами-то поняли, что сказали? Когда задача хочет перейти из состояния ACTIVE в состояние DELAYED это просто вызов процедуры переключения контекста. Для ARM-процессора при вызове процедуры в стек вообще ничего не записывается, чтоб вы знали. Адрес возврата передается в LR.

:mad:А вы попробуйте дизассемблировать код ISR. Или просто реализуйте ISR на ассемблере. Разглагольствовать все горазды, а разок попробовать - вся спесь куда-то девается.
Вы немного отвлеклись от темы форума.
Форум о ESP8266 это далеко не ARM.
Если хотите сравнить давайте я напишу миганием лампочки без OC на металле, а Вы с RTOS и сравним опять же для ESP8266. Пишем на CИ.
У меня будет не более 1000 байт у Вас не менее 200 000 байт. Это как аксиома.
Далее вопрос о скорости исполнения. Я например на металле могу установить таймер с интервалом 2 мкс и успеть выполнить колбек.
В Вашем варианте полагаю будет ограничение порядка 100 мкс. Но тут надо проверять.
 

rst

Member
В чем тут ахинея - это абсолютно рабочий фрагмент, реализующий переключение контекста.
Выбор задачи - это совсем другое. Я не собираюсь тут выкладывать алгоритмы, но все отлично работает.
При двух задачах - вообще не медленнее ваших ISR-костылей.
И опять пустой трёп. На конкретные замечания ничего не ответили (поняли ли вообще?) Опять переливание из пустого в порожнее...
Вобщем: писать Вам что-то серьёзное рано ещё. Даже простые вещи понять не можете. Одно пустое надувание щёк и надёрганные откуда-то куски кода...
Больше говорить с вами не о чем.
 

rst

Member
Если хотите сравнить давайте я напишу миганием лампочки без OC на металле, а Вы с RTOS и сравним опять же для ESP8266.
Это бесполезно. Товарищ не понимает очевидных вещей. И откровенно несёт чушь.
Шедулинг в РТОС - это не при чём конечно и его считать не надо при учёте затрат времени (хоть он и будет составлять львиную часть затрат времени в случае с ОС). Так можно любые факты подтасовать, ничего Вы ему не докажете. На все аргументы он плюёт и несёт ахинею. При этом слабо представляя себе предмет обсуждения. o_O
 

=AK=

New member
Если хотите сравнить давайте я напишу миганием лампочки без OC на металле, а Вы с RTOS и сравним опять же для ESP8266. Пишем на CИ.
У меня будет не более 1000 байт у Вас не менее 200 000 байт. Это как аксиома.
Давайте сравним. Только мне ESP для сравнения не годится , потому что неохота ради такой мелкой ерунды осваивать SDK, а в среде Ардуино для ESP8266 нет нужной мне библиотеки setjmp. Давайте сравним на обычной плате ардуино. В нем нет 200к памяти, но мне и не надо. Я думаю мне 1к-2к хватит, чтобы опровергнуть вашу липовую "аксиому".

Вот вам код: a_coos. Там в примере две задачи, одна зажигает светодиод раз в 0.65 сек, другая гасит тот же светодиод раз в 0.5 сек. Могу переписать пример на моргание 3-мя светодиодами в произвольном темпе. Pазмер кода практически не увеличится, займет это от силы пару минут.

А вы не забудьте засечь время, сколько вы будете корячиться с написанием примера без RTOS.
 
Последнее редактирование:

nikolz

Well-known member
Давайте сравним. Только мне ESP для сравнения не годится , потому что неохота ради такой мелкой ерунды осваивать SDK, а в среде Ардуино для ESP8266 нет нужной мне библиотеки setjmp. Давайте сравним на обычной плате ардуино. В нем нет 200к памяти, но мне и не надо. Я думаю мне 1к-2к хватит, чтобы опровергнуть вашу липовую "аксиому".

Вот вам код: a_coos. Там в примере две задачи, одна зажигает светодиод раз в 0.65 сек, другая гасит тот же светодиод раз в 0.5 сек. Могу переписать пример на моргание 3-мя светодиодами в произвольном темпе. Pазмер кода практически не увеличится, займет это от силы пару минут.

А вы не забудьте засечь время, сколько вы будете корячиться с написанием примера без RTOS.
Хамить не надо.
 

nikolz

Well-known member
Давайте сравним. Только мне ESP для сравнения не годится , потому что неохота ради такой мелкой ерунды осваивать SDK, а в среде Ардуино для ESP8266 нет нужной мне библиотеки setjmp. Давайте сравним на обычной плате ардуино. В нем нет 200к памяти, но мне и не надо. Я думаю мне 1к-2к хватит, чтобы опровергнуть вашу липовую "аксиому".

Вот вам код: a_coos. Там в примере две задачи, одна зажигает светодиод раз в 0.65 сек, другая гасит тот же светодиод раз в 0.5 сек. Могу переписать пример на моргание 3-мя светодиодами в произвольном темпе. Pазмер кода практически не увеличится, займет это от силы пару минут.

А вы не забудьте засечь время, сколько вы будете корячиться с написанием примера без RTOS.
Выкладываю прошивку
делает следующее
1) мигает на пине 12(одна задача зажигает пин, другая гасит)
2) выводит в UART сообщение о включении и выключении
Размер прошивки 268 байт.
Размер программы 15 операторов CИ, из них 2-print 2-gpio_out
Затраченное время посчитайте сами.
Можете сравнить с Вашим вариантом на RTOS.
 

Вложения

  • 333 байт Просмотры: 8

nikolz

Well-known member
Вы посчитали хамством, что я привел пример укладывающейся в 1к? :D
нет, я посчитал хамством, что Вы "корячитесь"
Вы забыли прибавить размер кода RTOS потому что Ваша программа без этого не работает а моя работает в 268 байт
 

=AK=

New member
Выкладываю прошивку
делает следующее
1) мигает на пине 12(одна задача зажигает пин, другая гасит)
С разным темпом? 0.65 сек - зажигает, 0.5 сек - гасит?


2) выводит в UART сообщение о включении и выключении
Размер прошивки 268 байт.
Размер программы 15 операторов CИ, из них 2-print 2-gpio_out
Затраченное время посчитайте сами.
Можете сравнить с Вашим вариантом на RTOS.
Compiled.png
1540 байт. В 2к уложился, 200к не понадобилось.

Значит вам, говорите, в ESP8266 скорости и памяти не хватает, чтобы термометр сделать? Каждый байт и каждый такт приходится считать? :D
 

nikolz

Well-known member
С разным темпом? 0.65 сек - зажигает, 0.5 сек - гасит?




Посмотреть вложение 6378
1540 байт. В 2к уложился, 200к не понадобилось.

Значит вам, говорите, в ESP8266 скорости и памяти не хватает, чтобы термометр сделать? Каждый байт и каждый такт приходится считать? :D
Вы все гадаете?
Просто покажите прошивку Будет точно известен объем кода.
 
Сверху Снизу