嵌入式软件中,受硬件内存所限,最好别采用动态分配和回收,对于某些数据结构,最好提前分配好内存,便于管理。
自己实现一个队列的数据结构,用作备份。
/* 队列结构,队列大小XXX_QUEUE_SIZE和事件结构XXX_T根据需要自己定义 */
typedef struct
{
u16 usFront; /* 队首 */
u16 usRear; /* 队尾 */
u16 usMaxNum; /* 队列最大容量 */
void *pvData;
} QUEUE_T;
/* 队列初始化 */
void queue_init(QUEUE_T *pstQueue, XXX_T *pstXXXArray)
{
pstQueue->usFront = 0;
pstQueue->usRear = 0;
pstQueue->usMaxNum = XXX_QUEUE_SIZE;
memset(&pstXXXArray[0], 0, sizeof(XXX_T) * XXX_QUEUE_SIZE);
pstQueue->pvData = pstEventArray;
}
/* 实际能存储的元素有效个数为(SEND_EVENT_QUEUE_SIZE - 1) */
s32 is_queue_full(QUEUE_T *pstQueue)
{
if (pstQueue->usFront == ((pstQueue->usRear + 1) % pstQueue->usMaxNum))
{
return 0;
}
return -1;
}
s32 is_queue_empty(QUEUE_T *pstQueue)
{
if (pstQueue->usFront == pstQueue->usRear)
{
return 0;
}
return -1;
}
/* push一个事件到队列 */
void push_queue_info(QUEUE_T *pstQueue, XXX_T *pstInfo)
{
XXX_T *pstData = (XXX_T*)pstQueue->pvData;
/* 如果队列满,删除最老的记录 */
if (0 == is_queue_full(pstQueue))
{
pstQueue->usFront = (pstQueue->usFront + 1) % pstQueue->usMaxNum;
}
memcpy(pstData + pstQueue->usRear, pstInfo, sizeof(XXX_T));
pstQueue->usRear = (pstQueue->usRear + 1) % pstQueue->usMaxNum;
}
/* 从队列中pop一个事件 */
s32 pop_queue_info(QUEUE_T *pstQueue)
{
XXX_T *pstData = (XXX_T*)pstQueue->pvData;
if (0 == is_queue_empty(pstQueue))
{
return -1;
}
memset(pstData + pstQueue->usFront, 0, sizeof(XXX_T));
pstQueue->usFront = (pstQueue->usFront + 1) % pstQueue->usMaxNum;
return 0;
}
/* 获取队列中的第一个事件 */
s32 get_front_queue_info(QUEUE_T *pstQueue, XXX_T *pstInfo)
{
XXX_T *pstData = (XXX_T*)pstQueue->pvData;
if (0 == is_queue_empty(pstQueue))
{
return -1;
}
memcpy(pstInfo, pstData + pstQueue->usFront, sizeof(XXX_T));
return 0;
}