7

LwIPまたは関数が呼び出されると、RTOSを使用している場合、スレッドをブロックし、タイムアウトになるまで、または永久に接続を待機します。これは、の設定によって異なります 。タイムアウト期間はに等しくなります。netconn_accept()netconn_recv()LWIP_SO_RCVTIME0SYS_ARCH_TIMEOUT

コアではLwIPスタックの一部を含む0xffffffffSYS_ARCH_TIMEOUTとして定義されているため、変更されることはないと思います。

実際、接続が確立されているかどうかを確認したいのですが、そうでない場合はスレッドを続行します。ただし、を呼び出すと、スレッドがブロックされ、そこで永久に(または非常に長い時間)待機します...さまざまな状況でさまざまなタイムアウトが必要になるためnetconn_accept()、の定義値を変更したくありません...SYS_ARCH_TIMEOUT

それを行うための良い方法は何ですか?ありがとう。

4

4 に答える 4

8

TCP接続(または受け入れ)のポーリングは、通常、悪い習慣です。ブロッキングnetconn_accept()呼び出し専用の新しいスレッドを生成することを検討してください。

RTOSを使用する場合の制限は理解していますが、最小限のスタックスペースでヘルパースレッドを1つだけ生成することは、大きな問題にはなりません。

古典的な生産者/消費者問題の解決策を実装することはそれほど難しいことではないと私は信じています。

FreeRTOSについて話している場合、必要なすべてのツール(セマフォとスレッド)が含まれています。

于 2012-06-01T10:52:45.250 に答える
5

ブロッキングAPIはまったく使用しないでください。lwIPスタックは、ネイティブの非ブロッキングイベント駆動型APIを提供します。これは、ブロッキングよりも効率的であり、ブロッキングRTOSを必要としません。YouTubeビデオショー(http://youtu.be/MBk5wJ_8jEc)は、このAPIがQPステートマシンフレームワークに基づくリアルタイムシステムでどのように使用されているかを示しています。

于 2012-06-04T01:57:21.693 に答える
3

その接続を確立しようとしている新しいスレッドを作成します。接続されていない限り、スレッドをしばらくスリープ状態にして、RTOSがコンテキストスイッチを作成できるようにします。(別のタスクに切り替えます)

于 2012-06-01T11:25:13.403 に答える
2

この関数を使用しnetconn_set_recvtimeoutて、リッスンソケットのタイムアウトを1msなどの小さな値に設定できます。

例えば。(エラー処理は新規、バインド、単純化のためにリッスンを省略しました)

struct netconn *conn = netconn_new(NETCONN_TCP);
if (conn)
{
    if (netconn_bind(conn, IP_ADDR_ANY, 1025/*PORT_NUMBER*/) != ERR_OK)
    {
        return;
    }
    if (netconn_listen(conn) != ERR_OK)
    {
        return;
    }
    netconn_set_recvtimeout(conn, 1);
}

次に、acceptを呼び出すと、最大1ミリ秒遅延します。

struct netconn *newConn;
err_t result = netconn_accept(conn, &newConn);
if (result == ERR_OK)
{
    // Handle the connected netconn here
}
else if (result == ERR_TIMEOUT)
{
    // No pending connections
}
else
{
    // A problem with the listen socket accepting the connection
}
于 2015-09-04T13:55:23.833 に答える