В общем то, до чего удалось докопаться. Тот, кто писал эти драйвера видимо решил оттянуться по полной и воплотить все свои тайные программистские фантазии. Таких наворотов с такими разворотами и инкапсуляциями я ещё никогда и нигде не видел.
Всё настолько неподецки, я бы даже сказал всё настолько по взрослому, что мы с сенсеем alexsis_76 два дня только искали функцию, причём сенсей alexsis_76 так её и не нашёл, мне видимо повезло.
Из того, что мне удалось понять — мы имеем дело с псевдо-многозадачным кодом разбивающимся на два потока с переключением контекста. Интересующий нас код находится в файле ClientContext.h, в функции
Код: Выделить всё
size_t write(const char* data, size_t size)
Видимо в ней формируется задача и участок кода
Код: Выделить всё
_send_waiting = true;
delay(5000); // max send timeout
_send_waiting = false;
запускает её в работу. Как только этот параллельный код отрабатывает, управление возвращается к
отсюда задержка не в 5000 мс, в 200-400 мс, то есть столько, сколько коду требуется на посыл данных. Но где конкретно находится это кривой код и как он работает — непонятно.
Но это всё только мои предположения — хотелось бы услышать наконец компетентное мнение тех, кто тут всё время рассуждает про чистый с и ассемблер.