pvMsglq>greadg->gread=((q->gread+1)%TIMEWEIGHT_TASKQUEUE_SIZE)/*解锁return(pmSg);PushapmSgpacketontoapvMsgpacketqueue@parampisthepmsgtopushontothepacketqueue@paramgisthepacketqueue.W@return0ifsuccessful,-1ifqisfullntTWTMsgSend(TtWTMSg*p,TTWTMSGQUEUE*qintret/if(!TWT_QUEUEFULL(al)iThequeueisntfullsoweaddthenewframeatthecurrentwwritepositionandmovethewritepointer.g->pvMsgla->write]=pg->write=((q->qwrite+1)%TIMEWEIGHTTASKQUEUESIZE;ret=oThestackisfullsowearethrowingawaythisvalue.Keeptrackofthenumberoftimesthishappensg->overflow++ret=-1://*解锁return(ret)**米**米来米***来米*半米*米*半米*米求***半*米米求半**米求半**半求半和*米*//消息分发机制//*算法是//*正常返回0,出错返回-1水米米******水*米*水**米*半*水米米冰半**水水*水米米半米冰水*米水水*水*米水水externintRecToFileMsgProc(T_MSG_REC2FILE*ptMsg);intDispatchMsg(TTWTMSG*ptMsgitif(NULl=ptMsggotoErrRet/*dispatchmsg*/switch(ptMsg->enMsgType)caseTWTPINgPoNgBuffrecRecToFileMsgProcl(TMSG_REC2FE)(pmSg->pMsg);/*处理消息*/destroyMsg(pmSg;/*消毁消息breakdefault.printf("DispatchMsgMsgtypeError!n")break.return0ErrRetprintf("DispatchMsgFail!";return-1./*buffsize*/#defineP|NGPONG_BUFFBSIZE0X20000//10*1024*1024/*10M*/*pingpongbuff*///chargacPINGBUFF[PINGPONGBUFFBSIZE];/*PingBuff*///chargacPONGBUFF[PINGPONG_BUFFBSIZE]*PongBuff*/水米米*********米*水**米*半*水米米水**冰水*水米米半半水半米冰水*米水水*水*米米//*释放pingpongbuff/必然成功//*无返回木***木*水****本**水*水水*水****本水**水水****水水***本***米*水voidDestroyPingPongButt(TPINGPONGBUFFUSEDESptPingPongButt)nLoopif(NULL=ptPingpongbuffreturnfor(nLoop=0;nLooptIngBuffUse[nLoop].pcHeadAddr)free(ptPingPong->tPingBuffUse[nLoop].pcHeadAddr)free(ptPingpongBuff)/初始化pingpongbuff返回pignpongbuff的描述指针//*正常返回0,出错返回-1水水水水水水水水水木水木水水水水水木水木水水水水水水水水本水水水水水水水水水本水水水水水水水水水水水水水TPINGPONGBUFFUSEDESInitPingPongBuff(unsignedintnBuffSizeTPINGPONGBUFFUSEDES*ptBuffDes=NULLintnLoop/*获取buf描述*ifNULL==(ptBuffDes=malloc(sizeof(TPINGPONGBUFFUSEDES))))gotoErrRetmemset(ptBuffDes,0,sizeof(T_PINGPONGBUFFUSE_DES));/*分别初始化ping和pong*/for(nLoop=0;nLooptIngBuffUsenLooppcHeadAddr=mallocnBuffSize))gotoErrRet;ptBuffDes->tIngBuffUselnLoop]nBuffSizenBuffsizeptBuffDes->tPingBuffUse[nLoop].oFfsetptBuffDes->tPingBuffUsenLoop)eUseStatus-=BUFFWRITEABLE;ptBuffDes->eCurUseIDBUFFPINGreturnptBuffDesErrretprintf("lnitPingPongBuffFail!");DestroyIngPongBuff(ptBuffDes)turnnull平**米**米*米***来米米*米*米*半米*米米米来*半米平**米米求*来*半求半来*米求*和*米*/*Resetpingpongbuff//*正常返回0,出错返回-1米米米米水冰米*米米水**米米冰*米水米米米米水米水*水米米来米米x米来米米水冰来来宋来水米来米来冰#defineResetBuffUse(ptBuffuse)ptBuffUse->oFfset0ptBuffUse->eUseStatusBUFFWRITEABLEgenerateafilerecmsg*正常返回消息体的指针,异常返回NULLT_MSG_REC2lGKSenFRMSB(T_BUFF_USE_DES*ptBuffUse,REC_FILE_DESLIST*ptFileListRTMSGREC2FILEKE*ptRFMsg=NULL;if(NULL==(ptRFMsgmalloc(sizeof(T_MSGREC2FILE)returnnUllptRFMsg->ptBuffUseptBuffUseptRFMsg->ptFilelistptFilelist;returnptRFMsg-IMDN开发者社群-imdn.cn"> pvMsglq>greadg->gread=((q->gread+1)%TIMEWEIGHT_TASKQUEUE_SIZE)/*解锁return(pmSg);PushapmSgpacketontoapvMsgpacketqueue@parampisthepmsgtopushontothepacketqueue@paramgisthepacketqueue.W@return0ifsuccessful,-1ifqisfullntTWTMsgSend(TtWTMSg*p,TTWTMSGQUEUE*qintret/if(!TWT_QUEUEFULL(al)iThequeueisntfullsoweaddthenewframeatthecurrentwwritepositionandmovethewritepointer.g->pvMsgla->write]=pg->write=((q->qwrite+1)%TIMEWEIGHTTASKQUEUESIZE;ret=oThestackisfullsowearethrowingawaythisvalue.Keeptrackofthenumberoftimesthishappensg->overflow++ret=-1://*解锁return(ret)**米**米来米***来米*半米*米*半米*米求***半*米米求半**米求半**半求半和*米*//消息分发机制//*算法是//*正常返回0,出错返回-1水米米******水*米*水**米*半*水米米冰半**水水*水米米半米冰水*米水水*水*米水水externintRecToFileMsgProc(T_MSG_REC2FILE*ptMsg);intDispatchMsg(TTWTMSG*ptMsgitif(NULl=ptMsggotoErrRet/*dispatchmsg*/switch(ptMsg->enMsgType)caseTWTPINgPoNgBuffrecRecToFileMsgProcl(TMSG_REC2FE)(pmSg->pMsg);/*处理消息*/destroyMsg(pmSg;/*消毁消息breakdefault.printf("DispatchMsgMsgtypeError!n")break.return0ErrRetprintf("DispatchMsgFail!";return-1./*buffsize*/#defineP|NGPONG_BUFFBSIZE0X20000//10*1024*1024/*10M*/*pingpongbuff*///chargacPINGBUFF[PINGPONGBUFFBSIZE];/*PingBuff*///chargacPONGBUFF[PINGPONG_BUFFBSIZE]*PongBuff*/水米米*********米*水**米*半*水米米水**冰水*水米米半半水半米冰水*米水水*水*米米//*释放pingpongbuff/必然成功//*无返回木***木*水****本**水*水水*水****本水**水水****水水***本***米*水voidDestroyPingPongButt(TPINGPONGBUFFUSEDESptPingPongButt)nLoopif(NULL=ptPingpongbuffreturnfor(nLoop=0;nLooptIngBuffUse[nLoop].pcHeadAddr)free(ptPingPong->tPingBuffUse[nLoop].pcHeadAddr)free(ptPingpongBuff)/初始化pingpongbuff返回pignpongbuff的描述指针//*正常返回0,出错返回-1水水水水水水水水水木水木水水水水水木水木水水水水水水水水本水水水水水水水水水本水水水水水水水水水水水水水TPINGPONGBUFFUSEDESInitPingPongBuff(unsignedintnBuffSizeTPINGPONGBUFFUSEDES*ptBuffDes=NULLintnLoop/*获取buf描述*ifNULL==(ptBuffDes=malloc(sizeof(TPINGPONGBUFFUSEDES))))gotoErrRetmemset(ptBuffDes,0,sizeof(T_PINGPONGBUFFUSE_DES));/*分别初始化ping和pong*/for(nLoop=0;nLooptIngBuffUsenLooppcHeadAddr=mallocnBuffSize))gotoErrRet;ptBuffDes->tIngBuffUselnLoop]nBuffSizenBuffsizeptBuffDes->tPingBuffUse[nLoop].oFfsetptBuffDes->tPingBuffUsenLoop)eUseStatus-=BUFFWRITEABLE;ptBuffDes->eCurUseIDBUFFPINGreturnptBuffDesErrretprintf("lnitPingPongBuffFail!");DestroyIngPongBuff(ptBuffDes)turnnull平**米**米*米***来米米*米*米*半米*米米米来*半米平**米米求*来*半求半来*米求*和*米*/*Resetpingpongbuff//*正常返回0,出错返回-1米米米米水冰米*米米水**米米冰*米水米米米米水米水*水米米来米米x米来米米水冰来来宋来水米来米来冰#defineResetBuffUse(ptBuffuse)ptBuffUse->oFfset0ptBuffUse->eUseStatusBUFFWRITEABLEgenerateafilerecmsg*正常返回消息体的指针,异常返回NULLT_MSG_REC2lGKSenFRMSB(T_BUFF_USE_DES*ptBuffUse,REC_FILE_DESLIST*ptFileListRTMSGREC2FILEKE*ptRFMsg=NULL;if(NULL==(ptRFMsgmalloc(sizeof(T_MSGREC2FILE)returnnUllptRFMsg->ptBuffUseptBuffUseptRFMsg->ptFilelistptFilelist;returnptRFMsg - IMDN开发者社群-imdn.cn">
登录
首页 » Others » 内存乒乓缓存机制和消息分发机制的C代码实现

内存乒乓缓存机制和消息分发机制的C代码实现

于 2020-12-03 发布
0 299
下载积分: 1 下载次数: 0

代码说明:

用C代码实现乒乓内存缓冲机制,具体实用价值,帮助您提高内存响应速度与及时数据的处理。unsigned long writeunsigned long greadunsigned long overflowST TWTMSG QUEUE:/ Helper macros for accessing Msg queues. *#define tWt QUEUE EMPty(a)(((g->write==(q)->gread)? 1: 0)#define twt_ QUeUe full(a)(((((q)->qwrite +1% TIMEWEIGHT TASKQUEUE SIZED)==(q)->gread)?1: 0)米 generate a Msg entity*正常返回消息体的指针,异常返回NULLT TWTMSG* generateMsg(tT-TWTMSG* pmSg=nULL,if(NULL =-(ptMsg malloc(sizeof(T TWTMSG)))return NULL;memset(ptMsg, 0, sizeof(T TWTMSG)return pmSg;destroy a Msgvoid destroy Msg(t TWTMSG ptMsgif(NULL ptMsg->pfDestroyMsg)pt Msg->pfDestroy Msg(ptMsg->pvMsg)if (NULL != pt Msg)free(pmSgfree a Msg Queuevoid freeTWTMsg Que(T TWTMSG QUEUE* ptMsgQif(NULL =ptMsg Afree(ptMsg Q);Init a Msg QT TWTMSG QUEUE* initTWTMsg QueoT TWTMSG QUEUE pmSg Q= NULlif (NULL ==(ptMsgQ malloc(sizeof(T_ TWTMSG QUeue)goto ErrRetmemset(ptMsgQ, 0, sizeof(T TWTMSG QUEUE))return pmSg Q;Errretprintf( initTWTMsg Que Fail! ")freeTWTMsgQue(ptMsg Q)return nullPop a pvMsg packet from a msg packet queues param g is the packet queue from which to pop the pbuf@return pointer to pvMsg packet if available, NULl otherwiseT TWTMSG* TWTMsg Get(T_ TWTMSG QUEUE aT TWTMSG*//*加锁if(TWT_ QUEUE_ EMPTY(a))iReturn a NUll pointer if the queue is emptypmSg=NULL;else is The queue is not empty so return the next frame from itand adjust the read pointer accordinglypmSg=g->pvMsglq >greadg->gread =((q->gread +1)% TIMEWEIGHT_TASKQUEUE_ SIZE)/*解锁return(pmSg);Push a pmSg packet onto a pvMsg packet queue@param p is the pmsg to push onto the packet queue@param g is the packet queue.W @return 0 if successful, -1 if q is fullnt TWTMsg Send(T tWTMSg*p, T TWTMSG QUEUE *qint ret/if(!TWT_ QUEUE FULL(al)iThe queue isn t full so we add the new frame at the currentw write position and move the write pointer.g->pvMsgla->write]=pg- >write =((q->qwrite+1)% TIMEWEIGHT TASKQUEUE SIZE;ret =oThe stack is full so we are throwing away this value. Keep trackof the number of times this happensg->overflow++ret =-1://*解锁return(ret)**米**米来米***来米*半米*米*半米*米求***半*米米求半**米求半**半求半和*米*//消息分发机制//*算法是//*正常返回0,出错返回-1水米米******水*米*水**米*半*水米米冰半**水水*水米米半米冰水*米水水*水*米水水extern int RecToFile MsgProc(T_ MSG_ REC2 FILE* ptMsg);int DispatchMsg(T TWTMSG *ptMsgitif(NULl = ptMsg goto ErrRet/*dispatch msg*/switch(ptMsg->en Msg Type)case TWT PINgPoNgBuff recRecTo File Msg Procl(TMSG_REC2FE) (pmSg->pMsg);/*处理消息*/destroy Msg( pmSg;/*消毁消息breakdefault.printf("Dispatch Msg Msgtype Error! n")break.return 0ErrRetprintf("Dispatch Msg Fail! ";return-1./*buff size*/#defineP| NGPONG_ BUFF BSIZE0X20000//10*1024*1024/*10M*/*ping pong buff*///chargacPINGBUFF[PINGPONG BUFF BSIZE]; /* Ping Buff*///chargacPONGBUFF[PINGPONG_ BUFF BSIZE] *Pong Buff*/水米米*********米*水**米*半*水米米水**冰水*水米米半半水半米冰水*米水水*水*米米//*释放 ping pong buff/必然成功//*无返回木***木*水****本**水*水水*水****本水**水水****水水***本***米*水void Destroy Ping Pong Butt(T PINGPONGBUFF USE DES ptPing Pong Butt)nLoopif (NULL = pt Ping pong buffreturnfor (nLoop=0; nLooptIng BuffUse[nLoop]. pcHeadAddr)free(ptPing Pong ->t Ping BuffUse[nLoop]. pcHeadAddr)free(pt Ping pong Buff)/初始化 ping pong buff返回 pign pong buff的描述指针//*正常返回0,出错返回-1水水水水水水水水水木水木水水水水水木水木水水水水水水水水本水水水水水水水水水本水水水水水水水水水水水水水T PINGPONGBUFF USE DES InitPing Pong Buff(unsigned int n BuffSizeT PINGPONGBUFF USE DES* ptBuffDes=NULLintnLoop/*获取buf描述*if NULL==(ptBuffDes=malloc(sizeof(T PINGPONGBUFF USE DES))))goto ErrRetmemset(pt BuffDes, 0, sizeof(T_PINGPONGBUFF USE_ DES));/*分别初始化ping和pong*/for(nLoop=0; nLooptIng BuffUsenLoop pcHeadAddr =malloc n BuffSize))goto Err Ret;ptBuffDes->tIng BuffUselnLoop] nBuffSize nBuffsizeptBuffDes->tPing BuffUse[nLoop]. oFfsetptBuffDes->tPing BuffUsenLoop) eUseStatus-=BUFF WRITEABLE;pt BuffDes->eCurUseIDBUFF PINGreturn pt BuffDesErrretprintf("lnitPing Pong Buff Fail!");DestroyIng Pong Buff(pt BuffDes)turn null平**米**米*米***来米米*米*米*半米*米米米来*半米平**米米求*来*半求半来*米求*和*米*/*Reset ping pong buff//*正常返回0,出错返回-1米米米米水冰米*米米水**米米冰*米水米米米米水米水*水米米来米米x米来米米水冰来来宋来水米来米来冰#define ResetBuffUse(ptBuffuse)pt BuffUse->oFfset0pt BuffUse->eUseStatus BUFF WRITEABLEgenerate a file rec msg*正常返回消息体的指针,异常返回NULLT_MSG_REC2lGK SenFRMSB(T_BUFF_USE_DES *ptBuffUse, REC_FILE_DESLIST *ptFileListRT MSG REC2FILE KE* ptRFMsg= NULL;if(NULL ==(ptRFMsg malloc(sizeof(T_ MSG REC2 FILE)return nUllptRFMsg- >pt BuffUse pt BuffUseptRFMsg->pt Filelist ptFilelist;return ptRFMsg

下载说明:请别用迅雷下载,失败请重下,重下不扣分!

发表评论

0 个回复

  • 基于emd分解特性的阈值去噪算法
    这是最新的emd去噪的程序,并且有和小波去噪的比较。采用的是符合emd分解特性的阈值去噪方法。
    2020-11-01下载
    积分:1
  • 车牌识别的matlab
    基于matlab的车牌识别的源程序(可以实现),其中包括车牌定位,车牌矫正,字符分割,字符识别4部分。还有已训练好的BP神经网络用于字符识别。
    2021-05-07下载
    积分:1
  • 易语言写的邮件服务器 源码 是服务器
    需要你的本地计算机有stmp域名解析支持 否则收不到数据根据stmp 协议写的我测试了 能用
    2020-11-30下载
    积分:1
  • fpga实现基于verilog语言的4fsk调制解调
    设计一个基于开发板的通信系统,要求在给定的开发板DE10-Lite上,完成以下任务:1) 完成数模转换、四进制调制解调(fsk);2) 载波是正弦波,频率硬件可调。
    2020-11-27下载
    积分:1
  • COM组件写和使用示例
    代码原封不动摘自《COM技术内幕》,只不过从MAKEFILE转为vs2008实现。vs2008包含两个工程:Com工程,创建Com组件; Client工程,使用Com组件Client目录: 示例如何使用COM组件Com目录: 示例如何创建COM组件Debug目录: REGISTER.BAT 注册com组件 UnREGISTER.BAT 反注册Com组件 Client.exe示例如何使用Com组件 Cmpnt.dll手动编写的Com组件
    2020-12-01下载
    积分:1
  • 四旋翼matlab/simulink
    简单的PID控制四旋翼飞行器,姿态采用PID控制,内有四旋翼模型,电机模型
    2020-12-06下载
    积分:1
  • 基于DDE通信的MATLAB与组态王之间的数据传送
    动态数据交换DDE(Dynamic Data Exchange)是在Windows平台上不同应用程序之间共享数据的一个通信协议,DDE技术使用共享内存来实现应用程序之间实时交换数据和发送指令,以及使用DDE协议获得传递数据的同步。因此可以通过DDE协议将组态王与MATLAB结合起来。
    2020-12-02下载
    积分:1
  • 混沌logistic的matlab仿真
    运用matlab仿真出logistic混沌的混沌图像
    2020-12-11下载
    积分:1
  • opencv双目视觉棋盘格标定,特征匹配点,三维坐标计算
    根据官方例程进行改变。进行三角测量的两种方法进行三维坐标计算,非全图三维重建,是特征点,这里使用的是棋盘格角点作为匹配点
    2020-11-30下载
    积分:1
  • 雷达杂波伽马分布模拟
    matlab程序,随机生成满足伽马分布的雷达杂波信号,并与理论PDF及CDF对比
    2020-12-09下载
    积分:1
  • 696516资源总数
  • 106914会员总数
  • 0今日下载