Ruslan
тут стеки, но я уже хер знает че сделать
ㅤ
тут стеки, но я уже хер знает че сделать
Ну стеки стеки. Можно их уменьшить
Ruslan
Ну можно юзать таймеры фриртос. xTimerCreate хотя бы. Они то наверняка должны встать вместе с прошивкой
Qwen3-235B-A22B 10:18 PM 📌 Анализ кода stwd100.c и рекомендации по исправлению проблем 🔍 Проблемы в текущем коде Вы сообщаете, что: • Связь работает через CMUX . • Проблем с сертификатами нет . • TLS-соединение работает только при отключенном таймере STWD100 . • Это указывает на то, что таймер STWD100 мешает работе TLS / MQTT , хотя он не связан напрямую с сетевыми операциями. ❗ Основная проблема: частый вызов gpio_set_level() в контексте таймера Ваш таймер вызывает callback каждые HALF_PERIOD_MS миллисекунд (например, 375 мс), и в нем выполняется: c 9 1 › gpio_set_level(WDI_PIN, state); Так как это статический таймер , запущенный с периодом HALF_PERIOD_MS, он генерирует прерывания и вызывает функцию обратного вызова внутри ядра FreeRTOS. Проблема: Вызов gpio_set_level() в контексте таймера может быть небезопасным , особенно если этот вызов происходит в критических секциях или блокирует выполнение других задач. Кроме того: • Функция xTimerStart() вызывается из stwd100_init(), но неясно, где она используется. • Если период слишком маленький (например, менее 50 мс), это может нарушить работу сетевых задач ESP-IDF , которые чувствительны к частым переключениям контекста. • ✅ Решения и оптимизации 1. Используйте задачу вместо таймера Таймеры в FreeRTOS имеют ограничения — они работают в контексте системной задачи и могут вызывать проблемы с производительностью.
ㅤ
Qwen3-235B-A22B 10:18 PM 📌 Анализ кода stwd100.c и рекомендации по исправлению проблем 🔍 Проблемы в текущем коде Вы сообщаете, что: • Связь работает через CMUX . • Проблем с сертификатами нет . • TLS-соединение работает только при отключенном таймере STWD100 . • Это указывает на то, что таймер STWD100 мешает работе TLS / MQTT , хотя он не связан напрямую с сетевыми операциями. ❗ Основная проблема: частый вызов gpio_set_level() в контексте таймера Ваш таймер вызывает callback каждые HALF_PERIOD_MS миллисекунд (например, 375 мс), и в нем выполняется: c 9 1 › gpio_set_level(WDI_PIN, state); Так как это статический таймер , запущенный с периодом HALF_PERIOD_MS, он генерирует прерывания и вызывает функцию обратного вызова внутри ядра FreeRTOS. Проблема: Вызов gpio_set_level() в контексте таймера может быть небезопасным , особенно если этот вызов происходит в критических секциях или блокирует выполнение других задач. Кроме того: • Функция xTimerStart() вызывается из stwd100_init(), но неясно, где она используется. • Если период слишком маленький (например, менее 50 мс), это может нарушить работу сетевых задач ESP-IDF , которые чувствительны к частым переключениям контекста. • ✅ Решения и оптимизации 1. Используйте задачу вместо таймера Таймеры в FreeRTOS имеют ограничения — они работают в контексте системной задачи и могут вызывать проблемы с производительностью.
Бля. И ты туда же. Не беси меня этой шляпой.
Ruslan
ну хули делать, китайцы говорят, что твоя тема с таймером говно
ㅤ
ну хули делать, китайцы говорят, что твоя тема с таймером говно
Хорошо,они молодцы. Однако я не говорил, что оно должно решить проблемы с ТЛС. Это был лишь вопрос к говну которое ты написал вместо таймера. Нравятся таски юзай ради бога, однако гарантировать что таска будет работать так же четко как таймер ровно нуль.
Ruslan
I (19:15:07.272) MQTT: Heap info: Heap summary for capabilities 0x00001000: At 0x3ffae6e0 len 6432 free 0 allocated 5308 min_free 0 largest_free_block 0 alloc_blocks 37 free_blocks 0 total_blocks 37 At 0x3ffb36d8 len 182568 free 55560 allocated 118932 min_free 5732 largest_free_block 49136 alloc_blocks 356 free_blocks 16 total_blocks 372 At 0x3ffe0440 len 129984 free 129096 allocated 0 min_free 129096 largest_free_block 126960 alloc_blocks 0 free_blocks 1 total_blocks 1 At 0x3ff80000 len 8192 free 7796 allocated 0 min_free 7796 largest_free_block 7664 alloc_blocks 0 free_blocks 1 total_blocks 1 Totals: free 192452 allocated 124240 min_free 142624 largest_free_block 126960 W (19:15:07.336) MQTT: Free heap: 192452
Ruslan
казалось бы хипа просто дохрена
ㅤ
казалось бы хипа просто дохрена
Ну включи логирование tls и смотри что ему не нравится
Ruslan
с приоритетами аккуратен
ㅤ
Да херня всё это твои приоритеты
Ruslan
в проекте четыре таска создаются...
ㅤ
И чо дальше.У тебя 240 мгц на ядро. Что ты там делаешь в них чтоб приоритетами регулировать ещё
Ruslan
160 в настройках
ㅤ
Ну ок 160. Вопрос прежний
Ruslan
ниче такого, всё расслабленно
ㅤ
ㅤ
Включи лог mbedtls verbose и смотри что ему не нравится
Ruslan
E (19:29:56.012) esp-tls: [sock=54] select() timeout E (19:29:56.013) esp-tls: Failed to open new connection E (19:29:56.014) TRANSPORT_BASE: Failed to open a new connection E (19:29:56.020) MQTT_CLIENT: Error transport connect
Ruslan
W (19:33:08.621) MQTT: Free heap: 200864
Petr
Может глупый вопрос задам, без tls вариантов нет попробовать?
Ruslan
Может глупый вопрос задам, без tls вариантов нет попробовать?
есть, но нахуя? я там выше писал, что если эту таску не стартовать, то TLS отлично работает
Ruslan
через CMUX (SIM800L)
Resident
через CMUX (SIM800L)
Таки понятно что это узкое место
ㅤ
Таки понятно что это узкое место
Чейта оно узкое. Это просто тунель сраный
Petr
Ну всякое может быть. Понять в таске ли дело. Не факт что в ней
Tonchik
https://github.com/espressif/esp-idf/issues/11728 It seems the TCP SYN is no response. Could you confirm that the PPPoS module is access to Internet. Besides, you can ping your PPP IP to check the PPP connection is OK.
Ruslan
код ебейшей таски, которая убивает TLS handshake: static void task(void *pv_parameter) { (void)pv_parameter; uint16_t state = 0; TickType_t delay = pdMS_TO_TICKS(HALF_PERIOD_MS); while (true) { gpio_set_level(WDI_PIN, ++state % 2); vTaskDelay(delay); } }
Ruslan
А ты таске стек то сколько выставил кстати?
2к, пробовал 8к, разницы никакой
ㅤ
2к, пробовал 8к, разницы никакой
Интересно, зачем ты пробовал стек больше) Выглядит как какие-то рандомные действия. Я бы все же вербос на всё включил и изучал
Resident
код ебейшей таски, которая убивает TLS handshake: static void task(void *pv_parameter) { (void)pv_parameter; uint16_t state = 0; TickType_t delay = pdMS_TO_TICKS(HALF_PERIOD_MS); while (true) { gpio_set_level(WDI_PIN, ++state % 2); vTaskDelay(delay); } }
Ну странно, у меня тож связь через подобный модем, ничего подобного не замечал, за что отвечает переключение этого пина?
Ruslan
это было после вербоза
Ruslan
ну, хотя бы хип увеличил в процессе скачек, раньше рекорд был 135 после старта всего, щас 150
Ruslan
вот и меня удивляет, как банальная задача ломает всё...
Resident
ну, хотя бы хип увеличил в процессе скачек, раньше рекорд был 135 после старта всего, щас 150
Странно что это такое там вы делаете, у нас 140кб памяти Занято 40кб И связь по ppp Несколько сокетов И async тасков куча, и каждый модуль логируется, и хз чем ещё хеп забивать то?
Resident
вот и меня удивляет, как банальная задача ломает всё...
Может быть больше аппратаная проблема? Тогда это больше объясняет
Tonchik
вот и меня удивляет, как банальная задача ломает всё...
она что-то стопит во время дерганья пина и переключения контекста на время делэя
ㅤ
Странно что это такое там вы делаете, у нас 140кб памяти Занято 40кб И связь по ppp Несколько сокетов И async тасков куча, и каждый модуль логируется, и хз чем ещё хеп забивать то?
Тут есть одна проблема в фрагментации памяти. Увы, оно не показывает обьем самого длинного участка. И внезапно при соединении с тлс ему нужно длинный кусок чтоб уместить жирную цепочку сертификатов. Вот тут могут быть и роблемы
Resident
вот и меня удивляет, как банальная задача ломает всё...
У вас модем на переназначеных пинах используется?
Ruslan
Resident
Беда печаль =(
Resident
А ещё последнее время всё хуже в малых городах пободные модемы у нас работают =( но нашли приемлемый выход вроде бы
Ruslan
А сделай переменные статиками, тож самое?
все переменные или только конкретные?
ㅤ
А сделай переменные статиками, тож самое?
Да ну это уж совсем из разряда хз что делать
Tonchik
может, попробовать xTaskGetTickCount до вызова сет пин и после, посмотреть сколько тиков оно занимает? плюс глянуть сколько тиков спит
Max
Да ну это уж совсем из разряда хз что делать
Не, оно должно не на стеке выделять
ㅤ
Не, оно должно не на стеке выделять
Там щас выяснится что у него где то уход за указатель. А просто новый таск просто оказался не в то время не в том месте. В си вариант выстрелить так себе в ногу вполне реален
Petr
сдается мне дело не в таске, поэтому и предлагаю временно тлс убрать и посмотреть будет ли беда
Ruslan
у меня утечек нет пару лет
Tonchik
https://esp32.com/viewtopic.php?t=34631 вот тут ровно 10
ㅤ
у меня утечек нет пару лет
Я изменил сообщение
ㅤ
Бывает такое что в коде успешно годами все работает, где убежал за указатель. А когда добавляются новые вводные… вот тут сюрприз
Petr
чему кстати делей-то равен HALF_PERIOD_MS? если его жирнее сделать, все так же ломается?
Ruslan
чему кстати делей-то равен HALF_PERIOD_MS? если его жирнее сделать, все так же ломается?
750мс, жирнее нельзя, отъёбнёт аппаратный вачдок и всё уйдёт в ребут
Max
Или интервал ватчдога задирать перед коннекцией, а потом возвращать
ㅤ
В итоге тот указатель начинает тереть совсем другой кусок памяти…
ㅤ
Фигачь все в глобальные переменные))
Я скока раз попадался раньше, когда забывал в строках выделить x+1 вместо x. По итогу оно при новых вводных заезжало этим nullz на другой кусок памяти, казалось бы все работало годами. А том херак…
ㅤ
Если вы поняли о чем я
Ruslan
мы поняли
Ruslan
Если вы поняли о чем я
ты понял вопрос про пины, на который я картинкой ответил?