Garmin
Member
После того, как я добился устойчивого соединения по WiFi между двумя модулями ESP-12, я занялся проверкой качества и возможной скорости соединения.
Для этого я написал простенькую программу.
Вначале массив из 64 байт (16 слов) забивается константами. Первое слово назначается номером пакета и при каждой передаче оно увеличивается на 1. Это и будет тестовый пакет для передачи по UDP.
Затем по прерыванию от внешней ножки я передаю пакет. Предварительно убедившись, что модули соединились. Для передачи использую функцию espconn_send. После каждой передачи увеличиваю номер посылки.
Во время приёма я использую коллбэк
user_udp_struct.recv_callback = user_udp_receive_cb;
Во время приёма я проверяю IP адрес отправителя и порт отправителя, длину посылки и номер посылки. При несовпадении данных записываю сигнатуру посылки.
Проверка заключается в периодическом опросе данных сигнатур.
Так вот, когда я передаю данные с частотой 300 Гц, у меня проходят почти все пакеты. На 1-10 тыс. посылок приходится 2-10 потерянных пакетов.
Ошибок IP, MAC, длины не происходит.
А только я поднимаю скорость передачи посылок до 3 кГц (1.5Мбод), то получаю 25% потерянных пакетов.
Повышение частоты процессора до 180 МГц уменьшает процент потерь до 10%.
Я так понимаю, что процедура отправки слишком медленная.
Как тогда добиваются передачи данных на скорости до 10 Мбод в веб-свалке?
Для этого я написал простенькую программу.
Вначале массив из 64 байт (16 слов) забивается константами. Первое слово назначается номером пакета и при каждой передаче оно увеличивается на 1. Это и будет тестовый пакет для передачи по UDP.
Код:
/*******************************************************************************
* Тестовые данные в буфер
*******************************************************************************/
void ICACHE_FLASH_ATTR set_udata (void)
{
volatile u32 *p_buf = b.send;
*p_buf++ = 0; // index
*p_buf++ = 0x05040302;
*p_buf++ = 0x09080706;
*p_buf++ = 0x0d0c0b0a;
*p_buf++ = 0x11100f0e;
*p_buf++ = 0x15141312;
*p_buf++ = 0x19181716;
*p_buf++ = 0x1d1c1b1a;
*p_buf++ = 0x21201f1e;
*p_buf++ = 0x25242322;
*p_buf++ = 0x29282726;
*p_buf++ = 0x2d2c2b2a;
*p_buf++ = 0x31302f2e;
*p_buf++ = 0x35343332;
*p_buf++ = 0x39383736;
*p_buf++ = 0x3d3c3b3a;
}
Код:
static void __attribute__((optimize("O2"))) spi_int_handler (void *para)
{
dport_isr_flag_t dport_value = DPORT->isr_flag_bits;
volatile u32 *buffer;
__IO u32 *spi_reg;
// прерывание от spi0
if (dport_value.spi0_isr)
{
// стереть флаги разрешения прерывания и статуса прерывания
SPI0->slave &= ~(SPI_SLAVE_INT_STT_MASK | SPI_SLAVE_INT_EN_MASK);
}
// прерывание от spi1
if (dport_value.spi1_isr)
{
SPI1->slave &= ~(SPI_SLAVE_INT_STT_MASK); // сотрём флаги прерываний
espconn_send (&g.user_udp_struct, (u8 *)b.send, 64); // struct espconn *espconn, uint8 *psent, uint16 length
b.send[0]++; // увеличить индекс
}
if (dport_value.i2s_isr)
{
// прерывание от i2s
}
}
user_udp_struct.recv_callback = user_udp_receive_cb;
Код:
/*******************************************************************************
* функция, вызываемая после приёма данных по UDP
*
*******************************************************************************/
void __attribute__((optimize("O2"))) user_udp_receive_cb (void *arg, char *pdata, unsigned short len)
{
struct espconn *parg = arg;
u32 *data = (u32 *)pdata;
g.num_err = 0;
if (g.state == U_STATE_TRANSMIT)
{
// сравнить IP
g.num_err += tcp_compare (parg->proto.udp->remote_ip, g.user_udp_struct.proto.udp->remote_ip);
// сравнить порт
g.num_err += port_compare (parg->proto.udp->remote_port, g.user_udp_struct.proto.udp->remote_port);
// сравнить длину посылки == 64 байта
g.num_err += len_compare (len);
// тест - сравнить номер посылки
g.receive_index++;
if (*data != g.receive_index)
{
g.num_err += 8;
g.prev_index = g.receive_index;
g.now_index = *data;
g.receive_index = *data;
}
if (g.num_err == 0)
{
// передача по SPI
}
else
{
g.count_err++;
}
}
}
Проверка заключается в периодическом опросе данных сигнатур.
Так вот, когда я передаю данные с частотой 300 Гц, у меня проходят почти все пакеты. На 1-10 тыс. посылок приходится 2-10 потерянных пакетов.
Ошибок IP, MAC, длины не происходит.
А только я поднимаю скорость передачи посылок до 3 кГц (1.5Мбод), то получаю 25% потерянных пакетов.
Повышение частоты процессора до 180 МГц уменьшает процент потерь до 10%.
Я так понимаю, что процедура отправки слишком медленная.
Как тогда добиваются передачи данных на скорости до 10 Мбод в веб-свалке?
Последнее редактирование: