目录
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信号量等待
超时超时(以毫秒为单位)等待&#x