注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

深海精灵

水里的一滴油,透明地飘零在空气中。。。

 
 
 

日志

 
 
关于我

神秘诡谲,令人费解。可以很执着,也可以很破坏。冰冷,沉默。渴望单纯,渴望自由。躲在文字的背后,用心聆听世界,用直觉洞察世情。

网易考拉推荐

uCOS实时操作系统——uCOS的通信机制  

2012-07-28 10:47:16|  分类: uCOS实时操作系统 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  在多任务应用中,各任务都孤立是很少见的,不与任何其他任务进行信息交互的任务并不多见,因此就涉及到两个或多个任务之间的信息传递和状态传递。下图为uCOS提供的任务间信息交互机制。

uCOS实时操作系统——uCOS的通信机制 - 深海精灵 - 深海精灵

  通信机制:涉及到数据的传输,即通过该机制,数据从一个任务传递到另一个任务。
  同步机制:不涉及数据的传输,只提供某个事务的状态。根据其提供事件的状态量,可分为信号量(事物多种状态)和互斥锁(二元信号量),事件组标志提供任务间多个事件的同步,即产生某几个事件同时发生时的信号。

一、事件管理机制
  在uCOS中,与通过任务控制块管理任务类似,对于每一个事件,系统为其分配一个事件控制块,定义如下:
#if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u)
typedef struct os_event {
    INT8U    OSEventType;                    /* 事件类型 */
    void    *OSEventPtr;                     /* 指向邮箱或消息队列的指针(同步机制不使用)*/
    INT16U   OSEventCnt;                     /* 信号量计数器(其它事件不使用)*/
    OS_PRIO  OSEventGrp;                     /* 事件等待组标志*/
    OS_PRIO  OSEventTbl[OS_EVENT_TBL_SIZE];  /* 事件的任务等待表*/

#if OS_EVENT_NAME_EN > 0u
    INT8U   *OSEventName;                   /* 事件名称*/
#endif
} OS_EVENT;
#endif
  事件的任务等待表的管理算法与任务就绪表类似。当某任务等待该事件发生时,需要将该任务的优先级添加到等待表中,当某一事件到来时,查找等待该事件的最高优先级任务的优先级值,以使该任务恢复就绪状态。

二、消息邮箱
  事件类型为OS_EVENT_TYPE_MBOX,OSEventPtr指向创建消息邮箱时指定的内存空间。邮箱每次只能存储一个消息。所创建的消息邮箱使用的是用户自己定义的某个全局内存空间,而在创建邮箱过程中,仅仅申请了一个事件控制块来管理这段内存空间。(与全局变量类似)
  用OSMboxPost()发送消息时,如果该邮箱中已经有消息,将返回错误,因此,同一时刻只能存储一个消息。
  如果多个任务等待此消息,则从任务等待表中查出最高优先级的任务,把消息传给该任务。

三、消息队列
  邮箱在某个时刻只能存储一个消息,消息队列则可实现多条消息传递。默认使用FIFO原则,使用的是循环队列。
  OSEventPtr指向消息队列控制块os_q,如下:
#if OS_Q_EN > 0u
typedef struct os_q {  
    struct os_q   *OSQPtr;              /* Link to next queue control block in list of free blocks     */
    void         **OSQStart;            /* 指向队列指针数组的起始位置 */
    void         **OSQEnd;              /* */
    void         **OSQIn;               /* 指向队列指针数组中下一个可以插入消息的位置*/
    void         **OSQOut;              /* 指向队列指针数组中下一个读出消息的位置  */
    INT16U         OSQSize;             /* 数组大小  */
    INT16U         OSQEntries;          /* 当前可读的消息个数 */
} OS_Q;

四、信号量
  用以标识某类资源的可用个数。
  举个例子:生产——消费问题。在固定的仓库空间,生产者每生产一个产品,将占用一个仓库空间,产品库存不能超过仓库的存储量;消费者每消费一个产品,将增加一个仓库空间,仓库产品为0时不能再消费。使用两个信号量(消费者信号量和生产者信号量),对生产者来说,生产产品前需申请信号量,当信号量大于0时,即有可用空间,将生产产品,信号量减1,产品数量增加后,消费者信号量加1。对消费者来说,在消费之前需申请消费者信号量,当信号量大于0,即有可用产品,消费产品,信号量减1,仓库空间增加,生产者信号量加1。

五、互斥锁
  用于实现对资源的排他性访问。
  举个例子:文件的写操作问题。任何时间段内只能有一个进程进行写文件内容,如果某个任务已经占用该文件资源,此时可通过设置互斥锁为0,以告知其它任务该资源不可用,在该任务写操作完成并释放资源后,置互斥锁为1,该资源可用,其它任务才能对该文件进行写操作。

  评论这张
 
阅读(679)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017