********************************* 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指向新的消息。