一种超简单的消息队列实现C语言

北京中科白癜风医院助力健康中国 http://www.jydxy.com/

最近在做一款lorawan网关产品时,需要用到消息队列,就按自己的思路写了一套函数,实现比较简单轻量,程序猿一看便能理解,现在贴出来给做做开发的朋友分享。技术讨论,欢迎加QQ技术群

#defineADV_DATA_DEPTH16#defineADV_DATA_LENGTH_MAX65

//结构体声明typedefstruct{U8ucHeadPtr;//头指针U8  ucTailPtr;    //尾指针U8ucAdvData[ADV_DATA_DEPTH][ADV_DATA_LENGTH_MAX];}ADV_DATA_LIST;

ADV_DATA_LISTstAdvDataList;

//清消息队列voidAdv_Data_Clear(void){stAdvDataList.ucHeadPtr=stAdvDataList.ucTailPtr=0;}

//获取队列长度U8Adv_Data_GetLength(){U8ucLen=0;if((stAdvDataList.ucHeadPtr=ADV_DATA_DEPTH)

(stAdvDataList.ucTailPtr=ADV_DATA_DEPTH))Adv_Data_Clear();if(stAdvDataList.ucTailPtr=stAdvDataList.ucHeadPtr)ucLen=stAdvDataList.ucTailPtr-stAdvDataList.ucHeadPtr;elseucLen=stAdvDataList.ucTailPtr+ADV_DATA_DEPTH-stAdvDataList.ucHeadPtr;returnucLen;}

//往队列里添加消息U8Adv_Data_Fill(U8*buf,U8length){U8ucLen=0;ucLen=Adv_Data_GetLength();if(ucLen=ADV_DATA_DEPTH-1)  //满{return0;}if(length(ADV_DATA_LENGTH_MAX-1))length=(ADV_DATA_LENGTH_MAX-1);stAdvDataList.ucAdvData[stAdvDataList.ucTailPtr][0]=length;for(ucLen=0;ucLenlength;ucLen++)stAdvDataList.ucAdvData[stAdvDataList.ucTailPtr][1+ucLen]=buf[ucLen];

stAdvDataList.ucTailPtr++;if(stAdvDataList.ucTailPtr=ADV_DATA_DEPTH)stAdvDataList.ucTailPtr=0;

return1;}

//从队列获取消息U8Adv_Data_Get(U8*buf,U8*length){U8ucLen=0,temp8;ucLen=Adv_Data_GetLength();if(ucLen==0)  //空{return0;}*length=stAdvDataList.ucAdvData[stAdvDataList.ucHeadPtr][0];ucLen=*length;for(temp8=0;temp8ucLen;temp8++)buf[temp8]=stAdvDataList.ucAdvData[stAdvDataList.ucHeadPtr][1+temp8];stAdvDataList.ucHeadPtr++;if(stAdvDataList.ucHeadPtr=ADV_DATA_DEPTH)stAdvDataList.ucHeadPtr=0;return1;}

//使用方法voidmain(void){Adv_Data_Clear();while(1){Adv_Data_Fill(…);…Adv_Data_Get(…);}}

专注物联网相关领域研究与开发,分享热门物联网技术研究心得,如MESH自组网技术,LORA/LORAWAN组网技术。希望通过这个平台结识这个领域的支持朋友,共同成长。欢迎加QQ技术群,在线交流。




转载请注明:http://www.aierlanlan.com/tzrz/4890.html