os_q.c

来源:互联网 发布:决战武地煞进阶数据 编辑:程序博客网 时间:2024/05/18 02:24
生产者、消费者模式是个好东西,可以多多利用。

typedef  struct  os_q                OS_Q;

struct  os_q {                                              /* Message Queue                                          */
                                                            /* ------------------ GENERIC  MEMBERS ------------------ */
    OS_OBJ_TYPE          Type;                              /* Should be set to OS_OBJ_TYPE_Q                         */
    CPU_CHAR            *NamePtr;                           /* Pointer to Message Queue Name (NUL terminated ASCII)   */
    OS_PEND_LIST         PendList;                          /* List of tasks waiting on message queue                 */
#if OS_CFG_DBG_EN > 0u
    OS_Q                *DbgPrevPtr;
    OS_Q                *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
                                                            /* ------------------ SPECIFIC MEMBERS ------------------ */
    OS_MSG_Q             MsgQ;                              /* List of messages                                       */
};







void  OSQCreate (OS_Q        *p_q,
                 CPU_CHAR    *p_name,
                 OS_MSG_QTY   max_qty,
                 OS_ERR      *p_err):
    创建一个Queue,最多可以有max_qty个OS_MSG。
    初始化p_q的Type、NamePtr、MsgQ、等待list。


OS_OBJ_QTY  OSQDel (OS_Q    *p_q,
                    OS_OPT   opt,
                    OS_ERR  *p_err):
    删除Queue()。
    OS_OPT_DEL_NO_PEND:当没有任务等待时删除,调用OS_QClr(),如果有任务则设置错误代码。
    OS_OPT_DEL_ALWAYS:即使有任务等待也删除,对等待列表中的将所有的任务调用OS_PendObjDel(),调用OS_QClr(),启动调度。


void  OS_QClr (OS_Q  *p_q):
    清空p_q中的所有内容,OS内部函数,被OSQDel()调用。
    调用OS_MsgQFreeAll(),将p_q中的所有的OS_MSG放回到OSMsgPool中,调用OS_MsgQInit()清空OS_MSG_Q,调用OS_PendListInit()清空p_q的等待列表。

OS_MSG_QTY  OSQFlush (OS_Q    *p_q,
                      OS_ERR  *p_err):
    将p_q->MsgQ中的所有的OS_MSG放回到OSMsgPool中,调用OS_MsgQFreeAll()。


void  *OSQPend (OS_Q         *p_q,
                OS_TICK       timeout,
                OS_OPT        opt,
                OS_MSG_SIZE  *p_msg_size,
                CPU_TS       *p_ts,
                OS_ERR       *p_err):
    等待一个OS_MSG被Post到Queue。
    p_q->MsgQ中获取是否有message,如果有则返回message指针,否则调用OS_Pend(),启动调度器切换到别的任务执行,任务被再次唤醒时在此继续往下运行---->
---->判断OSTCBCurPtr->PendStatus:
            如果OS_STATUS_PEND_OK,从OSTCBCurPtr中获取MsgPtr、MsgSize。
            如果OS_STATUS_PEND_ABORT、OS_STATUS_PEND_TIMEOUT、OS_STATUS_PEND_DEL,设置MsgPtr、MsgSize为空,并设置错误代码。

OS_OBJ_QTY  OSQPendAbort (OS_Q    *p_q,
                          OS_OPT   opt,
                          OS_ERR  *p_err):
    终止任务对p_q的等待。
    根据opt对p_q中等待列表中的任务调用OS_PendAbort(),根据opt是否启动调度。

void  OSQPost (OS_Q         *p_q,
               void         *p_void,
               OS_MSG_SIZE   msg_size,
               OS_OPT        opt,
               OS_ERR       *p_err):
    Post一个message到p_q中。
    如果OS_CFG_ISR_POST_DEFERRED_EN>0&&OSIntNestingCtr>0,调用OS_IntQPost()(Post到ISR Queue~OS_OBJ_TYPE_Q),否则调用OS_QPost()。

void  OS_QPost (OS_Q         *p_q,
                void         *p_void,
                OS_MSG_SIZE   msg_size,
                OS_OPT        opt,
                CPU_TS        ts,
                OS_ERR       *p_err):
    Post一个message到p_q中,OSQPost()调用。
    如果p_q的等待列表中没有任务,将message存到p_q中。有任务则根据opt对等待链表中的任务调用OS_Post(),根据opt启动调度器


void  OS_QInit (OS_ERR  *p_err):
    初始化Queue管理,清空OSQQty,OS内部函数,OSInit()调用。
0 0
原创粉丝点击