本文主要是介绍发送一个消息到邮箱中,OSMboxPost(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 程序清单 L6.16是OSMboxPost()函数的源代码。检查了事件控制块是否是一个邮箱后[L6.16(1)],OSMboxPost()函数还要检查是否有任务在等待该邮箱中的消息[L6.16(2)]。如果事件控制块中的OSEventGrp域包含非零值,就暗示着有任务在等待该消息。这时,调用OSEventTaskRdy()将其中的最高优先级任务从等待列表中删除[见6.02节,使一个任务进入就绪状态,OSEventTaskRdy()][L6.16(3)],加入系统的就绪任务列表中,准备运行。然后,调用OSSched()函数[L6.16(4)],检查该任务是否是系统中最高优先级的就绪任务。如果是,执行任务切换[仅当OSMboxPost()函数是由任务调用时],该任务得以执行。如果该任务不是最高优先级的任务,OSSched()返回,OSMboxPost()的调用函数继续执行。如果没有任何任务等待该消息,指向消息的指针就被保存到邮箱中[L6.16(6)](假设此时邮箱中的指针不是非NULL的[L6.16(5)])。这样,下一个调用OSMboxPend()函数的任务就可以立刻得到该消息了。
- 注意,如果OSMboxPost()函数是从中断服务子程序中调用的,那么,这时并不发生上下文的切换。如果需要,中断服务子程序引起的上下文切换只发生在中断嵌套的最外层中断服务子程序对OSIntExit()函数的调用时(见3.09节,µC/OS-II中的中断)。程序清单 L6.16 向邮箱中发送一条消息
- INT8U OSMboxPost (OS_EVENT *pevent, void *msg)
- {
- OS_ENTER_CRITICAL();
- if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { (1)
- OS_EXIT_CRITICAL();
- return (OS_ERR_EVENT_TYPE);
- }
- if (pevent->OSEventGrp) { (2)
- OSEventTaskRdy(pevent, msg, OS_STAT_MBOX); (3)
- OS_EXIT_CRITICAL();
- OSSched(); (4)
- return (OS_NO_ERR);
- } else {
- if (pevent->OSEventPtr != (void *)0) { (5)
- OS_EXIT_CRITICAL();
- return (OS_MBOX_FULL);
- } else {
- pevent->OSEventPtr = msg; (6)
- OS_EXIT_CRITICAL();
- return (OS_NO_ERR);
- }
- }
- }
这篇关于发送一个消息到邮箱中,OSMboxPost()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!