ucosIII内核文件分析-os_msg.c

/***********************************************************************************************
*********************************           Os_msg.c        ************************************/
这个文件里面主要包含了消息池的创建,里面的消息供任务间通信的使用,这个功能是任务创建的时候自带的
不像其他几种任务间常用的通信方式,需要创建信号量、邮箱、消息队列等。
这个消息池中的消息是伴随这任务而生的,消息池中的几条消息可以联合起来组成任务间通信用的消息队列
消息池的定义其实就是一个数组:
struct  os_msg {                         //* MESSAGE CONTROL BLOCK                               
    OS_MSG              *NextPtr;        //* 指向下一个消息,初始化时将所有消息组成一个单项链表                              
    void                *MsgPtr;         //* Actual message                                       
    OS_MSG_SIZE          MsgSize;        //* Size of the message (in # bytes)                     
    CPU_TS               MsgTS;          //* Time stamp of when message was sent               
};
OS_MSG         OSCfg_MsgPool       [OS_CFG_MSG_POOL_SIZE

struct  os_msg_pool {                  /* OS_MSG POOL                                */
    OS_MSG              *NextPtr;      /* Pointer to next message                     */
    OS_MSG_QTY           NbrFree;      /* Number of messages available from this pool   */
    OS_MSG_QTY           NbrUsed;      /* Number of messages used            */
};
os_msg_pool 这个数据结构负责管理消息池,NextPtr指向消息池中第一个可供使用的消息

struct  os_msg_q {                       /* OS_MSG_Q                                       */
    OS_MSG        *InPtr;          /* Pointer to next OS_MSG to be inserted  in   the queue*/
    OS_MSG        *OutPtr;         /* Pointer to next OS_MSG to be extracted from the queue*/
    OS_MSG_QTY    NbrEntriesSize; /* Maximum allowable number of entries in the queue      */
    OS_MSG_QTY    NbrEntries;     /* Current number of entries in the queue                */
    OS_MSG_QTY    NbrEntriesMax;  /* Peak number of entries in the queue                   */
};
OS_MSG_Q 用于任务自带的消息队列,当创建一个任务的时候,InPtr和OutPtr指向OSMsgPool,当有消息传递
过来的时候,将新的消息放到从OSMsgPool取出的存消息的地方,根据配置的是先进先出还是先进后出,将InPtr
或者OutPtr指向新收到的消息,将消息被任务读取以后重新被放回消息池的头部,OSMsgPool总是指向消息池
中第一个可被使用的消息。
/***********************************************************************************************
*******************************        OS_MsgPoolInit       ************************************/
OS_MsgPoolInit
    OS_MsgPoolCreate //将消息池(消息数组)中的消息初始化成一个单项链表
    OSMsgPool指向第一个可供使用的消息

       |

    

     /***********************************************************************************************
*******************************        OS_MsgQFreeAll       ************************************/
将任务中消息队列中的所有消息放回消息池中,InPtr指向OSMsgPool,OSMsgPool指向OutPtr,然后InPtr和
OutPtr都指向NULL
/***********************************************************************************************
****************************       OS_MsgQGet/OS_MsgQPut     **********************************/  
从任务队列中取出一条消息,OutPtr 指向下一条要读取的消息,当前消息传递给任务,并且存储当前消息的
结构体被放入到OSMsgPool中,同理OS_MsgQPut从OSMsgPool中取出一个地方用来存放新的消息,OSMsgPool
指向OSMsgPool->NextPtr,若是FIFO则InPtr指向新的消息,否则OutPtr指向新的消息。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值