• 006_信号量


    信号量通常分为两种:二进制信号量和计数型信号量。

           二进制信号量只能取0和1两个值,

    计数型信号量的信号量值大于1,计数型信号量的范围由OS_SEM_CTR决定,OS_SEM_CTR可以为8位,16位和32位,取值范围分别为:0~255,0~65535和0~4294967295。

            二值信号量用于那些一次只能一个任务使用的资源,比如I/O设备,打印机,计数型信号量用于某些资源可以同时被几个任务所使用,比如一个缓存池有10个缓存块,那么同时最多可以支持10个任务来使用内存池

    信号量API函数:

    函数名

    作用

    OSSemCreate()

    建立一个信号量

    OSSemDel()

    删除一个信号量

    OSSemPend()

    等待一个信号量

    OSSemPendAbrot()

    取消等待

    OSSemPost()

    释放或者发出一个信号量

    OSSemSet()

    强制设置一个信号量的值

    (一)定义一个信号量

    OS_SEM    MY_SEM;        //定义一个信号量,用于访问共享资源

    (二)创建一个信号量

        //创建一个信号量
        OSSemCreate ((OS_SEM*    )&MY_SEM,    //信号量
                     (CPU_CHAR*    )"MY_SEM",    //名字
                     (OS_SEM_CTR)1,            //初始值,1:二进制,大于1计数
                     (OS_ERR*    )&err);        //错误码

    (三)请求信号量

    /*信号量  延时  选项*/
    OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);     //请求信号量

    (四)释放信号量

    OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);                //释放信号量

    (五)信号量使用对共享资源区的保护,红色部分代表数组为共享资源区,只有获得信号量时候才能进行数据的更改,否则一直在请求信号量

    OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);     //请求信号量
    memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
    delay_ms(300);
    printf("%s
    ",share_resource);    //串口输出共享资源区数据    
    OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);                //释放信号量

    互斥信号量,解决优先级翻转问题,共享资源区建议使用

    函数名

    作用

    OSMutexCreate()

    建立一个互斥信号量

    OSMutexDel()

    删除一个互斥信号量

    OSMutexPend()

    等待一个互斥信号量

    OSMutexPendAbrot()

    取消等待

    OSMutexPost()

    释放或者发布一个互斥信号量

    (一)定义一个互斥信号量

    OS_MUTEX    TEST_MUTEX;        //定义一个互斥信号量

    (二)创建一个互斥信号量

        //创建一个互斥信号量
        OSMutexCreate((OS_MUTEX*    )&TEST_MUTEX,
                      (CPU_CHAR*    )"TEST_MUTEX",
                      (OS_ERR*        )&err);

    (三)请求互斥信号量

    OSMutexPend (&TEST_MUTEX,0,OS_OPT_PEND_BLOCKING,0,&err);//请求互斥信号量

    (四)释放互斥信号量

    OSMutexPost(&TEST_MUTEX,OS_OPT_POST_NONE,&err);    //释放互斥信号量

     

  • 相关阅读:
    PreparedStatement/Statement处理insert update等操作时乱码,以及URL
    MySQL unique 注意
    web乱码解决了
    实用工具及Chrome插件及实用网站(持续更新中...)
    前端常用算法集合,持续更新...
    各种问题汇总解决方法,持续更新中...
    node实现自动化图片切割压缩, 部署页面
    移动端图片缩放插件Pinchzoom.js
    提示框简单封装
    模拟滚动条
  • 原文地址:https://www.cnblogs.com/luxiaoguogege/p/10159891.html
Copyright © 2020-2023  润新知