Vsnprintf() на ESP32 (два ядра, несколько задач)

Кто-нибудь сталкивался со странным поведением vsnprintf() на ESP32? У меня две задачи, запущены на ядре0 (arduino core запущен на core1). Иногда крэшится при вызове vsnprintf(). Причем, даже не важна сама строка - она может быть как с форматированием, так и просто hello world!. Происходит редко, обычно в самом начале исполнения скетча. Stack overrun. Я уже и стеки у задач увеличивал, и что только не делал.

Это фишка newlib на данной платформе такая, или что? Всякие log_e работают без вопросов.

В глобальный буфер vsnprintf отрабатывает без вопросов, а если буфер на стеке - то лотерея. Делал большой буфер на стеке, писал в него маленькие строчки - один хрен, stack overrun, canary exception.

Явные гонки какие-то происходят. Но, может, так оно и задумано, и vsnprintf на ESP32 не reentrant, и нужно все обкладывать мутексами.

Никто в такое не влетал?

Ты троллишь, да?

Понятно. Русскоязычные форумы все на одно лицо.

Почитал вашу дискуссию на другом форуме. Вопрос, конечно, сложноват для хоббийного форума.
Я не совсем понял, зачем вам изобретать свой принтФ - разве пакет для есп32:штатно его не поддерживает?

Это в чей огород ?

Да ни в чей конкретно.
Сами посудите - самописный vsnprintf() да еще под мультизадачной средой - много ли вообще любителей хотя бы понимают, о чем речь?
Это специфика, до которой добираются единицы.

ЗЫ формулировку поправил, но суть та же

Почему самописный то ? Вы хоть одну строчку кода увидели ???

смотрите на ардуино.сс, там подробнее
Автор пишет свою либу и ему надо (цитирую)

I need a wrapper to call Serial.printf(…) from the C code.

на статическом буфере не крашится жеж!

RE

Чего тут понимать-то елки-палки? Всё написано.

Что происходит - понятно, непонятно почему.

Конечно непонятно. Кода-то нет.

вот его вызов

void
xprintf(const char* format, ...) {
	
  va_list args;
  va_start(args, format);
  
  char buf[128];
  vsnprintf(buf, 128, format, args);
  
  va_end(args);

  Serial.print(buf);
}

понятно, создать проблему и героически её решать
ЗЫ на нулевом ядре стек сетевого протокола, чего лезть туда со своими кривыми ручками

И? Как по этому вызову диагностировать переполнение стека?

это как иллюстрация, что ТС ничего “особенного” не делает. Обычные локальные переменные.
Он пишет, что если buf выделять динамически - проблема исчезает (что, в общем, тоже понятно).
Непонятно, почему эти два вызова наезжают друг на друга

@Komandir не заводись, дело не в ТС, просто вопрос интересный

и да, по ссылке на ардуино.сс есть полный код

Я с ума схожу или что? Давай еще раз процитирую

Ок, я заметил что ты часто пытаешься выставить собеседника идиотом, вместо того чтоб ответить. Или сам не знаешь?

Почему это происходит?
Это локальные переменные двух разных потоков. Разве не дело ОС следить за тем, чтобы они не наезжали друг на друга?

Размер стека под задачу лимитирован.