下面是本人寫的環形快取區,請高手指正、優化,大家一起交流。
#definedata_size512//協議最長幀位元組數*2+若干位元組
#defineframe_headerlength5//幀頭長度
#definedata_longth_location13//定義資料位置長度,計算方法:資料域長度+固定位元組長度
#definefixed_byte_length16//定義資料位置長度,計算方法:資料域長度+固定位元組長度
unsigned char frame_headerdata[frame_headerlength]=[0xfe,0xfe,0xfe,0xfe,0x68];//針頭資料
unsigned char rxd_data[data_size];//接收快取區
unsigned shortrealtime_datalength;//實時資料接收長度
unsigned shortcontinuouslyreceive_datalength;//本幀內連續接收資料長度
unsigned shortframe_datalength;//本幀位元組長度
unsigned shortpbuffer_stored;//本次存入快取區位址,本次接收資料存入接收快取區位址,一幀可能分好多次接收
unsigned shortpframe_stored;//本幀在快取區位址,查詢針頭開始位址
unsigned shortpframe_header;//本幀針頭在快取區位址
unsigned charframe_headerflag;//找到幀頭標誌
unsigned charframe_startflag;//幀開始接收標誌,即本幀第乙個資料接收標誌
void init(void)
void read_buffer(byte * buff,dword m_datalength)
for(i=0;i
*(pbuffer_stored+i)=buff[i];
}pbuffer_stored+=i;
if(pbuffer_stored>=rxd_data+data_size)//防止記憶體越界
continuouslyreceive_datalength+=m_datalength;//記錄連續接收資料長度
if(frame_headerflag==0x00)//防止重複查詢
}if(i!=continuouslyreceive_datalength+1-frame_headerlength)//找到針頭
else}}
else
else
if(temporary_variables>=data_longth_location)}}
}void data_analysis(dword m_datalength)
//*****定時器*******//
void ontimer(uint nidevent)
環形快取區(redux saga應用例項)
環形緩衝器 ringr buffer 也稱作圓形佇列 circular queue 迴圈緩衝區 cyclic buffer 圓形緩衝區 circula buffer 是一種用於表示乙個固定尺寸 頭尾相連的緩衝區的資料結構,適合快取資料流。實現例項 這裡定義圓形快取器 function ringbuf...
C 環形快取區的實現
簡單介紹 環形緩衝區就是在最開始的時候申請乙個大buffer,有乙個讀指標,乙個寫指標,隨著資料寫入和讀取改變讀寫指標,具體分為三總情況 1 是讀寫速度差不多,這種情況比較簡單。3 就是讀速度快,這種情況也比較簡單,直接返回即可。下面我們來分析一下我的具體讀寫 buffer的大小根據讀寫指標的快慢合...
Springboot cache快取原始碼解析
key 指定快取的key的值,不指定預設使用方法引數的值 cacheput 在目標方法之後呼叫,將返回結果新增到快取中 cacheable 首先查詢快取,生成keygenerator cacheevict 刪除快取,可以設定在呼叫方法前後執行 以上3個方法一般都加在service層的黨法上 快取服務...