向消息队列发送一个消息(FIFO),OSQPost()
2017-04-12 10:17
330 查看
程序清单 L6.23是OSQPost()函数的源代码。在确认事件控制块是消息队列后 [L6.23(1)],OSQPost()函数检查是否有任务在等待该消息队列中的消息[L6.23(2)]。当事件控制块的.OSEventGrp域为非0值时,说明该消息队列的等待任务列表中有任务。这时,调用OSEventTaskRdy()函数 [见6.02节,使一个任务进入就绪状态,OSEventTaskRdy()]从列表中取出最高优先级的任务[L6.23(3)],并将它置于就绪状态。然后调用函数OSSched() [L6.23(4)]进行任务的调度。如果上面取出的任务的优先级在整个系统就绪的任务里也是最高的,而且OSQPost()函数不是中断服务子程序调用的,就执行任务切换,该最高优先级任务被执行。否则的话,OSSched()函数直接返回,调用OSQPost()函数的任务继续执行。 程序清单 L6.23 向消息队列发送一条消息 INT8U OSQPost (OS_EVENT *pevent, void *msg) { OS_Q *pq; OS_ENTER_CRITICAL(); if (pevent->OSEventType != OS_EVENT_TYPE_Q) { (1) OS_EXIT_CRITICAL(); return (OS_ERR_EVENT_TYPE); } if (pevent->OSEventGrp) { (2) OSEventTaskRdy(pevent, msg, OS_STAT_Q); (3) OS_EXIT_CRITICAL(); OSSched(); (4) return (OS_NO_ERR); } else { pq = pevent->OSEventPtr; if (pq->OSQEntries >= pq->OSQSize) { (5) OS_EXIT_CRITICAL(); return (OS_Q_FULL); } else { *pq->OSQIn++ = msg; (6) pq->OSQEntries++; if (pq->OSQIn == pq->OSQEnd) { pq->OSQIn = pq->OSQStart; } OS_EXIT_CRITICAL(); } return (OS_NO_ERR); } } 如果没有任务等待该消息队列中的消息,而且此时消息队列未满[L6.23(5)],指向该消息的指针被插入到消息队列中[L6.23(6)]。这样,下一个调用OSQPend()函数的任务就可以马上得到该消息。注意,如果此时消息队列已满,那么该消息将由于不能插入到消息队列中而丢失。 此外,如果OSQPost()函数是由中断服务子程序调用的,那么即使产生了更高优先级的任务,也不会在调用OSSched()函数时发生任务切换。这个动作一直要等到中断嵌套的最外层中断服务子程序调用OSIntExit()函数时才能进行(见3.09节,µC/OS-II中的中断)。
相关文章推荐
- 向消息队列发送一个消息(后进先出LIFO),OSQPostFront()
- uC/OS-II V2.86 发送和等待一个队列消息的工作原理
- 消息队列实现从一个进程向另一个进程发送一个数据块的方法
- 0905使用msgsnd函数向消息队列中发送一个字符串数据信息“Hello!This is a te
- MSMQ消息队列,一个按钮发送,一个按钮接受
- 《精通Unix下C语言编程与项目实践》之八 消息队列发送模型 推荐
- 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到
- 向一个指定窗口发送左键按下的消息,同时将左键按下的位置也发过去(譬如要编写连连看程序的外挂)
- 使用HTTP发送消息(消息队列技术)
- 第二人生的源码分析(三十八)构造一个消息包并发送
- 在不发送 Windows 消息的情况下处理一个运行时间非常长的操作
- 第二人生的源码分析(三十八)构造一个消息包并发送
- MQ中将消息发送至远程队列的配置
- 系统软件性能调优策略(一)——通过有名管道FIFO来检测消息队列中是否可读
- CLR 无法从 COM 上下文 0x1a2740 转换为 COM 上下文 0x1a28b0,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作
- C#TCPClient应用-一个简单的消息发送和接收
- 使用HTTP发送消息(消息队列技术)
- 蔡军生先生第二人生的源码分析(三十八)构造一个消息包并发送
- 一个com+消息队列的例子
- 使用消息队列 异步插入数据,能发送消息,但是无法读取消息