os_q.c

来自「cs5460a做功率表用 cs5460a做功率表用 cs5460a做功率表」· C语言 代码 · 共 150 行

C
150
字号
/********************************************
公司名称:
文 件 名:
版 本 号:
程序设计:
说    明:
完成日期:
修改日期:
功能摘要:
**********************************************/
#define _OS_Q
#include "includes.h"

OS_Q  *OSQCreat(OS_Q *pEvent,uint8 *start,uint8 size);
uint8 OSQPost (OS_Q *pEvent,uint8 msg);
uint8 OSQAccept (OS_Q *pEvent,uint8 *const msg);
uint8 OSQQuery(OS_Q *pEvent);
//-----------------------------------------------

OS_Q  *OSQCreat(OS_Q *pEvent,uint8 *start,uint8 size)   //创建一个消息队列
{
		
		pEvent->OSQStart 	= start;
		pEvent->OSQEnd 		= &start[size];
		pEvent->OSQIn 		= start;
		pEvent->OSQOut      = start;
		pEvent->OSQSize		= size;
		pEvent->OSQCnt		= 0;
			
		return (pEvent);
}
//------------------------------------------------
uint8 OSQPost (OS_Q *pEvent,uint8 msg)        //向消息队列发送一则消息
{
		
		if (pEvent == (OS_Q *)0)			  //无效事件
		   {
			   return (OS_ERR_PEVENT_NULL);
		    }	
		OS_CLOSE_INT();
		if (pEvent->OSQCnt >= pEvent->OSQSize) //时件长度超过所给长度,已满
		   {
               OS_OPEN_INT();
               return (OS_Q_FULL);
	    	}		
		*pEvent->OSQIn++ = msg;					//OSQIn++ = msg
		pEvent->OSQCnt++;
		if (pEvent->OSQIn == pEvent->OSQEnd)	//如果已满则重新开始
		   {
               pEvent->OSQIn = pEvent->OSQStart;
		    }
		OS_OPEN_INT();
		return (OS_Q_OK);									
}

//------------------------------------------------
uint8 OSQAccept (OS_Q *pEvent,uint8 * const msg)		//从消息队列中取出消息
{
		
		if (pEvent == (OS_Q *)0) 
		   {
              return (OS_ERR_PEVENT_NULL);
		   }	
		OS_CLOSE_INT();
		if (pEvent->OSQCnt > 0) 
		   {
			 *msg = *pEvent->OSQOut;
			 pEvent->OSQOut++;			
			 pEvent->OSQCnt--;			
			 if (pEvent->OSQOut == pEvent->OSQEnd) 
			    {
                  pEvent->OSQOut = pEvent->OSQStart;
		        }
		     OS_OPEN_INT();
		     return OS_Q_OK;	
		    }
	    OS_OPEN_INT();
		return OS_Q_ERR;
}
//------------------------------------------------
uint8 OSQQuery(OS_Q *pEvent)
{
		
		if (pEvent == (OS_Q *)0) 
		   {			
			  return (OS_ERR_PEVENT_NULL);				
		    }
				
		OS_CLOSE_INT();
		if (pEvent->OSQCnt != 0)
		   {			
			  OS_OPEN_INT();
			  return (OS_Q_NO_EMPTY);				
		   }
		 else if (pEvent->OSQCnt >= pEvent->OSQSize) 
		   {			
			  OS_OPEN_INT();
			  return (OS_Q_FULL);				
			} 
		  else 
		   {								
              OS_OPEN_INT();
              return (OS_Q_EMPTY);	
           }
						
}
//-------------------------------------------------
/*
--------------------------
*OSQCreat:创建一个消息队列.
OS_Q  *OSQCreat(OS_Q *pEvent,uint8 *start,uint8 size) :定义消息队列的一些特征
--------------------------
OSQPost:向消息队列发送一则消息,发送函数
   无效消息
   关中断;if  OSQCnt >=OSQSize ,则数据已满
		   *pEvent->OSQIn++ = msg;
		   pEvent->OSQCnt++;
           if  OSQIn==OSQEnd,     则OSQIn =OSQStart
   开中断:
   return (OS_Q_OK);
   向消息队列内装载数据:当数据正常时:*pEvent->OSQIn++ = msg  (msg 是函数Process_Msg准备好的)
   pEvent事件包括:msg所具有的特性

---------------------------
OSQAccept:从消息队列中取出消息,接收函数
   无效消息
   关中断: if OSQCnt > 0   	则*msg = *pEvent->OSQOut;
							pEvent->OSQOut++;
						    pEvent->OSQCnt--;
							if OSQOut ==OSQEnd  则OSQOut =OSQStart
							OS_OPEN_INT();
							return OS_Q_OK;
  OS_OPEN_INT();
  return OS_Q_ERR;

  从消息队列内取出消息:当数据正常时:pEvent->OSQOut++;pEvent->OSQCnt--;(pEvent是消息队列中存在的数)

-------------------------
OSQQuery:异常处理函数.
     无效消息
	 关中断    if  OSQCnt != 0            则OS_OPEN_INT();
	                    		            return (OS_Q_NO_EMPTY);
			  else if   OSQCnt  >=OSQSize 则OS_OPEN_INT();
									        return (OS_Q_FULL);
			   else						  则OS_OPEN_INT();
										    return (OS_Q_EMPTY);
--------------------------
以消息队列作为一个媒介:发送时把消息先发送到消息队列中;接收消息时从消息队列中取出消息
*/

⌨️ 快捷键说明

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