📄 msgsystem.h
字号:
/************************************************************************************
* This function returns a pointer to the MAC buffer pool which corresponds exactly
* to the size argument. This is used with the MM_AddToPool() function to add buffers
* to the MAC buffer pool.
*
* Interface assumptions:
* None
*
* Return value:
* Pointer to the requested buffer pool
*
* Revision history:
* date Author Comments
* ------ ------ --------
* 180505 BPP Created
*
************************************************************************************/
pools_t *MM_GetMacPool
(
uint8_t size // IN: Exact size which represents the requested buffer pool.
);
/************************************************************************************
* Initialize a list anchor with a NULL list header. Used for preparing an anchor for
* first time use.
*
* Interface assumptions:
* None
*
* Return value:
* None.
*
* Revision history:
* date Author Comments
* ------ ------ --------
* 311003 BPP Created
*
************************************************************************************/
void List_ClearAnchor
(
anchor_t *pAnchor // IN: Anchor of list to reset
);
/************************************************************************************
* Links a list element to the tail of the list given by the anchor argument.
* This function is amongst other useful for FIFO queues if combined with
* List_RemoveHead.
*
* Interface assumptions:
* None
*
* Return value:
* None.
*
* Revision history:
* date Author Comments
* ------ ------ --------
* 311003 BPP Created
*
************************************************************************************/
void List_AddTail
(
anchor_t *pAnchor, //IN: Anchor of list to add element to
void *pBlock //IN: Element to add to tail of list
);
/************************************************************************************
* Links a list element to the head of the list given by the anchor argument.
* Useful for FILO buffers (push/pop stacks). This function should only be
* included in the build if really required.
*
* Interface assumptions:
* None
*
* Return value:
* None.
*
* Revision history:
* date Author Comments
* ------ ------ --------
* 311003 BPP Created
* 080104 KFV This function is need -> removed "#if defined(LIST_ADD_HEAD)"
*
************************************************************************************/
void List_AddHead
(
anchor_t *pAnchor, //IN: Anchor of list to add element to
void *pBlock //IN: Element to add to head of list
);
/************************************************************************************
* Unlinks a list element from the head of the list given by the anchor argument.
*
* Interface assumptions:
* None
*
* Return value:
* Pointer to the unlinked list element or NULL if no elements available.
*
* Revision history:
* date Author Comments
* ------ ------ --------
* 311003 BPP Created
*
************************************************************************************/
void *List_RemoveHead
(
anchor_t *pAnchor //IN: Anchor of list to remove head from
);
/************************************************************************************
*************************************************************************************
* MAC Private definitions - DO NOT CHANGE TYPES/MACROS BELOW THIS POINT.
*************************************************************************************
************************************************************************************/
// Used for calculating size of blocks in pool #0
typedef union {
nwkMessage_t nwkMessage;
panDescriptor_t panDescriptor;
} block1sizeOrigin_t;
// Max length of MPDU/PSDU without CRC
#define gMaxRxTxDataLength_c (125)
#define gMaxMsduDataLength_c (102)
/************************************************************************************
* The following two structures must only be used internally in the MAC. They need
* to be defined here in order to calculate the size of the MAC data buffers. The
* size is required for defining the maMacHeap[] byte array.
* NOTE: DO NOT USE OR CHANGE THE rxPacket_tag OR THE txPacket_tag STRUCTURES.
************************************************************************************/
struct rxPacket_tag {
uint8_t frameLength;
uint8_t linkQuality;
uint8_t headerLength;
uint8_t rxData[gMaxRxTxDataLength_c];
zbClock24_t timeStamp;
};
struct txPacket_tag {
uint8_t frameLength;
uint8_t txInfo;
struct {
uint8_t csmaCaNb;
uint8_t csmaCaBe;
uint8_t txCount;
} csmaAndTx;
uint16_t expireTime;
uint8_t msduHandle;
uint8_t txData[gMaxRxTxDataLength_c];
};
// Maximum buffer sizes to be used:
#define gMaxRxPacketBufferSize_c (sizeof(struct rxPacket_tag))
#define gMaxTxPacketBufferSize_c (sizeof(struct txPacket_tag))
#define gMaxMcpsDataReqSize_c (sizeof(nwkToMcpsMessage_t) + gMaxMsduDataLength_c)
#define gMaxMcpsDataIndSize_c (sizeof(mcpsToNwkMessage_t) + gMaxMsduDataLength_c)
#define gMaxMcpsDataBufferSize_c (FLib_GetMax(gMaxMcpsDataReqSize_c, gMaxMcpsDataIndSize_c))
#define gMaxRxTxPacketBufferSize_c (FLib_GetMax(gMaxRxPacketBufferSize_c, gMaxTxPacketBufferSize_c))
#define gMaxPacketBufferSize_c (FLib_GetMax(gMaxRxTxPacketBufferSize_c, gMaxMcpsDataBufferSize_c))
// Number of pools
#if gBigMsgsMacOnly_d > 0
#define gMmNumPools_c 3 // 1 Small message pool, 1 Large data pool, 1 Large data pool (MAC private)
#else
#define gMmNumPools_c 2 // 1 Small message pool, 1 Large data pool
#endif // gBigMsgsMacOnly_d
// The block sizes will be rounded up to multipla of largest
// data integer type (a pointer or uint16_t for HCS08).
// Extra space for list headers will be added automagically.
// The block sizes must be in ascending order. If fewer than
// 4 pools are used, then gMmPoolSize*_c, and gMmBlockSize*_c
// for the unused pools must be defined to the value 0.
// TBD: Currently many "small" messages uses union in deciding message size even if
// the message is smaller. Not a big problem, but could be improve and that
// may affect necessary sizes of messages!
#define gMmPoolSize0_c (gTotalSmallMsgs_d)
#define gMmBlockSize0_c (sizeof(block1sizeOrigin_t)) // ~22 bytes
#define gMmPoolSize1_c (gTotalBigMsgs_d - gBigMsgsMacOnly_d)
#define gMmBlockSize1_c gMaxPacketBufferSize_c
// Pool[2] is private to the MAC.
#define gMmPoolSize2_c gBigMsgsMacOnly_d
// Make sure that NWK-MLME data struct is SMALLER than this. Consider adding
// getMax(gMaxPacketBufferSize_c,sizeof(nwkToMcpsMessage_t)+aMaxMacFrameSize-1).
#if gMmPoolSize2_c != 0
#define gMmBlockSize2_c gMaxPacketBufferSize_c
#else
#define gMmBlockSize2_c 0
#endif // gBigMsgsMacOnly_d != 0
#define gMmPoolSize3_c 0
#define gMmBlockSize3_c 0
// Make sure that all blocks are aligned correctly ( Round up: (((a + (s-1)) / s) * s), s=4 -> (((a+3) >> 2) << 2) )
#define mMmBlockSize0_c ((((gMmBlockSize0_c) + (sizeof(uint8_t *) - 1)) / sizeof(uint8_t *)) * sizeof(uint8_t *))
#define mMmBlockSize1_c ((((gMmBlockSize1_c) + (sizeof(uint8_t *) - 1)) / sizeof(uint8_t *)) * sizeof(uint8_t *))
#define mMmBlockSize2_c ((((gMmBlockSize2_c) + (sizeof(uint8_t *) - 1)) / sizeof(uint8_t *)) * sizeof(uint8_t *))
#define mMmBlockSize3_c ((((gMmBlockSize3_c) + (sizeof(uint8_t *) - 1)) / sizeof(uint8_t *)) * sizeof(uint8_t *))
// The total number of bytes in each pool including list headers
#define mMmPoolByteSize0_c ((gMmPoolSize0_c) * (mMmBlockSize0_c + sizeof(listHeader_t)))
#define mMmPoolByteSize1_c ((gMmPoolSize1_c) * (mMmBlockSize1_c + sizeof(listHeader_t)))
#define mMmPoolByteSize2_c ((gMmPoolSize2_c) * (mMmBlockSize2_c + sizeof(listHeader_t)))
#define mMmPoolByteSize3_c ((gMmPoolSize3_c) * (mMmBlockSize3_c + sizeof(listHeader_t)))
// Total number of bytes in all pools together
#define mMmTotalPoolSize_c (mMmPoolByteSize0_c + mMmPoolByteSize1_c + mMmPoolByteSize2_c + mMmPoolByteSize3_c)
#if gMmNumPools_c == 1
#define mMmBlockSizeLargest_c gMmBlockSize0_c // Size of largest block
#define mMmLastPoolIdx_c 0 // Index of last pool
#endif // gMmNumPools_c == 1
#if gMmNumPools_c == 2
#define mMmBlockSizeLargest_c gMmBlockSize1_c // Size of largest block
#define mMmLastPoolIdx_c 1 // Index of last pool
#endif // gMmNumPools_c == 2
#if gMmNumPools_c == 3
#define mMmBlockSizeLargest_c gMmBlockSize2_c // Size of largest block
#define mMmLastPoolIdx_c 2 // Index of last pool
#endif // gMmNumPools_c == 3
#if gMmNumPools_c == 4
#define mMmBlockSizeLargest_c gMmBlockSize3_c // Size of largest block
#define mMmLastPoolIdx_c 3 // Index of last pool
#endif // gMmNumPools_c == 4
#endif /* _MSG_SYSTEM_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -