消息队列的使用方法.doc_第1页
消息队列的使用方法.doc_第2页
消息队列的使用方法.doc_第3页
消息队列的使用方法.doc_第4页
消息队列的使用方法.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

uCOS II 消息队列的使用方法需在以下文件中配置如下内容:OS_CFG.HOS_MAX_QS N 你需要的值根据需要自己配置#define OS_Q_EN 1 /* Enable (1) or Disable (0) code generation for QUEUES */#define OS_Q_ACCEPT_EN 1 /* Include code for OSQAccept() */#define OS_Q_DEL_EN 1 /* Include code for OSQDel() */#define OS_Q_FLUSH_EN 1 /* Include code for OSQFlush() */#define OS_Q_POST_EN 1 /* Include code for OSQPost() */#define OS_Q_POST_FRONT_EN 1 /* Include code for OSQPostFront() */#define OS_Q_POST_OPT_EN 1 /* Include code for OSQPostOpt() */#define OS_Q_QUERY_EN 1 /* Include code for OSQQuery() */2、 建立一个指向消息数组的指针和数组的大小,该指针数组必须申明为void类型,如下:void *MyArrayOfMsgSIZE;3、 声明一个OS_EVENT类型的指针指向生成的队列,如下:OS_EVENT *QSem;4、 调用OSQcreate()函数创建消息队列,如下:QSem = OSQcreate(&MyArrayOfMsg0,SIZE);5、 等待消息队列中的消息,OSQPend()。void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err):必须保证消息队列已经被建立。timeout定义的是等待超时时间,如果为0则表示无期限的等待err表示的是在等待消息队列出错时的返回类型,有以下几种:OS_ERR_PEVENT_NULL /消息队列不存在OS_ERR_EVENT_TYPEOS_TIMEOUT /消息队列等待超时OS_NO_ERR /消息队列接收到消息获得消息队列示例 type *GETQ; INT8U err; GETQ = (type *)OSQPend(QSem, time, &err); if(err = OS_NO_ERR) 无错处理 else 出错处理 6.1 向消息队列发送一则消息(FIFO),OSQPost(); INT8U OSQPost (OS_EVENT *pevent, void *msg):函数返回值有:OS_ERR_PEVENT_NULLOS_ERR_POST_NULL_PTROS_ERR_EVENT_TYPEOS_Q_FULLOS_NO_ERR参数:pevent,*msg6.2 向消息队列发送一则消息(LIFO) INT8U OSQPostFront (OS_EVENT *pevent, void *msg)6.3 向消息队列发送一则消息(LIFO或者FIFO) INT8U OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)参数: opt如果经opt参数中的OS_POST_OPT_BROADCAST位置为1,则所有正在等待消息的任务都能接收到这则消息,并且被OS_EventTaskRdy()从等待列表中删除如果不是广播方式,则只有等待消息的任务中优先级最高的任务能够进入就绪态。然后,OS_EventTaskRdy()从等待列表中把等待消息的任务中优先级最高的任务删除。注: 如果此函数由ISR调用,则不会发生任务切换,直到中断嵌套的最外层中断服务子程序调用OSIntExit()函数时,才能进行任务切换7、 无等待的从消息队列中获得消息,OSQAccept(); void *OSQAccept (OS_EVENT *pevent, INT8U *err)err可能的返回值:OS_ERR_PEVENT_NULLOS_Q_EMPTYOS_NO_ERR函数的返回值:消息,08、 清空消息队列 INT8U OSQFlush (OS_EVENT *pevent)函数返回值:OS_ERR_PEVENT_NULLOS_ERR_EVENT_TYPEOS_NO_ERR9、 获取消息队列的状态,OSQQuery(); INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *p_q_data)函数返回值:OS_ERR_PEVENT_NULLOS_ERR_EVENT_TYPEOS_NO_ERROS_Q_DATA数据结构在ucos_ii.h中/ 采用消息队列的ADC采样任务原型代码,建议与uC/OS-II作者的ADC通用例程一起使用/ 说明这里消息队列msg_q不用于储存ADC结果。void ADCTask(void * pParam) char *cmd; pParam=pParam; while(1) cmd=OSQPend(msg_q,100,&err); / waiting for command if(err=OS_NO_ERR) switch (*cmd) case 1: printf(Command 1n); break; case 2: printf(Command 2n); break; default : printf(Error command.n); break; else / no command , then sampling. if(err=OS_TIMEOUT) / sampling while timeout. printf(ADC sampling .); StoreADResult(); 数据队列 Queue 的使用:数据队列数据队列一般用于数据缓存,可以用来平衡速率不同的两个部件,使快速部件无需等待慢速部件。数据队列一般是先入先出的,但本数据队列可以配置成后入先出。本数据队列是可配置可裁剪的模块,并且不依赖于操作系统,可以在前后台系统中使用。数据队列使用的空间由用户分配且由这个空间的地址唯一识别一个数据队列。API函数数据队列软件模块包括的API函数如下所示:API函数名 功能简介QueueCreate 建立数据队列QueueRead 获取队列中的数据QueueWrite 先进先出方式发送数据QueueWriteFront 后进先出方式发送数据QueueFlush 清空队列QueueNData 取得队列中已存储数据的数据QueueSize 取得队列中总共可以存储的数据数目/* 文件名: queue.c* 描 述: 数据队列的中间件*/#include app_cfg.h#define IN_QUEUE#define QUEUE_OK 1#define NOT_OK 0#define QUEUE_EMPTY 2#define QUEUE_FULL 3#define Q_WRITE_MODE 4#define Q_WRITE_FRONT_MODE 5#define QUEUE_DATA_TYPE INT8Utypedef struct QUEUE_DATA_TYPE *pOut; /* 指向数据输出位置 */ QUEUE_DATA_TYPE *pIn; /* 指向数据输入位置 */ QUEUE_DATA_TYPE *pEnd; /* 指向Buf的结束位置 */ uint16 nBytesPerRec; /* 队列中每个记录包含数据个数 */ uint16 nMaxRecNum; /* 队列可以存储的记录数目 */ uint16 nRecNum; /* 队列中数据个数 */ uint8 (* ReadEmpty)(); /* 读空处理函数*/ uint8 (* WriteFull)(); /* 写满处理函数 */ QUEUE_DATA_TYPE Buf1; /* 存储数据的空间 */ DataQueue;/SizeOfBuf是Buf的字节长度。/QUEUE_DATA_TYPE是指可定义的数据类型可以Uint8,Uint32,等。/Queue是DataQueue型结构体。/* 函数名称: QueueCreate* 功能描述: 初始化数据队列* 输 入: Buf :为队列分配的存储空间地址* SizeOfBuf:为队列分配的存储空间大小(字节)* BytesPerRec: 队列每个记录占用字节数* ReadEmpty:为队列读空时处理程序* WriteFull:为队列写满时处理程序* 输 出: NOT_OK:参数错误* QUEUE_OK:成功* 全局变量: 无* 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL*/uint8 QueueCreate( void *Buf, uint32 SizeOfBuf, uint16 BytesPerRec,uint8 (* ReadEmpty)(), uint8 (* WriteFull)() ) DataQueue *Queue; if (Buf != NULL & SizeOfBuf = (sizeof(DataQueue) /* 判断参数是否有效 */ Queue = (DataQueue *)Buf; /* 初始化结构体数据 */ OS_ENTER_CRITICAL(); Queue-nMaxRecNum = (SizeOfBuf - (uint32)(DataQueue *)0)-Buf) / BytesPerRec; /* 计算队列可以存储的记录数目 */ Queue-pEnd = Queue-Buf + Queue-nMaxRecNum * BytesPerRec; /* 计算数据缓冲的结束地址 */ Queue-pOut = Queue-Buf; Queue-pIn = Queue-Buf; Queue-nRecNum = 0; Queue-nBytesPerRec = BytesPerRec; Queue-ReadEmpty = ReadEmpty; Queue-WriteFull = WriteFull; OS_EXIT_CRITICAL(); return QUEUE_OK; else return NOT_OK; /* 函数名称: QueueRead* 功能描述: 获取队列中的数据* 输 入: pRet:存储返回的记录数据的地址* Buf:指向队列的指针* 输 出: NOT_OK :参数错误* QUEUE_OK :收到消息* QUEUE_EMPTY:无消息* 全局变量: 无* 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL*/uint8 QueueRead(uint8 *pRet, void *Buf) uint8 err; uint16 i; DataQueue *Queue; err = NOT_OK; if (Buf != NULL) /* 队列是否有效 */ /* 有效 */ Queue = (DataQueue *)Buf; OS_ENTER_CRITICAL(); if (Queue-nRecNum 0) /* 队列是否为空 */ /* 不空 */ for( i = 0; i nBytesPerRec; i+ ) *pRet+ = *Queue-pOut+; /* 数据出队 */ /* 调整出队指针 */ if (Queue-pOut = Queue-pEnd) Queue-pOut = Queue-Buf; Queue-nRecNum-; /* 数据减少*/ err = QUEUE_OK; else /* 空 */ err = QUEUE_EMPTY; if (Queue-ReadEmpty != NULL) /* 调用用户处理函数 */ err = Queue-ReadEmpty(pRet, Queue); OS_EXIT_CRITICAL(); return err;/* 函数名称: QueueWrite* 功能描述: FIFO方式发送数据* 输 入: Buf :指向队列的指针* pRec:写入记录的首地址* 输 出: NOT_OK :参数错误* QUEUE_FULL:队列满* QUEUE_OK :发送成功* 全局变量: 无* 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL*/uint8 QueueWrite(void *Buf, uint8* pRec) uint8 err; uint16 i; DataQueue *Queue; err = NOT_OK; if (Buf != NULL) /* 队列是否有效 */ Queue = (DataQueue *)Buf; OS_ENTER_CRITICAL(); if (Queue-nRecNum nMaxRecNum) /* 队列是否满 */ /* 不满 */ for( i = 0; i nBytesPerRec; i+ ) *Queue-pIn+ = *pRec+; /* 数据入队 */ /* 调整入队指针 */ if (Queue-pIn = Queue-pEnd) Queue-pIn = Queue-Buf; Queue-nRecNum+; /* 数据增加 */ err = QUEUE_OK; else /* 满 */ err = QUEUE_FULL; if (Queue-WriteFull != NULL) /* 调用用户处理函数 */ err = Queue-WriteFull(Queue, *pRec, Q_WRITE_MODE); OS_EXIT_CRITICAL(); return err;/* 函数名称: QueueWriteFront* 功能描述: LIFO方式发送数据* 输 入: Buf:指向队列的指针* pRec:写入记录的首地址* 输 出: QUEUE_FULL:队列满* QUEUE_OK:发送成功* 全局变量: 无* 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL*/uint8 QueueWriteFront(void *Buf, uint8 *pRec) uint8 err; uint16 i; DataQueue *Queue; err = NOT_OK; if (Buf != NULL) /* 队列是否有效 */ Queue = (DataQueue *)Buf; OS_ENTER_CRITICAL(); if (Queue-nRecNum nMaxRecNum) /* 队列是否满 */ /* 不满 */ Queue-pOut-; /* 调整出队指针 */ if (Queue-pOut Buf) Queue-pOut = Queue-pEnd - 1; for( i = 0; i nBytesPerRec; i+ ) /* 不满 */ *Queue-pOut- = *( pRec + Queue-nBytesPerRec - 1 - i ); /* 数据入队 */ Queue-pOut+; Queue-nRecNum+; /* 数据数目增加 */ err = QUEUE_OK; else /* 满 */ err = QUEUE_FULL; if (Queue-WriteFull != NULL) /* 调用用户处理函数 */ err = Queue-WriteFull(Queue, *pRec, Q_WRITE_FRONT_MODE); OS_EXIT_CRITICAL(); return err;/* 函数名称: QueueRecNum* 功能描述: 取得队列中记录数* 输 入: Buf:指向队列的指针* 输 出: 消息数* 全局变量: 无* 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL*/uint16 QueueRecNum(void *Buf) uint16 temp; temp = 0; /* 队

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论