原创 μC/OS-II学习笔记4--信号量 (二)

2014-6-30 01:06 1451 16 16 分类: MCU/ 嵌入式 文集: OS

 

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,我在前面说了,只有两个选择AB!!你丫不听!

                            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条评论)

登录后参与讨论
我要评论
0
16
关闭 站长推荐上一条 /2 下一条