lwIP TCP/IP 协议栈笔记之四: 操作系统配置文件 sys_arch.c & sys_arch.h 详解

本文档详细介绍了lwIP协议栈中操作系统抽象层的实现,包括信号量、互斥锁、邮箱及关键代码段的概念和用法,并强调了在实现sys_arch时需要注意的内存管理和并发控制问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 操作系统抽象层说明

1.1 Semaphores(信号量)

1.2 Mutexes(互斥锁)

1.3 Mailboxes(邮箱)

1.4 Misc(杂项)

2. Time(时间)

3. Critical sections(关键代码段/临界区)


1. 操作系统抽象层说明

无需在NO_SYS模式下实现本节中的功能。 特定于操作系统的代码应该在 arch/ sys_arch.h和sys_arch.c中实现。

操作系统仿真层在lwIP代码和底层操作系统内核之间提供通用接口。 一般的想法是将lwIP移植到新架构只需要对少量头文件和新的sys_arch实现进行小的更改。 也可以执行不依赖于任何底层操作系统的sys_arch实现。

sys_arch为lwIP提供信号量,邮箱和互斥锁。 对于完整的lwIP功能,可以在sys_arch中实现多线程支持,但基本的lwIP功能不需要这样做。

除了提供sys_arch功能的源文件之外,OS仿真层还必须提供几个头文件,用于定义整个lwip中使用的宏。 所需的文件和它们必须定义的宏列在sys_arch描述下面。

从lwIP 1.4.0开始,信号量,互斥量和邮箱功能的原型都允许使用指针或实际的OS结构。 这样,这些类型所需的内存可以就地分配(全局或堆栈)或堆(在“* _new()”函数内部分配)。

注意:

在sys_arch中使用mem_malloc()时要小心。 当malloc()引用mem_malloc()时,您可能遇到循环函数调用问题。在mem.c中,mem_init()尝试使用mem_malloc分配信号量,当sys_arch使用mem_malloc时,当然无法执行该信号量。

相关声明见 sys.h

1.1 Semaphores(信号量)

信号量可以是计数或二进制 - lwIP可用于两种类型。 信号量由“sys_sem_t”类型表示,该类型在sys_arch.h文件中是typedef。邮箱等效地由“sys_mbox_t”类型表示。 互斥体由“sys_mutex_t”类型表示。 lwIP对内部表示这些类型的方式没有任何限制。

/* 
    创建一个新的信号量。 
    信号量被分配给'sem'指向的内存(可以是指针或实际的OS结构)。
    “count”参数指定信号量的初始状态(为0或1)。
    如果已创建信号量,则应返回ERR_OK。 返回任何其他错误将提示出现了什么问题,但除了断言之外,没有实现真正的错误处理。

    参数
        sem指向要创建的信号量的指针
        计算信号量的初始计数

    返回
        如果成功则为ERR_OK,否则为另一个错误
 */
err_t 	sys_sem_new (sys_sem_t *sem, u8_t count)

/*
    发送信号量

    参数
        sem 信号量发出信号
*/ 
void 	sys_sem_signal (sys_sem_t *sem)

/*
    在等待信号量发出信号的同时阻塞线程。 
    如果“timeout”参数不为零,则只应在指定时间内阻塞线程(以毫秒为单位)。 
    如果“timeout”参数为零,则应阻塞线程,直到发出信号量信号。

    如果信号量未在指定时间内发出信号,则返回值为SYS_ARCH_TIMEOUT;
    如果已发出信号(有或没有等待),则返回值为任何其他值。 
    请注意,lwIP实现了一个名为sys_sem_wait()()的函数,该函数使用sys_arch_sem_wait()函数。

    参数
        sem信号量等待
        超时超时(以毫秒为单位)等待(0 =永远等待)

lwip是瑞士计算机科学院的一个开源的TCP/IP协议栈实现.   lwIPTCP/IP协议栈的一个实现。lwIP协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样就可以让lwIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。   LwIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,一般它只需要几百字节的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。   其主要特性如下:   ①支持多网络接口下的IP转发;   ②支持ICMP协议;   ③包括实验性扩展的UDP(用户数据报协议);   ④包括阻塞控制、RTT 估算、快速恢复和快速转发的TCP(传输控制协议);   ⑤提供专门的内部回调接口(Raw API),用于提高应用程序性能;   ⑥可选择的Berkeley接口API (在多线程情况下使用) 。   (1) 信号量   LwIP中需要使用信号量进行通信,所以在sys_arch中应实现相应的信号量结构体 struct sys_semt和处理函数sys_sem_new() 、sys_sem_free() 、sys_sem_signal ( ) 和sys_arch_sem_wait ( ) 。由于μC/OS已经实现了信号量OSEVENT的各种操作,并且功能和LwIP上面几个函数的目的功能是完全一样的,所以只要把μC/OS的函数重新包装成上面的函数,就可直接使用。   (2) 消息队列   LwIP 使用消息队列来缓冲、传递数据报文,因此要实现消息队列结构sys_mbox_t ,以及相应的操作函数:sys_mbox_new() 、sys_mbox_free () 、sys_mbox _post () 和sys_arch_mbox_fetch() 。μC/OS实现了消息队列结构及其操作,但是μC/OS没有对消息队列中的消息进行管理,因此不能直接使用,必须在μC/OS的基础上重新实现。具体实现时,对队列本身的管理利用μC/OS自己的OSQ操作完成,然后使用μC/OS中的内存管理模块实现对消息的创建、使用、删除和回收,两部分综合起来形成了LwIP的消息队列功能。   (3) 定时器函数   LwIP中每个和TCP/IP相关的任务的一系列定时事件组成一个单向链表,每个链表的起始指针存在lwip_timeouts 的对应表项中,如图2所示。移植时需要实现struct sys_timeouts * sys_arch_timeouts (void) 函数,该函数返回目前正处于运行态的线程所对应的timeout 队列指针。   (4) 创建新线程函数   在μC/OS 中,没有线程(thread) 的概念,只有任务(Task) 。它提供了创建新任务的系统API调用OSTaskCreate,因此只要把OSTaskCreate封装一下,就可以实现 sys_thread_new。需要注意的是LwIP中的thread并没有μC/OS 中优先级的概念,实现时要由用户事先为LwIP中创建的线程分配好优先级。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值