lwIP 代码解析:sys_arch.c
1、sys_assert:断言检查
用于调试阶段的断言检查,当条件不满足时打印消息并进入死循环,在非调试模式下可被优化掉。
/** Prints an assertion messages and aborts execution.*/
void sys_assert(const char *pcMessage)
{
// FSL:only needed for debugging
#ifdef LWIP_DEBUGLWIP_PLATFORM_DIAG((pcMessage));
#endif
#if !NO_SYS(void)sys_arch_protect();
#endiffor (;;){}
}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_REVif (SystemGetIRQNestingLevel())
#elseif (__get_IPSR())
#endif{result = portSET_INTERRUPT_MASK_FROM_ISR();}else{portENTER_CRITICAL();}return result;
}void sys_arch_unprotect(sys_prot_t xValue)
{
#ifdef __CA7_REVif (SystemGetIRQNestingLevel())
#elseif (__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);
}