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
- OS_Q.C
- os_q.c
- uC/OS-II源码解析(os_q.c)
- μCOS-II源码文件之OS_Q.C
- c
- c
- c
- c
- C
- c
- c
- c
- C+
- c
- C
- c
- c
- c
- NoSQL学习笔记安装和配置
- 深入理解计算机系统-之-数值存储(六)--以不同的方式窥视内存
- c#学习——值类型与引用类型
- Leetcode 136
- 你喜欢过的,变了
- os_q.c
- StringTokenizer类的用法
- 正则表达式之常用量词
- 转:解决android.os.NetworkOnMainThreadException
- IOS资源汇集
- C++ Primer Plus Chapter4
- 联网获取Json并且解析
- 我的核心观
- Android 版本更新的实现