2

DHCP をオンにして TCP 接続を使用して、lwip ケーブルのオン/オフを防弾にしたいと考えています。どちらのソリューションも問題なく機能しますが、どちらがより賢明で正しいかはわかりません。(間違ったコンテキスト関数呼び出しが怖い)

  • 最初の解決策:

電話する:

tcpip_init(network_init, &net);

その後:

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

したがって、メインlwIPスレッドとスレッドの2つのスレッドがあり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);

これらの関数をタイマー割り込みで呼び出すのは正しいと思います。

  • 2番目の解決策:

lwip2 番目の方法は、タイマー割り込みがメインスレッドにメッセージを送信することです。

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

タイマー割り込みは、メイン lwip スレッドに次のいずれかを呼び出すメッセージを送信します。

netif_set_link_up(pxNetIfInUse);

また:

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

ケーブルの状態 (タイマー割り込みから保存) を格納するためのグローバル変数があり、メイン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 に答える