Alexey
как уже написали, создай глобальную строку, в неё добавляй из тасков, а другим таском эту строку выводи в сериал целиком или по частям используя разделитель.
Я про это и говорил изначально, как вариант, который мне не очень нравится - xSrmaphoreTake, самописная реализация некоего общего буфера. Думал, что есть что-то более нативное, позволяющее просто организовать монопольный доступ к Serial
Dmytro
Да вот у меня уже этих процессов... Не могу разгрести правильные приоритеты и интервалы, что задачи не терялись в очереди. Как раз-таки хотел получить простое решение, но, видимо, придётся идти сложными путями (
очереди - это и есть простой путь, а все остальное - сложные пути и костыли. А так в есп-idf это уже реализовано: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/log.html
Serjio
А подскажите, уважаемые, вот расхожий туториал в сети для простецкого http сервера на 8266. Почему оно работает только пока я обращаюсь с одного клиента. При попытке открыть с другого - виснет намертво. Чую, какие-то детские грабли..
𝖘𝖍𝖎𝖘𝖍
Всем привет. Поделитесь, пожалуйста, файлом сброса скрипта из esp8266
𝖘𝖍𝖎𝖘𝖍
Ну, чтобы снести то, что в ней есть
Andre
Ну, чтобы снести то, что в ней есть
зачем? можно просто обесточить.
𝖘𝖍𝖎𝖘𝖍
зачем? можно просто обесточить.
В смысле?) Там же еепром)
𝖘𝖍𝖎𝖘𝖍
И, от отключения питания, скетч останется в есп)
Anton
Скетч!
Andre
Скетч секретный, и нельзя допустить кражи кода из памяти? Чем отключённая от питания ESP отличается от ЕСП со "стёртой" прошивкой?
Andre
Чего нужно добиться в конечном счёте?
𝖘𝖍𝖎𝖘𝖍
Нет, дело не в этом. Просто хотел скинуть её до нуля И все обратно залить. Ибо в последнее время много отсечек пошло
Andre
Нет, дело не в этом. Просто хотел скинуть её до нуля И все обратно залить. Ибо в последнее время много отсечек пошло
вряд ли дело в коде, и вряд ли перезаливка поможет с осечками. Надо смотреть схемотехнику, исправлять код, или заменить ESP на новую. Последнее самое маловероятное.
Andre
Осечки это что?
𝖘𝖍𝖎𝖘𝖍
То релюха не сработает. То перезапускается... В самом начале такого небыло Я, конечно, попробую сегодня файл конфигурации очистить
Alexey
очереди - это и есть простой путь, а все остальное - сложные пути и костыли. А так в есп-idf это уже реализовано: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/log.html
Да вот фигушки! 10:11:10.227 > [I][MySial.cpp:23] serialAction(): Serial act[D][Serial.cpp:23] serialAction(): Serial action Вот вывод из двух разных потоков стандартными макросами ESP_LOGI и ESP_LOGD
Andy
Нет, дело не в этом. Просто хотел скинуть её до нуля И все обратно залить. Ибо в последнее время много отсечек пошло
т.е. надо очистить flash - см. тут https://docs.espressif.com/projects/esptool/en/latest/esp32/esptool/basic-commands.html
𝖘𝖍𝖎𝖘𝖍
Оу, с помощью питона. Интересно) Спасибо за статейку
Alexey
Кто как пишет логи в своих программах? Никто не пилил этот велосипед для потокобезопасного логирования?
Ruslan
я думаю слать в mqtt
Andy
Не вижу смысла в каком-то особом механизме логировании. То что есть в esp_idf уже достаточно
Ruslan
при разработке да, а в эксплуатации нужна телеметрия, я пока только mqtt попробовал
Alexey
Не вижу смысла в каком-то особом механизме логировании. То что есть в esp_idf уже достаточно
Так вот и недостаточно. Их стандартный лог НЕ потокобезопасный. Буфер вывода, записанный одним потоком, может быть перезаписан другим потоком (что и происходит довольно-таки часто, пример писал выше).
Alexey
при разработке да, а в эксплуатации нужна телеметрия, я пока только mqtt попробовал
Как слать в mqtt, если есть проблемы с подключением? Как эти логи отобразить? Я сейчас использую стандартный Serial и BtSerial
Alexey
Точно проблема в потоках?
Делаю два простых потока, которые пишут логи через ESP_LOGI и ESP_LOGD (больше ничего не делают, простейший пример для теста) Получаю на выходе в консоли 10:11:10.227 > [I][MySial.cpp:23] serialAction(): Serial act[D][Serial.cpp:23] serialAction(): Serial action Т. Е. В одно и то же время два потока решили написать в лог, и второй поток с ESP_LOGD вписал в середину буфера, когда туда вписывал ESP_LOGI
Andy
Делаю два простых потока, которые пишут логи через ESP_LOGI и ESP_LOGD (больше ничего не делают, простейший пример для теста) Получаю на выходе в консоли 10:11:10.227 > [I][MySial.cpp:23] serialAction(): Serial act[D][Serial.cpp:23] serialAction(): Serial action Т. Е. В одно и то же время два потока решили написать в лог, и второй поток с ESP_LOGD вписал в середину буфера, когда туда вписывал ESP_LOGI
Потокобезопастность тут не при чем на мой взгляд, указатель записи правильно перемещается по буферу. Если вы хотите что бы строки не перемешивались, вам надо блокировать буфер выше уровня вывода отдельных символов, на уровне вывода строк. Легче организовать очередь логирования
Alexey
Просто это будет "монопольный" доступ к консоли вывода. А в текущей реализации ESP-IDF налицо одновременный доступ к общему ресурсу, который приводит к искажению исходных данных. Поэтому и считаю, что это - "потокобезопасность". Или в чем я неправ?
Andy
Есть готовые примеры подобного логирования?
Под рукой нет, очевидный код: void vLogTask(void * vParam){ xQueueReceive(qLog, &Log, portMAX_DELAY); ESP_LOGI(Log.Tag, Log.sting); } void Log_out(char *tag, char *sting){ xQueueSnnd(qLog, &Log, portMAX_DELAY); ESP_LOGI(Log.Tag, Log.sting); } Log_out(TAG, "bla-bla");
Alexey
Разве таск не будет висеть в RUNNING, если очередь будет пустой? На xQueueReceive с portMAX_DELAY?
Andy
Разве таск не будет висеть в RUNNING, если очередь будет пустой? На xQueueReceive с portMAX_DELAY?
будет в состоянии Blocked, подробнее вот тут http://microsin.net/programming/arm/freertos-part2.html
Mike_Went
15 минут и контроллер готов. Ну как?
реле говно, через месяца два уже залипать начинают.
Mike_Went
купил SSR поэтому
Жексон
Видимо тебе не повезло
У меня такое реле на 3ий день залипло уже. И это всего при нагрузке БП 12v6А
Serjio
код простейший (как тут скрыть под кат?) к черту светодиоды, просто выдача http запроса. + сделал счетчик обращений https://pastebin.com/w1Ycf2dk
Serjio
ночью работало. утром проверил - уже и с одного клиента перестала открываться страница.
Serjio
надо будет еще роутер поколупать - посмотреть, что там в логах...
Serjio
пока что продолжаются приключения с установкой sdk, rtos - хочется потрогать
Алексей
У меня такое реле на 3ий день залипло уже. И это всего при нагрузке БП 12v6А
У меня уже 3-й месяц работает. В день по 20-30 срабатываний. Правда сила тока меньше 1 А
Serjio
точно!
Serjio
уже не редактируется, но спасибо за напоминание
Алексей
Ну на нем 10 написано
Serjio
точно, не там тыкал
Mike_Went
ага, и вотчдог хлоп
Mike_Went
питон не влезет, а луа норм
Mike_Went
(а джава уродская немношк, как и спп)
Mike_Went
> выучили нет.
Mike_Went
> знаю нет.
Ruslan
список в студию
Mike_Went
знать можно один, два. остальное это не «знать»
Serjio
вывод: тюториалы - говно. кстати, там же вроде есть свои примеры? надо попробовать готовый пример собрать (не будут же они туда бяку засовывать?)
garik
Проверяет в цикле раз в миллисекунду доступность клиента. Как только он доступен, едем дальше
Serjio
ну так а причины зависания?
Serjio
поставилась ртос! там и компиляция при отладке намного быстрее
Slava
вывод: тюториалы - говно. кстати, там же вроде есть свои примеры? надо попробовать готовый пример собрать (не будут же они туда бяку засовывать?)
Согласен, кстати поучиться можно на примерах широко применяемых и выросших в большие проекты, например тасмота
Serjio
1) надо знать, что за проекты. 2) как правило, там очень несложно заблудиться: большие проекты - большие задачи - много кода. а тут пробуешь по кирпичику.
Serjio
поставилась esp-free-rtos, компилирую их готовый http_server а в консоли поток Task stack overflow (high water mark=0 name="HTTP Daemon")
Serjio
разбираюсь, что это значит..
Slava
1) надо знать, что за проекты. 2) как правило, там очень несложно заблудиться: большие проекты - большие задачи - много кода. а тут пробуешь по кирпичику.
Когда научишься читать чужой говнокод всё нужное быстро понимаешь, а чтобы научиться читать чужой говнокод, нужно его читать. 😉
Serjio
тэкс, ну с какими-то манипуляциями оно завелось и вот уже пять минут полет нормальный , с разных клиентов)
Serjio
хотя иногда подтормаживает открытие
Serjio
но светодиодик отрабатывает мигание моментально
Serjio
и кстати, заливка один фиг долгая - я считаю, полминуты это долго. это память в esp модуле медленная?
ainu
в новых ESP (S3) через USB быстрая заливка
Serjio
https://aliexpress.ru/item/1005003341069001.html таких? у них даже два usb судя по картинке. ну в моем случае ch340. подозреваю, еще скорость заливки низкая. 92кбит/с. может, с более быстрой микрухой и измененным загрузчиком оно бы и пошустрее могло..
garik
Разве раз в секунду?
Не уверен, если честно. Предположил наугад 😄
garik
Разве раз в секунду?
Наверное всё же мс
Евгений
Разве раз в секунду?
А какие параметры передаются в delay? delay() Останавливает выполнение программы на заданное в параметре количество миллисекунд (1000 миллисекунд в 1 секунде).
Тецкатлипок
и кстати, заливка один фиг долгая - я считаю, полминуты это долго. это память в esp модуле медленная?
какие у вас параметры заливки? скорость и тд? у меня бинарник под 3мб секунд за 20 макс грузится
Serjio
esptool.py -p /dev/tty.wchusbserialfa130 --baud 115200 write_flash -fs 16m -fm qio -ff 40m \ 1x0 ../../bootloader/firmware_prebuilt/rboot.bin 0x1000 ../../bootloader/firmware_prebuilt/blank_config.bin 0x2000 ./firmware/http_server.bin
Serjio
а у вас? вот --baud можно поиграться наверное, но почему-то в мейкфайле именно эта скорость указана
Andy
Скорость зависит от чипа моста. Есть чипы для которых 115200 это максимальная скорость. А вот FT легко переваривают 2М