⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chapter6.txt

📁 ucos的PDF书籍、2.00源码以及我的学习心得
💻 TXT
字号:
6.01 ~ 6.04
在OSEventWaitListInit()、OSEventTaskRdy()、OSEventTaskWait()和OSEventTO()中,OSEventTaskRdy()与OSEventTO()需要在禁止中断的情况下调用。
主要原因在于,OSEventTaskRdy()与OSEventTO()中都包含将任务重新放入就绪队列中的操作,为了防止在此操作彻底完成之前产生时间中断将任务切换,需要在操作执行时,禁止对中断的响应。

6.05.02 Waiting on a Semaphore, OSSemPend()
注意:
If the semaphore is not available (the count is zero) then we check to see if the function was called by an ISR.Under normal circumstances, you should not call OSSemPend() from an ISR because an ISR cannot be made to wait.I decided to add this check just in case. However, if the sema phore is in fact available, the call to OSSemPend()would be successful even if called by an ISR!

6.05.03 Signaling a Semaphore, OSSemPost()
这里需要注意的是,若OSSemPost在中断处理函数中被调用而此时if (pevent->OSEventGrp)又为真,那么任务调度的工作并不是在OSSched中进行(此时OSIntNesting不为0)而是延后到中断退出时在OSIntExit中进行。

6.05.05 Obtaining the status of a semaphore, OSSemQuery()
此函数将信息返回到了一个名为OS_SEM_DATA的结构之中。只所以不直接返回ECB的指针(像OSTaskQuery一样)是因为ECB过于通用了,这里用户关心的只是有关信号量的信息。

6.06 Message Mailboxes
~~根据对OSMboxPend和OSMboxPost的分析可以知道,在uC/OS中使用Message Mailbox进行进程间的通信实际上可以有两种方式:
当消息接收方(pend方)提前执行时,由于此时消息发送方(post方)尚未将消息放入.OSEventPtr中,接收方将因等待消息而退出就绪队列被挂起。这之后如果轮到消息发送方执行,根据post函数中的定义可以知道,发送方不会将消息放入.OSEventPtr中,而是调用OSEventTaskRdy将消息直接放入最高优先级等待任务的.OSTCBMsg中。在这种情况下,.OSEventPtr中其实一直是空的,消息的传递是在进程间直接进行的。
与上边的情况相反,如果消息的发送方提前执行,此时没有任务等待消息,故发送方将消息直接放入.OSEventPtr中。在此之后如果接收消息的任务被执行,根据pend函数中的定义,接受方会立即从.OSEventPtr中取走消息。在这种情况下,进程间的通信实际上就可以看作是通过一个公共信箱.OSEventPtr间接完成的。

~~关于OSMboxPend函数这里有一点要说的地方:
在OSSched();函数被调用之后函数因等待消息而被挂起,而当该进程再次占领CPU时,说明此时进程要么已获得了消息要么因等待超时而被唤醒,因此就需要做一些善后的操作,这也就是pend函数中OSSched();之后语句的工作。作者在对这一段工作进行书写时,处理了三种情况:
1、(msg = OSTCBCur->OSTCBMsg) != (void *)0的情况,这种情况发生说明进程在等待超时前得到了消息;
2、OSTCBCur->OSTCBStat & OS_STAT_MBOX不为0的情况,这种情况发生说明进程等待超时后被唤醒;
3、这里作者又引入了一种情况,这种情况在上述两种情况均未发生时发生。通过分析源码可知,这种情况发生时意味着在消息接收方等待消息的过程中,发送方通过将消息放入公共邮箱而不是直接与接收进程通信的方式将消息发送了出去。不过当继续分析post函数的源码后会发现,这种情况不可能发生!因为根据post源码的描述,如果发送方在发送前已经有进程在等待消息的话,发送方只可能通过直接通信的方式将消息发出,因此上面讨论中出现的情况!也许就是因为这样,在2.52版本中的OSMboxPend函数中,作者只处理了1和2两种情况而删除了对第3种情况的处理。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -