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\r\n",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); //释放互斥信号量