• 信号量

  信号量结构体: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. 白日梦的MySQL专题(第38篇文章)8分钟回顾MySQL的索引

    目录 公众号首发-推荐阅读原文-格式更好看 一.导读 二.聚簇索引 三.二级索引 四.联合索引 4.1.什么是联合索引 4.2.左前缀原则 4.3.联合索引的分组&排序 五.覆盖索引 六.倒排 ...

  2. CosId 1.0.0 发布,通用、灵活、高性能的分布式 ID 生成器

    CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...

  3. 看CarbonData如何用四招助力Apache Spark

    摘要:CarbonData 在 Apache Spark 和存储系统之间起到中介服务的作用,为 Spark 提供的4个重要功能. 本文分享自华为云社区<Make Apache Spark bet ...

  4. excel VBA中正则模块vbscript.regexp的用法

    一.是一个对象,用于执行 正则表达式! 二.有三个属性:      1. Global属性: True or False, 指明模式是匹配整个字符串中所有与之相符的地方还是只匹配第一次出现的地方.默认 ...

  5. hive学习笔记之七:内置函数

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. JS replace 替换全部数据

    (1)使用具有全局标志g的正则表达式 var str = "dogdogdog"; var str2 = str.replace(/dog/g,"cat");/ ...

  7. hdu 6030 矩阵快速幂

    大致题意: 一条长度为n的项链,由红色珠子和蓝色珠子(分别用1和0表示)组成,在连续的素数子段中,红色珠子的个数不能少于蓝色珠子.问组成这个项链有多少种方案,求方案数模1000000007 分析: 首 ...

  8. SpringBoot Cache 深入

    这上一篇文章中我们熟悉了SpringBoot Cache的基本使用,接下来我们看下它的执行流程 CacheAutoConfiguration 自动装配类 根据图中标注,看到它引用了CachingCon ...

  9. acwing 4 多重背包问题 I

    多重背包 有 n种物品 一共有 m大小的背包,每种物品的价值 大小 个数 为 s[i],v[i],num[i]; #include<bits/stdc++.h>//cmhao #defin ...

  10. 线程中的yield()

    属于本地方法 /** * A hint to the scheduler that the current thread is willing to yield * its current use o ...