RT-Thread论坛
直播中

jjll652

8年用户 1411经验值
私信 关注

LWIP多线程强烈建议开启LWIP_ASSERT_CORE_LOCKED宏,这个在RTT里面要怎么实现?

LWIP多线程强烈建议开启LWIP_ASSERT_CORE_LOCKED宏,这个在RTT里面要怎么实现,之前参考网上代码,这样写,压力测试下有概率断言失败


extern sys_mutex_t lock_tcpip_core;
void lwip_assert_core_locked(void)
{
    /* If the mutex hasn't been initialized yet, then give it a pass. */
    if (NULL == lock_tcpip_core)
        return;
    /* this function must not be used in interrupt */
    RT_DEBUG_IN_THREAD_CONTEXT;
    struct rt_thread *thread = rt_thread_self();
    /* Ensure that the mutex is currently taken (locked). */
    LWIP_ASSERT("TCPIP core is locked", (lock_tcpip_core->owner == thread) && (lock_tcpip_core->hold>0));
}

回帖(1)

远风

2024-7-25 17:15:42
在RT-Thread中实现LWIP多线程并开启LWIP_ASSERT_CORE_LOCKED宏的方法如下:

1. 首先,确保你的RT-Thread版本支持多线程。这通常意味着你需要使用RT-Thread的完整版本,而不是精简版本。

2. 在你的LWIP配置文件(通常是lwipopts.h)中,定义LWIP_ASSERT_CORE_LOCKED宏。这可以通过添加以下行来实现:

```c
#define LWIP_ASSERT_CORE_LOCKED()
```

3. 接下来,需要创建一个互斥锁(mutex)来保护TCP/IP核心。在你的应用程序中,添加以下代码:

```c
#include
#include

static sys_mutex_t lock_tcpip_core;
```

4. 在TCP/IP核心初始化之前,初始化互斥锁。你可以在调用`tcpip_init()`之前添加以下代码:

```c
rt_err_t result = rt_mutex_init(&lock_tcpip_core, "tcpip_core", RT_IPC_FLAG_FIFO);
if (result != RT_EOK) {
    // 处理错误
}
```

5. 修改`lwip_assert_core_locked()`函数,以检查当前线程是否持有互斥锁。以下是修改后的函数:

```c
void lwip_assert_core_locked(void)
{
    /* If the mutex hasn't been initialized yet, then give it a pass. */
    if (NULL == lock_tcpip_core)
        return;

    /* this function must not be used in interrupt */
    RT_DEBUG_IN_THREAD_CONTEXT;

    /* Check if the current thread holds the mutex */
    if (rt_mutex_get_holder(&lock_tcpip_core) != rt_thread_self())
    {
        rt_kprintf("LWIP core lock assertion failed!n");
        // 你可以根据需要添加更多的错误处理代码
    }
}
```

6. 最后,确保在所有需要保护的LWIP函数调用之前和之后使用互斥锁。例如:

```c
/* Lock the TCP/IP core */
rt_mutex_take(&lock_tcpip_core, RT_WAITING_FOREVER);

/* Call the LWIP function */
your_lwip_function();

/* Unlock the TCP/IP core */
rt_mutex_release(&lock_tcpip_core);
```

通过以上步骤,你可以在RT-Thread中实现LWIP多线程并开启LWIP_ASSERT_CORE_LOCKED宏。这将有助于确保在多线程环境中正确地保护TCP/IP核心。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分