配置了一个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){
- }
- }
-
- }
|