浅析μCOS/II v2.85内核OSQPend()和OSQPost()函数工作原理

 

//----------------------------------------------------------------------
//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 (

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值