3、怎么用信号量:
μC/OS-II提供了以下6个操作信号量的函数供用户使用,但是在使用这些函数之前,要在OS_CFG.H中配置使能,告诉
μC/OS-II--我要用这几个函数了!
#define OS_SEM_EN 1
#define OS_SEM_ACCEPT_EN 1
#define OS_SEM_DEL_EN 1
#define OS_SEM_PEND_ABORT_EN 1
#define OS_SEM_QUERY_EN 1
#define OS_SEM_SET_EN 1
(1)建立一个信号量:OSSemCreate()
程序原型是OS_EVENT *OSSemCreate(INT16U cnt) 由此可知,调用OSSemCreate()来建立信号量。必须给信号量赋予初始值,0~65535 。分三种情况:
A: 若信号量用来表示一个或多个事件发生,那么初始化为0;
B: 若信号量用来对共享资源的访问,那么初始化为1;
C: 若信号量用来表示允许访问N个相同的资源,比如说用信号量管理缓冲区阵列,然后该阵列包含N个缓冲区,那么这时候应该初始化为N;并且该信号量是可计数的。
(2)删除一个信号量:OSSemDel()
使用时候注意:
A: 因为可能是多个任务要使用一个信号量,那么在删除该信号量时候应该首先删除该信号量的所有任务!
B: 只能在任务中删掉信号量,而不能在中断服务函数中删掉;
程序原型是
OS_EVENT *OSSemDel (OS_EVENT *pevent, //信号量的指针
INT8U opt, //删除条件选项
INT8U *perr) //错误信息
①*pevent: 指明你要干掉哪一个信号量!
②opt : 这里有两个选择
A: OS_DEL_NO_PEND 只有当没有任务在等待该信号量的时候,你就删吧。。
B: OS_DEL_ALWAYS 对不起,我不管了,无论有木有任务在等你(信号量),我都必须马上带你走!
③*perr : 这里是作为删除失败后的错误信息提示返回的。有以下六种可能,任哲中的书就说了删除成功就会返回OS_ERR_NONE 。
A: OS_ERR_NONE 成功干掉信号量
B: OS_ERR_DEL_ISR 你现在是从中断服务函数中对信号量下手,这是非法的,出去后再动手吧。。
C: OS_ERR_INVALID_OPT 你选择了一个非法的Opt,我在前面说了,只有两个选择A或B!!你丫不听!
D: OS_ERR_TASK_WAITING 你选了OS_DEL_NO_PEND 作为opt,但是不幸的是,还有任务在等着她。。所以你必须再等等、、、
E: OS_ERR_EVENT_TYPE 你不是通过指针来指向一个信号量的,所以不对。。
F: OS_ERR_PEVENT_NULL 你所提供的pevent 居然是个空指针,果断不行啊!!!
(3)等待一个信号量 OSSemPend
void OSSemPend (OS_EVENT *pevent, //信号量的指针
INT32U timeout, //等待的时间限制。我顶多等你那么久,过时不候,直接进入就绪状态
INT8U *perr) //错误信息
(4)发送一个信号量
INT8U OSSemPost (OS_EVENT *pevent) //信号量的指针
(5)无等待地请求一个信号量
INT16U OSSemAccept (OS_EVENT *pevent) //信号量的指针
(6)查询一个信号量的当前状态
INT8U OSSemQuery (OS_EVENT *pevent, //信号量的指针
OS_SEM_DATA *p_sem_data)//一个指向保存有关信号量信息的结构体的指针
文章评论(0条评论)
登录后参与讨论