![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
考虑到这种特殊的运作方式,任务的实现可以以下列方式来运行。
OSMboxCreatE( ...);/*在任务初始化时,为该任务创建一个邮箱,用来接收其他任务发送来的消息。*/
for( ;;)
{ bytE statE,stim ,act;
Check Timer Expired();/*检查TIMER是否timEout*/
OSMboxPend();/*从该任务的邮箱中接受收到的新邮件消息*/
statE= Get Entity ();/*从邮件消息中获取消息实体,得到该消息是发给此协议的那一个实体的,并得到该实体的状态。例如,PSTN协议,则要获取此消息是发给PSTN协议的那个端口*/
stim = Get Stim();/*从邮件消息中获取用于FSM 的激励消息*/
act= Do FSM(statE,stim);/*根据前面获取的状态和激励消息,得到需要做的动作和下一个状态.*/
DoAct(act);/*完成由FSM 指定的工作,并转移该实体的状态.*/
OSMboxPost();/*根据需要发送消息通知其他协议任务*/
}
各个协议的FSM 方式运作实现都可按上面的框架来完成。
借助于μC/OS-II系统API函数OSMboxPend,可以从邮箱中收取邮件。当邮箱中有新的邮件时,该函数返回指针指向新的邮件。若没有新邮件,该函数将挂起当前任务,把CPU时间让给其他任务使用。在DoAct函数的处理中,用系统的API函数OSMboxPost发送邮件给其他任务的邮箱。
定时器的实现
每个任务有一个timer链表保存该任务使用的所有定时器。定时器链表具有以下的数据结构
structv5_timer
{
bytE timerid;/*标示每个TIMER*/
unsigned long period;/*标示定时器的timeout时长*/
bytE timer typE;/*标示定时器的类型*/
unsignedlong starttimE;/*标示定时器启动的系统时间*/
bytE t_flag ;/*保留用的标记*/
}
要设定一个定时器只需新添加一个TIMER到链表中。调用系统APIOSTimeGet()获取目前系统时间作为定期器的启动时间填入定时器结构体的starttimE成员中,给period赋值指定定时器时长。任务循环的开始部分在接收邮件消息前,将检查链表,通过比较每个TIMER的starttime和目前系统时间的差值来判断定时器是否到期,如果有定时器到期则插入一条TIMEOUT消息到本任务的邮箱。
结束语
V5接口在通信网络中有着广泛的应用,笔者探讨了在开放源码的μC/OS操作系统上如何实现V5接口,提出了V5接口的软件实现框架和具体设计方案。在商业应用上可大大降低开发成本,对开发嵌入式操作系统的技术人员能有所帮助。 |
|