通过相同的连接在LwIP中发送和接收UDP数据包?

时间:2017-08-30 05:11:12

标签: network-programming stm32 freertos lwip

我正在开发一个应该能够异步传输和接收具有相同端口号的UDP消息的应用程序,并且对于执行此操作的最佳方式有点困惑。我在STM32平台上使用LwIP和FreeRTOS,我想使用netconn api。

我的申请应该:

  • 在某个ISR触发后发送消息。我有它设置所以ISR释放一个信号量,我的UDP任务消耗。
  • 始终接收消息

如果我在Linux上开发这个,我认为有一个线程可以发送,一个可以接收,或者可以使用select OS调用。据我所知,这些都不适用于LwIP。

我唯一想到的选择是在我的UDP任务中做这样的事情。

void my_task(void)
{
    // setup netconn connection here
    netconn_set_recvtimeout(conn, 1);

    while (1) 
    {
        // Only wait 1ms to take the semaphore
        if(xSemaphoreTake(isr_semaphore, 1) == pdTRUE)
        {
            netconn_send(conn, nbuf);
        }

        // Only block for 1ms to receive a UDP message
        if(netconn_recv(conn, mybuf) == ERR_OK)
        {
            //process incoming data
        }
    }
}

然而,这对我来说似乎不太合适,因为我每次通话都会浪费1ms。有没有更好的方法来实现同样的目标?我觉得这一定是一个非常普遍的要求,但我没有看到任何这方面的例子。

2 个答案:

答案 0 :(得分:0)

由于LWIP文档提到netconn API是顺序的,因此阻止API 如果你想让它异步,你应该使用基于回调的原始API。

答案 1 :(得分:0)

由于您使用的是FreeRTOS,因此请创建两个单独的任务进行发送和接收。将发送任务的优先级设置为高于侦听器的优先级。 换句话说,创建一个客户端和一个服务器任务。