buffer stream FIFO
来源:互联网 发布:java 解压缩 编辑:程序博客网 时间:2024/05/16 19:41
class buffer_stream{
public:
unsigned char * buf;
int len;
buffer_stream(unsigned char * buf_in,int len_in)
{
buf= new unsigned char [len_in];
memcpy(buf,buf_in,len_in);
len=len_in;
//cout << "buffer_stream buf="<< std::hex<<(int)buf<<"len="<<len<<endl;
}
buffer_stream(const buffer_stream & c)
{
buf =new unsigned char [c.len];
memcpy(buf,c.buf,c.len);
len =c.len;
}
buffer_stream & buffer_stream::operator=(const buffer_stream & v){
if(buf)
delete [] buf;
len=vd.len;
buf=new unsigned char [len];
memcpy(buf,v.buf,len);
return *this;
}
~buffer_stream()
{
//cout << "~buffer_stream buf="<<std::hex<<(int)buf<<"len="<<len<<endl;
if(buf)
delete [] buf;
}
void read_realloc(int read_len)
{
if(read_len >len)
return;
else
{
unsigned char * buf_left=new unsigned char [len-read_len];
memcpy(buf_left,buf+read_len,len-read_len);
delete [] buf;
buf= buf_left;
len=len-read_len;
}
}
};
typedef std::queue<buffer_stream> buffer_stream_q;
buffer_stream_q g_buf_send_q;
buffer_stream_q g_buf_recv_q;
//////////////////////////////////////////////////////////////////////////////////////////
void data_capture_thread_proc()
{
while(!bExit){
... //capture data into buf
EnterCriticalSection(&cs_r);
buffer_stream bs((unsigned char *)buf,rVal);
g_buf_recv_q.push(bs);
//cout << " recv queue size="<< g_buf_recv_q.size()<<endl;
LeaveCriticalSection(&cs_r);
...
}
}
void data_send_thread_proc()
{
while (!bExit){
...
wait_for_sendevent();
EnterCriticalSection(&cs_s);
buffer_stream & bs= g_buf_send_q.front();
send(); //to hardware
g_buf_send_q.pop();
LeaveCriticalSection(&cs_s);
}
}
//////////////////////////////////////////////////////////////////////////////////////////
int recv_api(unsigned char * buf, int len)
{
int retVal=0;
EnterCriticalSection(&cs_r);
if(g_buf_recv_q.empty())
retVal=0;
else
{
buffer_stream & bs=g_buf_recv_q.front(); // access the first item
if(bs.len>len)
{
memcpy(buf,bs.buf,len);
bs.read_realloc(len);
retVal= len;
//cout << "recv queue read_realloc size="<< g_buf_recv_q.size()<<endl;
}else
{
memcpy(buf,bs.buf,bs.len);
retVal= bs.len;
//cout << "recv queue size="<< g_buf_recv_q.size()<<endl;
g_buf_recv_q.pop();
}
}
LeaveCriticalSection(&cs_r);
//cout << "port_recv -- "<<retVal<<endl;
return retVal;
}
void send_api(unsigned char * buf, int len)
{
buffer_stream bs(buf,len);
EnterCriticalSection(&cs_s);
g_buf_send_q.push(bs); //add a item at the end
SetEvent(port_send_event);
LeaveCriticalSection(&cs_s);
}
- buffer stream FIFO
- AXI4 STREAM DATA FIFO
- stream buffer原理
- Stream和Buffer
- 5.4 Stream Buffer
- buffer和FIFO的区别
- Xilinx AXI4-Stream-FIFO 使用提示
- axi stream FIFO缓存的问题
- 【算法】用固定数组实现FIFO buffer
- Node Buffer/Stream 内存策略分析
- Node入门--8-->Buffer&Stream
- 学习笔记20151211——AXI4 STREAM DATA FIFO
- FIFO
- FIFO
- fifo
- FIFO
- FIFO
- fifo
- Elevate through ShellExecute or Elevate through manifest
- 设置对话框所有控件字体为同一字体的简单方法
- 发送消息执行记事本的“另存为”菜单功能
- Lua 5.1 参考手册
- FormatMessage 查看出错原因
- buffer stream FIFO
- 如何开好一个论坛
- 一个层被另外一个层遮盖的问题
- 面试遇到的两道算法题
- “The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit” 的我之解決辦法
- Struts 2是什么?
- HSL和HSV色彩空间和rgb的互转
- 缓存导致水晶报表无法导出、打印
- 项目经理、系统架构师或技术骨干应该具备的水平