• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
Вы все гадаете?
Просто покажите прошивку Будет точно известен объем кода.
 
Сверху Снизу