<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                與low\_level\_output()函數相反的是low\_level\_input()函數,該函數用于從網卡中接收一個數據包,并將數據包封裝在pbuf中遞交給上層。low\_level\_input()函數的編寫也需要用戶熟悉pbuf與網卡底層驅動,該函數的實現具體見 ``` 1 static struct pbuf * low_level_input(struct netif *netif) 2 { 3 struct pbuf *p = NULL; 4 struct pbuf *q = NULL; 5 uint16_t len = 0; 6 uint8_t *buffer; 7 __IO ETH_DMADescTypeDef *dmarxdesc; 8 uint32_t bufferoffset = 0; 9 uint32_t payloadoffset = 0; 10 uint32_t byteslefttocopy = 0; 11 uint32_t i=0; 12 13 14 /* get received frame */ 15 if (HAL_ETH_GetReceivedFrame(&heth) != HAL_OK) (1) 16 { 17 PRINT_ERR("receive frame faild\n"); 18 return NULL; 19 } 20 /*Obtain the size of the packet and put it into the "len" variable. */ 21 len = heth.RxFrameInfos.length; 22 buffer = (uint8_t *)heth.RxFrameInfos.buffer; (2) 23 24 PRINT_INFO("receive frame len : %d\n", len); 25 26 if (len > 0) 27 { 28 /* We allocate a pbuf chain of pbufs from the Lwip buffer pool */ 29 p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); (3) 30 } 31 32 if (p != NULL) 33 { 34 dmarxdesc = heth.RxFrameInfos.FSRxDesc; 35 bufferoffset = 0; 36 for (q = p; q != NULL; q = q->next) (4) 37 { 38 byteslefttocopy = q->len; 39 payloadoffset = 0; 40 41 /* Check if the length of bytes to copy in 42 current pbuf is bigger than Rx buffer size*/ 43 while ((byteslefttocopy + bufferoffset) > ETH_RX_BUF_SIZE) (5) 44 { 45 /* Copy data to pbuf */ 46 memcpy( (uint8_t*)((uint8_t*)q->payload + payloadoffset), 47 (uint8_t*)((uint8_t*)buffer + bufferoffset), 48 (ETH_RX_BUF_SIZE - bufferoffset)); (6) 49 50 /* Point to next descriptor */ 51 dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr); 52 buffer = (uint8_t *)(dmarxdesc->Buffer1Addr); (7) 53 54 byteslefttocopy = byteslefttocopy -(ETH_RX_BUF_SIZE - bufferoffset); 55 payloadoffset = payloadoffset + (ETH_RX_BUF_SIZE - bufferoffset); 56 bufferoffset = 0; (8) 57 } 58 /* Copy remaining data in pbuf */ 59 memcpy( (uint8_t*)((uint8_t*)q->payload + payloadoffset), 60 (uint8_t*)((uint8_t*)buffer + bufferoffset), byteslefttocopy); 61 bufferoffset = bufferoffset + byteslefttocopy; (9) 62 } 63 } 64 65 /* Release descriptors to DMA */ 66 /* Point to first descriptor */ 67 dmarxdesc = heth.RxFrameInfos.FSRxDesc; (10) 68 /* Set Own bit in Rx descriptors: gives the buffers back to DMA */ 69 for (i=0; i< heth.RxFrameInfos.SegCount; i++) 70 { 71 dmarxdesc->Status |= ETH_DMARXDESC_OWN; (11) 72 dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr); 73 } 74 75 /* Clear Segment_Count */ 76 heth.RxFrameInfos.SegCount =0; (12) 77 78 /* When Rx Buffer unavailable flag is set: clear it and resume reception */ 79 if ((heth.Instance->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) 80 { 81 /* Clear RBUS ETHERNET DMA flag */ 82 heth.Instance->DMASR = ETH_DMASR_RBUS; (13) 83 /* Resume DMA reception */ 84 heth.Instance->DMARPDR = 0; 85 } 86 return p; (14) 87 } ``` (1):看看是否接收到數據,如果沒有直接返回NULL,如果有則將數據獲取到heth數據結構中。 (2):獲取接收到數據包大小并將其放入len變量中,以及獲取數據區域存放在buffer指針中。 (3):調用pbuf_alloc()函數從LwIP的內存池中分配pbuf。 (4):如果pbuf分配成功,則將內存拷貝到pbuf中,因為pbuf可能不止一個,就需要遍歷pbuf鏈表將所有數據都存儲進來。 (5):檢查一下要拷貝的數據大小于接收緩沖區ETH_RX_BUF_SIZE的大小,如果要拷貝的數據大于ETH_RX_BUF_SIZE的大小,那么就要分幾次拷貝。 (6):將接收到的數據拷貝到pbuf中payload指向的數據區域。 (7):指向下一個描述符,得到未拷貝的數據區域地址buffer。 (8):重新計算還需要拷貝的數據大小byteslefttocopy,pbuf中數據的偏移量payloadoffset,重置接收緩沖區偏移量bufferoffset,然后重復進行拷貝,直到要拷貝的數據小于ETH_RX_BUF_SIZE的值,才退出while循環。 (9):將剩余的數據拷貝到pbuf中。 (10):dmarxdesc變量指向第一個接收描述符。 (11):進行遍歷描述符列表,將描述符中Status狀態設置為ETH_DMARXDESC_OWN。 (12):清除描述符中SegCount變量的值。 (13):清除DMA標志。 (14):重新恢復DMA接收。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看