2013-05-22 27 views
2

我想通過DHCP和TCP連接來開啓/關閉lwip電纜。兩種解決方案都可以正常工作,但我不知道哪一個更明智,更正確。 (恐怕不合適的環境中函數調用)在FreeRTOS中實現線程間通信的最佳方式是什麼? - 檢查lwIP電纜的狀態

  • 解決方案一:

我打電話:

tcpip_init(network_init, &net); 

並在那之後:

xTaskCreate(hc_task, (signed portCHAR *) "send hc",1536u, NULL, TCPIP_THREAD_PRIO, NULL); 

因此,有2線程主線程lwIP線程和hc_task線程。 hc_task是:

static void hc_task(void *parameters) 
{ 
    struct hc_message mes; 
    mes.client_port_number = 4839; 
    mes.host_addres = "192.168.1.183\0"; 
    mes.host_add[0] = 192; 
    mes.host_add[1] = 168; 
    mes.host_add[2] = 1; 
    mes.host_add[3] = 183; 
    mes.host_file = "test/data.php\0"; 
    mes.host_port_number = 80; 
    mes.target = "http://192.168.1.183/test/data.php\0"; 

    transferEnd = 0; 
    numberOfPacketsProc = 0; 
    totalRecievedSize = 0; 

    hc_send(&mes, 0); 
    vTaskDelete(NULL); 
} 

hc_send做一個TCP連接到一些網頁下載。

然後,我有與檢查PHY並讀取電纜狀態2秒的間隔輪詢定時器:

if cable is on -> ok 
if cable is off -> call netif_set_link_down(pxNetIfInUse); 

現在下一次當電纜繼續我稱:

netif_set_link_up(pxNetIfInUse); 

我猜測在定時器中斷中調用這些函數是正確的。

  • 第二溶液:

第二種方法是,定時器中斷將消息發送到主lwip螺紋:

Link off -> res = sys_mbox_trypost(toOutput, &msg); 

定時器中斷髮送主LWIP線程的消息到打電話:

netif_set_link_up(pxNetIfInUse); 

o R:

netif_set_link_down(pxNetIfInUse); //(in lwip main thread) 

我有一個全局變量來存儲電纜狀態(從定時器中斷保存),我檢查它在主線程lwip調用正確的函數(或鏈接上下)。所以我問的是哪種解決方案是更好/正確的方式來做到這一點:在定時器中斷調用鏈接關閉或向上(這些是lwip函數)或者定時器中斷向主lwIP線程發送消息?

我的配置: 微處理器LPC1768 - LAN8720 PHY - FreeRTOS操作系統7.4 - LWIP 1.4。1個 - DHCP包括 - TCP/IP包括

回答

3

經過感謝LWIP用戶支持一些天(感謝波默羅伊馬蒂·西爾萬·羅歇,理查德和其他誰hellped我 - link to debate)論壇上,我來回答:

在計時器呼叫:

//link off 
printf("Interrupt LINK OFF\n" ); 
iface_up = 0; 
resultCall = tcpip_callback_with_block(tcp_set_link_status, NULL, 0); 

//link on 
printf("Interrupt LINK ON\n" ); 
resultCall = tcpip_callback_with_block(tcp_set_link_status, NULL, 0); 

因此函數將在下文中主要LWIP TCP/IP線程的線程上下文來執行這是正確的:

void tcp_set_link_status(void) 
{ 
     if(cableState == 0) 
     { 
       printf("TCP callback printf set link down \n"); 
       netif_set_link_down(pxNetIfInUse); 
     } 
     else 
     { 
       printf("TCP callback Printf set link up \n"); 
       netif_set_link_up(pxNetIfInUse); 
     } 
} 
相關問題