⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 message.c

📁 嵌入式下的自己实现的消息队列,可以运行在51单片机下面
💻 C
字号:
#include <reg51.h>
#include <absacc.h>
#include <stdio.h>
#include <string.h>
#include "message.h"

WORD g_msg_size = sizeof(MESSAGE);

void init_msg_q(MESSAGE *pmsg, WORD len)
{
	WORD i;
	
	if((pmsg == NULL)||(len < 1)) return;

	for(i=0;i<len;i++)
	{
		pmsg->pre = pmsg->next = pmsg;
		pmsg++;
	}
}

MESSAGE * enqueue(MESSAGE *pmsg, WORD len, BYTE *psrc)
{
	WORD i;
	MESSAGE *pdst = NULL;
	MESSAGE *pins = pmsg;
	MESSAGE *phead = pmsg;
	MESSAGE *pinsed;

	EA = 0;
	
	if((pmsg == NULL)||(len < 1)||(psrc ==NULL))
	{
		EA = 1;
		return(NULL);
	}	

	pmsg++;
	for(i=1;i<len;i++)
	{
		if((pmsg->pre == pmsg) && (pmsg->next == pmsg))
		{
			pdst = pmsg;
			break;
		}
		pmsg++;
	}

	if(pdst == NULL)
	{
		EA = 1;
		return(NULL);
	}

	memcpy((BYTE *)pdst, psrc, g_msg_size);

	for(i=0;i<len;i++)
	{
		if(pins->next == phead)
		{
			pins->next = pdst;
			pdst->next = phead;
			pdst->pre = pins;
			phead->pre = pdst;
			EA = 1;
			return(pdst);
		}

		if(pins->next->timer <= pdst->timer)
		{
			pins = pins->next;
			continue;
		}

		pinsed = pins->next;

		pins->next = pdst;
		pdst->next = pinsed;
		pinsed->pre = pdst;
		pdst->pre = pins;
		EA = 1;
		return(pdst);
	}

	EA = 1;
	return(NULL);
}

MESSAGE * dequeue(MESSAGE *pmsg, WORD len, MESSAGE *pdst)
{
	MESSAGE *phead = pmsg;
	MESSAGE *pde;
	MESSAGE *plink;

	EA = 0;

	if((pmsg == NULL)||(len < 1)||(pdst ==NULL))
	{
		EA = 1;
		return(NULL);
	}

	if(pmsg->next == pmsg)
	{
		EA = 1;
		return(NULL);
	}

	pde = phead->next;

	if(pde->timer > 0)
	{
		EA = 1;
		return(NULL);
	}

	
	
	plink = pde->next;

	phead->next = plink;
	plink->pre = phead;
	pde->pre = pde->next = pde;

	memcpy((BYTE *)pdst, (BYTE *)pde, g_msg_size);

	EA = 1;
	return(pdst);
}

void timer_msg_q(MESSAGE *pmsg, WORD len)
{
	WORD i;
	
	if((pmsg == NULL)||(len < 1)) return;

	for(i=0;i<len;i++)
	{
		if(pmsg->timer) pmsg->timer--;
		pmsg++;
	}
}

MESSAGE *cancel_msg(MESSAGE *pmsg, WORD len, MESSAGE *pcancel)
{
	MESSAGE *phead = pmsg;
	MESSAGE *ppre;
	MESSAGE *pnext;

	EA = 0;

	if((pmsg == NULL)||(len < 1)||(pcancel == NULL))
	{
		EA = 1;
		return(NULL);
	}
	if(((pcancel - pmsg) < 1) || ((pcancel - pmsg) > (len - 1)))
	{
		EA = 1;
		return(NULL);
	}
	if((pcancel->pre == pcancel) && (pcancel->next == pcancel))
	{
		EA = 1;
		return(NULL);
	}

	ppre = pcancel->pre;
	pnext = pcancel->next;

	ppre->next = pnext;
	pnext->pre = ppre;

	pcancel->pre  = pcancel->next = pcancel;

	EA = 1;
	return(pcancel);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -