#define MSG_POOL_SIZE 8 // 消息池容量 #define MSG_MAX_LEN 256 // 单帧最大长度 typedef struct { uint8_t data[MSG_MAX_LEN]; uint16_t len; uint8_t in_use; // 1已分配, 0空闲 } msg_block_t; typedef struct { msg_block_t blocks[MSG_POOL_SIZE]; } msg_pool_t; msg_pool_t g_msg_pool; // 初始化 void msg_pool_init(msg_pool_t *pool) { for (int i 0; i MSG_POOL_SIZE; i) { pool-blocks[i].len 0; pool-blocks[i].in_use 0; } } // 申请一个消息块O(n)nMSG_POOL_SIZE够小 msg_block_t *msg_pool_alloc(msg_pool_t *pool) { for (int i 0; i MSG_POOL_SIZE; i) { if (!pool-blocks[i].in_use) { pool-blocks[i].in_use 1; pool-blocks[i].len 0; return pool-blocks[i]; } } return NULL; // 池耗尽 } // 释放 void msg_pool_free(msg_block_t *block) { block-in_use 0; block-len 0; }消息池本身只是一个内存分配器消息池只解决一个问题避免malloc。//通道支持协议数 #define CFGCOM_485_PRTLNUM 0x01 //接收通信BUF的长度必须是2的幂次 #define CFGCOM_485BUF_SIZE (1024U) //接收通信BUF static INT8U sU8_485_RCVBuf[CFGCOM_485BUF_SIZE]; //偏移组 static INT16U sU16_485_BufRcvOfs[1 CFGCOM_485_PRTLNUM 1]; //接收通信环 const STRU_COMRING comRingObj[] { {sU8_485_RCVBuf, sU16_485_BufRcvOfs, CFGCOM_485BUF_SIZE, CFGCOM_485_PRTLNUM}, }; #define FULLDUPLEX_COMM_RINGLIMIT 4 //发送数据单位 #define CFGCOM_TX_QUEUE_FRAME_SIZE (512) typedef struct { INT8U buf[CFGCOM_TX_QUEUE_FRAME_SIZE]; INT16U len; } STRU_TX_QUEUE_FRAME; //发送环乒乓形式 static STRU_TX_QUEUE_FRAME bllCom_fullDuplexSENDRing[FULLDUPLEX_INDEX_MAX][FULLDUPLEX_COMM_RINGLIMIT]; //发送环缓冲区 static INT8U bllCom_fullDuplexSENDRing_inOfs[FULLDUPLEX_INDEX_MAX]; //发送环缓冲区插入偏移量 static INT8U bllCom_fullDuplexSENDRing_outOfs[FULLDUPLEX_INDEX_MAX]; //发送环缓冲区取出偏移量 const STRU_SIGNRING bllCom_FDSENDTabl[FULLDUPLEX_INDEX_MAX] { bllCom_fullDuplexSENDRing, //指向环或环组的首地址 bllCom_fullDuplexSENDRing_inOfs, //指向插入数 bllCom_fullDuplexSENDRing_outOfs, //指向取出数 FULLDUPLEX_COMM_RINGLIMIT, //每个环有几个数据 sizeof(STRU_TX_QUEUE_FRAME), //环中每个成员的大小 FULLDUPLEX_INDEX_MAX, //环组拥有几个环 };