0406

来源:互联网 发布:天天向上四大网络作家 编辑:程序博客网 时间:2024/06/17 11:30

发送一个消息到邮箱中,OSMboxPost()

  1. 程序清单 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()函数的任务就可以立刻得到该消息了。  
  2. 注意,如果OSMboxPost()函数是从中断服务子程序中调用的,那么,这时并不发生上下文的切换。如果需要,中断服务子程序引起的上下文切换只发生在中断嵌套的最外层中断服务子程序对OSIntExit()函数的调用时(见3.09节,µC/OS-II中的中断)。程序清单 L6.16 向邮箱中发送一条消息  
  3. INT8U OSMboxPost (OS_EVENT *pevent, void *msg)  
  4. {  
  5.     OS_ENTER_CRITICAL();  
  6.     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {              (1)  
  7.         OS_EXIT_CRITICAL();  
  8.         return (OS_ERR_EVENT_TYPE);  
  9.     }  
  10.     if (pevent->OSEventGrp) {                                        (2)  
  11.         OSEventTaskRdy(pevent, msg, OS_STAT_MBOX);                 (3)  
  12.         OS_EXIT_CRITICAL();  
  13.         OSSched();                                                 (4)  
  14.         return (OS_NO_ERR);  
  15.     } else {  
  16.         if (pevent->OSEventPtr != (void *)0) {                      (5)  
  17.             OS_EXIT_CRITICAL();  
  18.             return (OS_MBOX_FULL);  
  19.         } else {  
  20.             pevent->OSEventPtr = msg;                                (6)  
  21.             OS_EXIT_CRITICAL();  
  22.             return (OS_NO_ERR);  
  23.         }  
  24.     }  
  25. }

0 0
原创粉丝点击