lwIP 代码解析:sys_arch.c

发布于:2025-08-09 ⋅ 阅读:(14) ⋅ 点赞:(0)

1、sys_assert:断言检查

        用于调试阶段的断言检查,当条件不满足时打印消息并进入死循环,在非调试模式下可被优化掉。


/*
 * Prints an assertion messages and aborts execution.
 */
void sys_assert(const char *pcMessage)
{
// FSL:only needed for debugging
#ifdef LWIP_DEBUG
    LWIP_PLATFORM_DIAG((pcMessage));
#endif
#if !NO_SYS
    (void)sys_arch_protect();
#endif
    for (;;)
    {
    }
}

2、lwip_rand:随机数生成器

        基于线性同余算法的伪随机数生成器,使用固定种子(12345u),保证了结果的可重现性,适合测试场景。

static u32_t _rand_value;
u32_t lwip_rand(void)
{
    _rand_value = _rand_value * 1103515245u + 12345u;
    return ((u32_t)(_rand_value >> 16u) % (32767u + 1u));
}

3、邮箱(Mailbox)实现(核心机制)

        邮箱是 lwIP 中用于线程间消息传递的核心机制,代码中通过 FreeRTOS 的队列(Queue)实现:

函数 功能描述
sys_mbox_new 创建新邮箱,内部调用 xQueueCreate
sys_mbox_free 释放邮箱资源,删除前会检查是否还有未处理消息
sys_mbox_post 向邮箱发送消息,阻塞直到成功
sys_mbox_trypost 尝试发送消息,立即返回成功或失败
sys_mbox_trypost_fromisr 中断上下文专用的消息发送函数
sys_arch_mbox_fetch 从邮箱获取消息,支持超时机制
sys_arch_mbox_tryfetch 尝试获取消息,无消息时立即返回

4、信号量(Semaphore)与互斥锁(Mutex)

  • 信号量函数

    • sys_sem_new:创建信号量,支持二进制信号量(计数 0 或 1)和计数信号量
    • sys_arch_sem_wait:等待信号量,支持超时
    • sys_sem_signal:释放信号量
    • sys_sem_free:释放信号量资源
  • 互斥锁函数

    • sys_mutex_new:创建互斥锁
    • sys_mutex_lock:获取互斥锁
    • sys_mutex_unlock:释放互斥锁
    • sys_mutex_free:释放互斥锁资源

5、sys_thread_new:创建线程

sys_thread_t sys_thread_new(
    const char *pcName, void (*pxThread)(void *pvParameters), void *pvArg, int iStackSize, int iPriority)
{
    TaskHandle_t xCreatedTask;
    portBASE_TYPE xResult;
    sys_thread_t xReturn;

    LWIP_ASSERT("invalid stacksize", iStackSize > 0);

    xResult = xTaskCreate(pxThread, pcName, (configSTACK_DEPTH_TYPE)iStackSize, pvArg, iPriority, &xCreatedTask);
    LWIP_ASSERT("task creation failed", xResult == pdPASS);

    if (xResult == pdPASS)
    {
        xReturn = xCreatedTask;
    }
    else
    {
        xReturn = NULL;
    }

    return xReturn;
}

6 、sys_arch_protect/sys_arch_unprotect:临界区保护

        临界区保护。

sys_prot_t sys_arch_protect(void)
{
    sys_prot_t result = 0;

#ifdef __CA7_REV
    if (SystemGetIRQNestingLevel())
#else
    if (__get_IPSR())
#endif
    {
        result = portSET_INTERRUPT_MASK_FROM_ISR();
    }
    else
    {
        portENTER_CRITICAL();
    }
    return result;
}

void sys_arch_unprotect(sys_prot_t xValue)
{
#ifdef __CA7_REV
    if (SystemGetIRQNestingLevel())
#else
    if (__get_IPSR())
#endif
    {
        portCLEAR_INTERRUPT_MASK_FROM_ISR(xValue);
    }
    else
    {
        portEXIT_CRITICAL();
    }
}

7、sys_now:时间管理

        在操作系统环境下,该函数通过 xTaskGetTickCount 获取系统滴答计数;在裸机环境下,则通过 SysTick 中断维护一个全局时间变量 time_now,提供毫秒级的时间戳。

u32_t sys_now(void)
{
    return (u32_t)time_now;
}

8、TCP/IP 核心锁定机制

        通过互斥锁实现对 TCP/IP 核心操作的保护,同时 sys_check_core_locking 函数用于断言检查当前上下文是否有权限执行特定操作,防止线程安全问题。

void sys_lock_tcpip_core(void)
{
    sys_mutex_lock(&lock_tcpip_core);
    if (lwip_core_lock_count == 0U)
    {
        lwip_core_lock_holder_thread = xTaskGetCurrentTaskHandle();
    }
    lwip_core_lock_count++;
}

void sys_unlock_tcpip_core(void)
{
    lwip_core_lock_count--;
    if (lwip_core_lock_count == 0)
    {
        lwip_core_lock_holder_thread = 0;
    }
    sys_mutex_unlock(&lock_tcpip_core);
}


网站公告

今日签到

点亮在社区的每一天
去签到