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);
}