目录
信号量
简介:信号量像是一种上锁机制,代码必须获得相应的钥匙,才可继续执行代码
二进制信号量:信号量为二进制一次只能一个任务共享资源
计数型信号量:可多个任务共享资源,可有多个信号量
注:任务请求信号量时,信号量的值就会减1,发送一个信号,信号量加1
创建信号量
OSSemCreate()函数
作用:创建信号量函数
位置:os_sem.c
调用:
void OSSemCreate (OS_SEM *p_sem,//指向信号量控制块 CPU_CHAR *p_name,//指向信号量的名字 OS_SEM_CTR cnt, //设置信号量的初始值,值为1(二进制),大于1(计数型) OS_ERR *p_err //返回的错误码)
应用实例:
OSSemCreate ((OS_SEM* )&SYNC_SEM, (CPU_CHAR* )"SYNC_SEM", (OS_SEM_CTR)0, (OS_ERR* )&err);
请求信号量
OSSemPend ()函数
作用:请求信号量
位置:os_sem.c
调用:
OS_SEM_CTR OSSemPend (OS_SEM *p_sem,//指向信号量块 OS_TICK timeout,//设置等待时间(时钟节拍书),如果为0则一直等待 /*****/ /*如信号量无效*/ /* 阻塞:任务挂起等待信号量 OS_OPT_PEND_BLOCKING 非阻塞,任务直接返回 OS_OPT_PEND_NON_BLOCKING */ OS_OPT opt, //设置是否阻塞 CPU_TS *p_ts,//指定一个时间戳,如返回NULL则没有要求时间戳 OS_ERR *p_err//返回的错误码)
应用实例:
OSSemPend(&SYNC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);
发送信号量
OSSemPost()函数
作用:发送信号量
位置:os_sem.c
调用:
OS_SEM_CTR OSSemPost (OS_SEM *p_sem,//信号量块 /****/ /* OS_OPT_POST_1 仅向等待信号量的最高优先级发送信号 OS_OPT_POST_ALL 向等待该信号的所有任务发送信号 */ OS_OPT opt, //选择信号发送方式 OS_ERR *p_err//返回的错误码)
应用实例:
OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);
内嵌信号量
发送内嵌信号量
OSTaskSemPost()函数
作用:发送信号量
位置:os_task.c
调用:
OS_SEM_CTR OSTaskSemPost (OS_TCB *p_tcb, OS_OPT opt, OS_ERR *p_err)
应用实例:
OSTaskSemPost(&Task2_TaskTCB,OS_OPT_POST_NONE,&err);
请求内嵌信号量
OSTaskSemPend ()函数
作用:请求信号量
位置:os_task.c
调用:
OS_SEM_CTR OSTaskSemPend (OS_TICK timeout, OS_OPT opt, CPU_TS *p_ts, OS_ERR *p_err)
应用实例:
OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,0,&err);