Проверил. За пол часа не чихнул даже. Не хватает быстродействия или
я не умею его готовить? По ссылке мегабайты/сек пересылают, а у
меня 128 кБайт/сек не получается.
http://microsin.net/programming/dsp/ee-312-building-complex-vdk-lwip-blackfin-applications.html
Код на основе какого-то примера из internet. АЦП заполняет буфер в 1024 байта, при заполнении отдаёт блок на передачу (кольцо указателей), а дальше уже заталкивается в PBUF. Из увиденного в вайршарке можно пробовать отдавать в стек фрагментами по 1400 байт и выпихивать принудительно через tcp_out(); чтобы не билось на 2 пакета по 1460+хвостик. Но чуйка нашёптывает, что я чего-то не вижу или не понимаю: при таком потоке данных должно справляться. Может и main() где-то долго тупит, но вряд ли: там только стек прокручивается, проверяется наличие готового блока данных из прерываний от АЦП и по 1 символу за проход в консоль выводится(если есть что).
// -- main.c --
if ( ADC_Exist() && ((EthStatusÐ_LINK_FLAG) == 0) ) { if( ADC_Exist() == 8 ) putchar('!'); tcp_client_transmit( ADC_Blockptr(), BLK_SZ/2); ADC_Release(); }
// --Опрос стека тут же--
/* check if any packet received */ if ( ETH_CheckFrameReceived() ) { /* process received ethernet packet */ LwIP_Pkt_Handle(); } /* handle periodic timers for LwIP */ LwIP_Periodic_Handle( ntp_to_ms(SystemTime) /*LocalTime*/ );
// ---- Ставит в буфер на отправку.
err_t tcp_client_transmit(char *p, int len) { struct pbuf *pb; if (c_desc->state != CS_CONNECTED) { return ERR_CONN; } /* allocate pbuf */ pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_POOL); if (pb != NULL) { /* copy data to pbuf */ pbuf_take(pb, p, len); // Add payload to pbuf if (c_desc->p_tx == NULL) { c_desc->p_tx = pb; }else{ pbuf_chain( c_desc->p_tx, pb); // Add to tail //c_desc->p_tx = pb; } /* send data */ tcp_client_send( c_desc->pcb, c_desc); return ERR_OK; }else{ printf("LN:: %u\r\n", __LINE__); pbuf_free(pb); printf(" %hu, ",c_desc->pcb->snd_buf ); printf(" %hu, ",c_desc->pcb->snd_wnd ); printf(" x%08X ", (unsigned int)c_desc->pcb->next ); tcp_go( c_desc->pcb); return ERR_MEM; } }
// ---- Собсвенно отдаёт стеку данные.
static void tcp_client_send(struct tcp_pcb *tpcb, struct client_s * c_desc) { struct pbuf *ptr; err_t wr_err = ERR_OK; while ((wr_err == ERR_OK) && (c_desc->p_tx != NULL) && (c_desc->p_tx->len <= tcp_sndbuf(tpcb))) { /* get pointer on pbuf from c_desc structure */ ptr = c_desc->p_tx; /* enqueue data for transmission */ wr_err = tcp_write(tpcb, ptr->payload, ptr->len, TCP_WRITE_FLAG_COPY); if (wr_err == ERR_OK) { /* continue with next pbuf in chain (if any) */ c_desc->p_tx = ptr->next; if(c_desc->p_tx != NULL) { /* increment reference count for c_desc->p */ pbuf_ref(c_desc->p_tx); } /* free pbuf: will free pbufs up to c_desc->p (because c_desc->p has a reference count > 0) */ pbuf_free(ptr); } else if(wr_err == ERR_MEM) { /* we are low on memory, try later, defer to poll */ printf("LN:: %u\r\n", __LINE__); c_desc->p_tx = ptr; } else { /* other problem ?? */ printf("LN:: %u\r\n", __LINE__); } } // Echo some info for debug int a=0; a = ( (wr_err == ERR_OK) ) ? a : a|1 ; a = ( (c_desc->p_tx != NULL) ) ? a|2 : a ; a = ( (c_desc->p_tx->len <= tcp_sndbuf(tpcb)) ) ? a : a|4 ; if(a != 0) { printf("\'L%u:%d", __LINE__, a); printf(" %hu\' ", pbuf_clen(c_desc->p_tx) ); tcp_go( c_desc->pcb); } }