//----------------------------------------------------------------------
//1.OSQPend()
函数
void
*
OSQPend
(
OS_EVENT
*
pevent
,
INT16U timeout
,
INT8U
*
perr
)
{
void
*
pmsg
;
OS_Q
*
pq
;
INT8U pend_stat
;
#
if
OS_CRITICAL_METHOD
==
3
OS_CPU_SR cpu_sr
=
0
;
#
endif
#
if
OS_ARG_CHK_EN
>
0
if
(
perr
==
(
INT8U
*)
0
)
{
return
((
void
*)
0
);
}
if
(
pevent
==
(
OS_EVENT
*)
0
)
{
*
perr
=
OS_ERR_PEVENT_NULL
;
return
((
void
*)
0
);
}
if
(
pevent
->
OSEventType
!=
OS_EVENT_TYPE_Q
)
{
//
确保该event控制块是Q类型
*
perr
=
OS_ERR_EVENT_TYPE
;
return
((
void
*)
0
);
}
#
endif
if
(
OSIntNesting
>
0
)
{
//ISR
中,不能使用OSQPend()
*
perr
=
OS_ERR_PEND_ISR
;
return
((
void
*)
0
);
}
if
(
OSLockNesting
>
0
)
{
//μCOS/II v2.85
内核已经被强制锁住
*
perr
=
OS_ERR_PEND_LOCKED
;
return
((
void
*)
0
);
}
//
非法的统统不是,信号正常,所以有必要进一步处理
OS_ENTER_CRITICAL
();
pq
=
(
OS_Q
*)
pevent
->
OSEventPtr
;
if
(
pq
->
OSQEntries
>
0
)
{
//
程序的其他地方已经触发了事件
//
所以该task无需悬停,直接获得事件的使用权
pmsg
=
*
pq
->
OSQOut
++;
//
消息采用先进先出方式
pq
->
OSQEntries
--;
//
个数-1
if
(
pq
->
OSQOut
==
pq
->
OSQEnd
)
{
//
在OSQCreate(void **start, INT16U size)中,做了如下初始化:
//pq->OSQStart = start;
//pq->OSQEnd = &start[size];
//pq->OSQIn = start;
//pq->OSQOut = start;
//pq->OSQSize = size;
//pq->OSQEntries = 0;
pq
->
OSQOut
=
pq
->
OSQStart
;
}
OS_EXIT_CRITICAL
();
*
perr
=
OS_ERR_NONE
;
return
(