• 信号量

  信号量结构体:struct sys_semt

    struct _sys_sem {
    void *sem;
    };

 err_t sys_sem_new(sys_sem_t *sem, u8_t count)                 新建信号量

err_t sys_sem_new(sys_sem_t *sem, u8_t count)                         //err_t为signed char类型,sys_sem_t为struct sys_semt类型
{
  HANDLE new_sem = NULL;

LWIP_ASSERT("sem != NULL", sem != NULL);

new_sem = CreateSemaphore(0, count, 100000, 0);            //创建一个信号量,创建出错返回0

LWIP_ASSERT("Error creating semaphore", new_sem != NULL);

if(new_sem != NULL)

{

if (SYS_INITIALIZED()) {

SYS_ARCH_LOCKED(SYS_STATS_INC_USED(sem));

} else {

SYS_STATS_INC_USED(sem);

}
#if LWIP_STATS && SYS_STATS

LWIP_ASSERT("sys_sem_new() counter overflow", lwip_stats.sys.sem.used != 0);

#endif /* LWIP_STATS && SYS_STATS*/

sem->sem = new_sem;

return ERR_OK;

}

/* failed to allocate memory... */

if (SYS_INITIALIZED()) {

SYS_ARCH_LOCKED(SYS_STATS_INC(sem.err));

} else {

   SYS_STATS_INC(sem.err);

}
sem->sem = NULL;
return ERR_MEM;

}

      

        void sys_sem_signal(sys_sem_t *sem)                                  发送信号量

        u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) 等待信号量

        void sys_sem_free(sys_sem_t *sem)                                        删除信号量

void sys_sem_free(sys_sem_t *sem)

{

/* parameter check */

LWIP_ASSERT("sem != NULL", sem != NULL);

LWIP_ASSERT("sem->sem != NULL", sem->sem != NULL);

LWIP_ASSERT("sem->sem != INVALID_HANDLE_VALUE", sem->sem != INVALID_HANDLE_VALUE);

CloseHandle(sem->sem);

SYS_ARCH_LOCKED(SYS_STATS_DEC(sem.used));

#if LWIP_STATS && SYS_STATS

LWIP_ASSERT("sys_sem_free() closed more than created", lwip_stats.sys.sem.used != (u16_t)-1);

#endif /* LWIP_STATS && SYS_STATS */

sem->sem = NULL;

}

        int sys_sem_valid(sys_sem_t *sem)                                        查询是否可用

        void sys_sem_set_invalid(sys_sem_t *sem)                            设置为失效

   

    void sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)//设置一个超时事件

    void sys_untimeout(sys_timeout_handler h, void *arg)//删除一个超时事件

  • 互斥锁

  

  err_t sys_mutex_new(sys_mutex_t *mutex)                  新建锁

        void sys_mutex_lock(sys_mutex_t *mutex)                  获取锁

        void sys_mutex_unlock(sys_mutex_t *mutex)             释放锁

        void sys_mutex_free(sys_mutex_t *mutex)                   删除锁

        int sys_mutex_valid(sys_mutex_t *mutex)                    查询锁是否可用

        void sys_mutex_set_invalid(sys_mutex_t *mutex)        设置锁为失效

  • 创建线程

  sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio) 

lwIP(Light Weight IP)协议的更多相关文章

  1. lwip Light Weight (轻型)IP协议

    wip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈. 外文名 lwip 开发者 瑞典计算机科学院 说    明 Light Weight (轻型)I ...

  2. TCP/IP 协议难点之一—— IP分片

    1 IP协议简单介绍 就个人而言,网络中,抛开网络安全加密这些,就只单单讨论协议本身,比较难的有三个地方: IP分片与重组 TCP滑动窗口与TCP状态的改变 TCP定时器 其实协议本身根据<TC ...

  3. TCP/IP协议学习(四) 协议概述

    生活中有舒适区,借口成为懒惰的护身符,学习也有舒适区,逃避便是阻止进步的最大障碍. 经过半年多嵌入式方面的工作和学习,我提高了很多,但同时我也对自己所面临的问题逐渐清晰: 1. 偏于实践,理论基础不牢 ...

  4. 2、LwIP协议栈规范翻译——协议层

    2.协议层 TCP/IP套件中的协议是以层次的方式设计的,其中每个协议层解决了通信问题的单独部分.这种分层可以用作设计协议实现的指南,因为每个协议可以与另一个分开实现.然而,以严格分层的方式实现协议可 ...

  5. Virtual servers on a Raspberry Pi with the light weight OS virtualization system Docker!

    转自:http://www.hyggeit.dk/2014/02/virtual-servers-on-raspberry-pi-with.html Virtual servers on a Rasp ...

  6. TCP/IP协议 (图解+秒懂+史上最全)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  7. 门面模式的典型应用 Socket 和 Http(post,get)、TCP/IP 协议的关系总结

    门面模式的一个典型应用:Socket 套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息: 连接使用的 ...

  8. OSI七层模型详解 TCP/IP协议

      总结 OSI中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 表示层 数据格式化,代码转 ...

  9. TCP/IP协议(二)tcp/ip基础知识

    今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...

随机推荐

  1. PAT甲级 1093 Count PAT‘s (25 分) 状态机解法

    题目 原题链接 The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the ...

  2. csp-s模拟测试41「夜莺与玫瑰·玫瑰花精·影子」

    夜莺与玫瑰 题解 联赛$T1$莫比乌斯$\%\%\%$ $dead$  $line$是直线 首先横竖就是$n+m$这比较显然 枚举方向向量 首先我们枚举方向向量时只枚举右下方向,显然贡献$*2$就是所 ...

  3. external-provisioner源码分析(3)-组件启动参数分析

    更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 external-provisioner源码分析(3)-组件启动参数分析 本文将对extern ...

  4. CentOS7详细安装教程(图文)

    CentOS7安装过程:(图文详解) 为了做实验,装台Linux的虚拟机,手上有这个7的ISO文件就懒得去下载8的了. 0X01.虚拟机配置 0X02.CentOS7系统配置安装 分别创建/boot区 ...

  5. 温故知新,.Net Core遇见Blazor(FluentUI),属于未来的SPA框架

    什么是Blazor Blazor是一个使用.NET生成交互式客户端WebUI的框架: 使用C#代替JavaScript来创建信息丰富的交互式UI. 共享使用.NET编写的服务器端和客户端应用逻辑. 将 ...

  6. Java并发之ReentrantReadWriteLock源码解析(二)

    先前,笔者和大家一起了解了ReentrantReadWriteLock的写锁实现,其实写锁本身实现的逻辑很少,基本上还是复用AQS内部的等待队列思想.下面,我们来看看ReentrantReadWrit ...

  7. AcWing 1275. 最大数

    #include<bits/stdc++.h> #define N 1000100 using namespace std; struct node { int l,r; int data ...

  8. 『动善时』JMeter基础 — 54、JMeter聚合报告详解

    目录 1.聚合报告介绍 2.聚合报告界面详解 3.聚合报告中信息点说明 (1)百分位数的说明 (2)吞吐量说明 提示:聚合报告组件的使用和察看结果树组件的使用方式相同.本篇文章主要是详细的介绍一下聚合 ...

  9. 『无为则无心』Python函数 — 27、Python函数的返回值

    目录 1.返回值概念 2.return关键字的作用 3.返回值可以返回的数据类型 4.函数如何返回多个值 5.fn5 和 fn5()的区别 6.总结: 1.返回值概念 例如:我们去超市购物,比如买饮料 ...

  10. bugku flag在index里面

    先点进去看看. 看到file,似乎在暗示着我们,php://filter/read/convert.base64-encode/resource=index.php, 这句将index.php内容用b ...