<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                在無操作性移植的時候,我們的網卡收發數據就是單純的收發數據,ethernetif\_input()函數就是處理接收網卡數據的,但是使用了操作系統的話,我們一般將接收數據獨立成為一個網卡接收線程,這樣子在收到數據的時候才去處理數據,然后遞交給內核線程,所以我們只需要稍作修改即可,將函數轉換成線程就行了,并且在初始化網卡的時候創建網卡接收線程。當然,我們也能將發送函數獨立成一個線程,我們暫時沒有必要去處理它,此處只創建一個網卡接收線程,具體見代碼清單 8?4。 ``` 1 void ethernetif_input(void *pParams) 2 { 3 struct netif *netif; 4 struct pbuf *p = NULL; 5 netif = (struct netif*) pParams; 6 LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); 7 8 while (1) 9 { 10 if (xSemaphoreTake( s_xSemaphore, portMAX_DELAY ) == pdTRUE) 11 { 12 /* move received packet into a new pbuf */ 13 taskENTER_CRITICAL(); 14 p = low_level_input(netif); 15 taskEXIT_CRITICAL(); 16 /* points to packet payload, which starts with an Ethernet header */ 17 if (p != NULL) 18 { 19 taskENTER_CRITICAL(); 20 /* full packet send to tcpip_thread to process */ 21 if (netif->input(p, netif) != ERR_OK) 22 { 23 LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); 24 pbuf_free(p); 25 p = NULL; 26 } 27 taskEXIT_CRITICAL(); 28 } 29 } 30 } 31 } ``` 在網卡接收線程中需要留意一下以下內容:網卡接收線程是需要通過信號量機制去接收數據的,一般來說我們都是使用中斷的方式去獲取網絡數據包,當產生中斷的時候,我們一般不會在中斷中處理數據,而是告訴對應的線程去處理,也就是我們的網卡接收線程去處理數據,那么就會通過信號量進行同步,當網卡接收到了數據就會產生中斷釋放一個信號量,然后線程從阻塞中恢復,去獲取網卡的數據并且向上層遞交。 當然我們還需要在中斷中對網卡底層進行編寫,具體見代碼清單 8?5 ``` 1 void ETH_IRQHandler(void) 2 { 3 uint32_t ulReturn; 4 /* 進入臨界段,臨界段可以嵌套 */ 5 ulReturn = taskENTER_CRITICAL_FROM_ISR(); 6 7 HAL_ETH_IRQHandler(&heth); 8 9 /* 退出臨界段 */ 10 taskEXIT_CRITICAL_FROM_ISR( ulReturn ); 11 } 12 13 14 extern xSemaphoreHandle s_xSemaphore; 15 void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth) 16 { 17 // LED2_TOGGLE; 18 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; 19 xSemaphoreGiveFromISR( s_xSemaphore, &xHigherPriorityTaskWoken ); 20 portYIELD_FROM_ISR(xHigherPriorityTaskWoken); 21 } ``` 此外我們還需要在網卡初始化的時候創建網卡接收線程與對應的信號量,網卡初始化函數還是low\_level\_init()函數,并且初始化的其他信息都未修改,只是添加了線程與信號量的創建,具體見代碼清單 8?6加粗部分。 ``` 1 static void low_level_init(struct netif *netif) 2 { 3 HAL_StatusTypeDef hal_eth_init_status; 4 5 //初始化bsp—eth 6 hal_eth_init_status = Bsp_Eth_Init(); 7 8 if (hal_eth_init_status == HAL_OK) 9 { 10 /* Set netif link flag */ 11 netif->flags |= NETIF_FLAG_LINK_UP; 12 } 13 14 #if LWIP_ARP || LWIP_ETHERNET 15 16 /* set MAC hardware address length */ 17 netif->hwaddr_len = ETH_HWADDR_LEN; 18 19 /* set MAC hardware address */ 20 netif->hwaddr[0] = heth.Init.MACAddr[0]; 21 netif->hwaddr[1] = heth.Init.MACAddr[1]; 22 netif->hwaddr[2] = heth.Init.MACAddr[2]; 23 netif->hwaddr[3] = heth.Init.MACAddr[3]; 24 netif->hwaddr[4] = heth.Init.MACAddr[4]; 25 netif->hwaddr[5] = heth.Init.MACAddr[5]; 26 27 /* maximum transfer unit */ 28 netif->mtu = NETIF_MTU; 29 30 /* Accept broadcast address and ARP traffic */ 31 /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */ 32 #if LWIP_ARP 33 netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP; 34 #else 35 netif->flags |= NETIF_FLAG_BROADCAST; 36 #endif /* LWIP_ARP */ 37 38 /* USER CODE BEGIN PHY_PRE_CONFIG */ 39 40 s_xSemaphore = xSemaphoreCreateCounting(40,0); 41 42 /* create the task that handles the ETH_MAC */ 43 sys_thread_new("ETHIN", 44 ethernetif_input, /* 任務入口函數 */ 45 netif, /* 任務入口函數參數 */ 46 NETIF_IN_TASK_STACK_SIZE,/* 任務棧大小 */ 47 NETIF_IN_TASK_PRIORITY); /* 任務的優先級 */ 48 49 #endif /* LWIP_ARP || LWIP_ETHERNET */ 50 51 /* Enable MAC and DMA transmission and reception */ 52 HAL_ETH_Start(&heth); 53 } ```
                  <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>

                              哎呀哎呀视频在线观看