私は、DHCPオンとTCP接続で、lwipケーブルのオン/オフを防弾したいのです。両方の解決策は大丈夫ですが、私はどちらがより賢明で正しいのかわかりません。(私は間違ったコンテキスト関数の呼び出しを恐れています)
私は呼び出す。
tcpip_init(network_init, &net);
というように、その後に
xTaskCreate(hc_task, ( signed portCHAR * ) "send hc",1536u, NULL, TCPIP_THREAD_PRIO, NULL);
つまり、メインの lwIP
スレッドと hc_task
スレッドの 2 つのスレッドが存在することになります。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
lwipユーザーサポート(Pomeroyマーティ、シルヴァンRochet、リチャードと私をhellped他のおかげでいくつかの日後 - 議論へのリンク)フォーラム私は答えに来た。
タイマーの呼び出しで。
//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);
}
}