2

我想在开启 DHCP 和 TCP 连接的情况下制作 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 连接以下载它。

然后我有一个间隔为 2 秒的轮询计时器,它检查 PHY 并读取电缆状态:

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

或者:

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

4

1 回答 1

3

在感谢 lwip 用户支持(感谢 Pomeroy Marty、Sylvain Rochet、Richard 和其他帮助我的人 -辩论链接)论坛后,我来回答:

在计时器调用中:

//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);
        }
}
于 2013-06-01T19:12:12.723 回答