内存乒乓缓存机制和消息分发机制的C代码实现
用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
- 2020-12-03下载
- 积分:1
一种改进的TOA——AOA混合定位算法
混合定位中很不错的一篇文章,看过之后很受启发在TOA和AOA误差服从零均值的高斯分布时,以上⑧无AOAQ阵中AOATOA/AOA混合定位算法的克拉美一罗下界(CRLB)为:校准离差取rP=(GQG)90Q阵中AOA校准离差取(x-x1)/其中:G=(x-x r(y-m)/r(19)洲6050(x)2(+(y-y))(x-x)(+(y-y)0.020.040.060080.100.12(x-x1)AOA标准离差(stda,单位radx-图1都市环境中算法性能比较3仿真与分析为了检验和比较算法在实际蜂窝网络信道环境中的定位性能,假定在一蜂窝网络中,小区半径为2500m,参与TOA测量的BS为服务BS和4个相邻的BS,其位置坐标分别为(0,0),(4330,2500),(4330,2500),(0,5000),(-4330,2500)。假定由测量系统造成的TOA测量误差服从均值为0,方差为30米的高斯分布,信道环境造成的NIOS误差满是TP1.5信道模型14,服务BS始终能够提供AOA,AOA测量误差服从均值为0和一定标准差的高斯分布。图1为都市环境中假定只有服务BS能视距(LOS)传播时,MS在服务小区内均匀分布,在不同AOA标准差下算法定位误差在125m内的概率。图中可见,Q矩阵中σα的取值对算法定位性能有很大影响,在AOA标准差较小时用TOA测量值η近似替代σa能取得更好的定位性能,这是由于WLS算法采用了Q阵加权。此外,120只要AOA测量值达到一定精度(标准差小于一定值),采用10-10A-A0A00TOAAOA混合定位法就能取得比单纯TOA定位更好的性能。图29080为乡村环境中在不同AOA标准差下,由单纯TOA及 TOA/AOA70定位法(Q矩阵中取n=r)得到的由均方根误差(RMSE)表示的定位性能。由图2可见,乡村环境中由于TOA测量精度较高,30对AOA的精度要求也高。只有当AOA标准差更小(小于10-3)AOA标准离差(og)时,混合定位算法才能取得比单纯TOA定位更好的性能。图2乡村环境中算法性能比较为了检验MS与服务BS距离对算法定位性能的影响,在一般都市环境中可以假定MS位于与服务BS具有不同距离的两个位置(1200,0)和(2400,0)分别进行定位估计,五个BS具有非视距TOA测量值的概率分别为:0、0.2、04、0.6、0.8、1,服务BS能够提供的AOA测量误差分别服从均值为0,标准差为01、0.0lrad的高斯分布,Q矩阵中用r近似替代σn,对每个位置在每种条件下分别进行100次测量,算法在无AOA及具有两种标准差的AOA时的定位结果(RMSE)如图3、4所示仿真结果表明:AOA参与卜AOA标准离差=001AOA标准离差=0,01定位只有在AOA本身误差不大AOA标准离差=0.1AOA标准离差=0.1无AOA无AOA的情况下,才能对定位性能有改200善;如果AOA本身误差增大150则对TOA定位结果并不会有改l00善;MS距离服务BS越近,则50采用混合定位算法的效果越好。00.00.204060.810000.20.40.608104结论BS非视距概率Bs非视距概率图3个同标准差时算法图4不同标准差时算法本文的分析和仿真结果表性能比较(1200,0)性能比较(2400,0)明,只要服务BS提供的AOA测量值达到一定精度,合理选择Q矩阵中AOA标准差取值,本文提出的 TOA/AOA混合定位算法就o1994-2012ChinaAcademicJournalElectronicPUblishingHouseAllrightsreservedhttp:/www.cnki.neto1994-2012ChinaAcademicJournalElectronicPUblishingHouseAllrightsreservedhttp:/www.cnki.net
- 2020-12-02下载
- 积分:1