浅析μCOS/II v2.85内核OSQPend()和OSQPost()函数工作原理
(2014-07-06 01:58:04)
标签:
it |
分类: uCOS、NuttX、ROS、SYS/BIOS |
浅析μCOS/II
v2.85内核OSQPend()和OSQPost()函数工作原理
文章来源:http://gliethttp.cublog.cn[转载请声明出处]
//----------------------------------------------------------------------
//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