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);    //释放互斥信号量

 

原文地址:https://www.cnblogs.com/luxiaoguogege/p/10159891.html