配置了一个UDP单播,在任务中周期发送数据,连接网线时没问题;拔掉网线时程序运行40多秒后会卡死在下面while中
static err_t low_level_output(struct netif *netif, struct pbuf *p)
{
static xSemaphoreHandle s_tx_semaphore = NULL;
struct pbuf *q;
uint8_t *buffer ;
uint16_t framelength = 0;
ErrStatus reval = ERROR;
SYS_ARCH_DECL_PROTECT(sr);
if (s_tx_semaphore == NULL){
vSemaphoreCreateBinary (s_tx_semaphore);
}
if (xSemaphoreTake(s_tx_semaphore, LOWLEVEL_OUTPUT_WAITING_TIME)){
SYS_ARCH_PROTECT(sr);
[color=Red] while((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)){[/color]
}
buffer = (uint8_t *)(enet_desc_information_get(dma_current_txdesc, TXDESC_BUFFER_1_ADDR));
for(q = p; q != NULL; q = q->next){
memcpy((uint8_t *)&buffer[framelength], q->payload, q->len);
framelength = framelength + q->len;
}
/* transmit descriptors to give to DMA */
#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE
reval = ENET_NOCOPY_PTPFRAME_TRANSMIT_ENHANCED_MODE(framelength, NULL);
#else
reval = ENET_NOCOPY_FRAME_TRANSMIT(framelength);
#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */
SYS_ARCH_UNPROTECT(sr);
/* give semaphore and exit */
xSemaphoreGive(s_tx_semaphore);
}
if(SUCCESS == reval){
return ERR_OK;
}else{
while(1){
}
}
}
|