首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

uCOS实时操作系统的通信机制(2)

uCOS实时操作系统的通信机制(2)

三、消息队列
  邮箱在某个时刻只能存储一个消息,消息队列则可实现多条消息传递。默认使用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,该资源可用,其它任务才能对该文件进行写操作。
继承事业,薪火相传
返回列表