当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/314868.html

相关文章:

  • 从 0 到 1 构建高质量微调数据集:大模型落地的基石
  • 单向链表练习
  • Linux Shell:常用命令汇总
  • 邻近标记技术:研究蛋白互作的利器(一)
  • 论文Review LIO Multi-session Voxel-SLAM | 港大MARS出品!体素+平面特征的激光SLAM!经典必读!
  • 简要探讨大型语言模型(LLMs)的发展历史
  • 每天学一个Linux命令(38):vi/vim
  • 决策树(回归树)全解析:原理、实践与应用
  • Excel商业智能分析报表 【销售管理分析仪】
  • 编译 Paddle 遇到 flashattnv3 段错误问题解决
  • PostgreSQL——表的基本操作
  • 前端接入通义千问(各大模型接入方法类似)
  • 【Spring Boot 快速入门】六、配置文件
  • 15个命令上手Linux!
  • 回归分析:从数据类型到预测模型的核心逻辑
  • 8.4 打卡 DAY 33: 第一个神经网络 - MLP的构建与训练
  • 《时间之隙:内存溢出》
  • [自动化Adapt] 数据脱敏 | 文本替换/图像模糊 | 引擎热插拔 | 多队列并行处理
  • 网络资源模板--基于Android Studio 实现的消消乐游戏
  • ffmpeg下载windows教程
  • 高密度客流识别精度↑32%!陌讯多模态融合算法在智慧交通的实战解析
  • 模拟IC设计提高系列8-运算跨导放大器OTA Operational Transconduct Amplifiers
  • Cursor国产平替重磅开源!离线研发AI助手,拒绝云端受制于人
  • 【数据结构初阶】--顺序表(一)
  • BD202402跑步 线性求逆元 素数筛 数学
  • 数分思维13:AB测试
  • 开源网页生态掘金:从Bootstrap二次开发到行业专属组件库的技术变现
  • 复杂场景识别率↑31%!陌讯多模态融合算法在智慧环卫的实战解析
  • 上一篇文章的补充理解
  • 深度学习零基础入门(4)-卷积神经网络架构