Board logo

标题: uCOS实时操作系统的通信机制(2) [打印本页]

作者: yuyang911220    时间: 2014-10-28 21:56     标题: 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,该资源可用,其它任务才能对该文件进行写操作。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0