zoukankan      html  css  js  c++  java
  • 以帧为存储单位的循环stack

    此stack主要是作为存储空间使用,主要的借口就是push和pop。

    stack frame的src以及例程位于stack_FrameTest这个库当中,其中有readme文件,可以快速上手。

    stack构造及代码实现

    其中我对stack以及frame的构造的代码如下:

    typedef struct Frame
    {
    	uint8_t frame_len;//帧的字节数
    	uint8_t frame_data[MAX_TRANSMISSION_UINT];//一帧数据最大为MAX_TRANSMISSION_UINT字节
    }Frame;
    
    typedef struct STACK
    {
    	int8_t frame_lastNum;//最新的帧的序号
    	uint8_t frame_count;//stack中未取出的帧的个数
    	Frame frame_info[MAX_STACK_FRAME_NUM];//stack中最多允许存储MAX_STACK_FRAME_NUM个帧
    }STACK;
    

    首先构造了一个stack,stack包含两个内容:

    1. stack的统计信息:stack中帧的个数(frame_count),最新的帧的ID(frame_lastNum);
    2. 数据存储区--一个数组,数据格式为Frame,容量为MAX_STACK_FRAME_NUM(frame_info[MAX_STACK_FRAME_NUM]);

    然后,帧的构造也包含了两个部分:

    1. 此帧数据的字节数(frame_len);
    2. 数据存储空间--数组,数据格式为uint8_t,容量为MAX_TRANSMISSION_UINT(frame_data[MAX_TRANSMISSION_UINT]);

    另外,此stack为一个循环栈,当stack存满之后仍有数据存入,并不会发生越界,而是会从头开始覆盖,此种操作,有利也有弊。

    拼包机制

    在最后,此例程中还写了一个拼包的机制,代码如下

    	//将stack中的数据进行拼包,在不造成断包的情况下最大限度地拼包
    	uint8_t SpliceFrame(uint8_t* dest)
    	{
    	    uint8_t Splice_len = 0;
    	
    	    Splice_len = 0;
    	
    	    while(1)
    	    {
    			//确保当前数据加下一帧数据不会超过最大单帧负载量(MTU)
    	        if((Splice_len +Stack_GetFrameLastNum()) <= MAX_TRANSMISSION_UINT)
    	        {
    	            Splice_len +=Stack_PopData(dest+Splice_len);//
    	            if(Stack_GetFrameCount() == 0)//当前融合帧的数量小于stack中已存帧的数量
    	               break;
    	        }
    	        else
    	        {
    	            break;
    	        }
    	    }
    	    return Splice_len;
    	}
    

    思路就是假如当MTU=70,而如果收到的数据为10bytes,10bytes这样的短数据,我们就可以把这样的短数据由多个包拼接成一个包,一次性发送出去,提高通道的利用效率,因为一次发送70个字节所需的时间大约为5s,而一次发送10个字节的时间也基本等于5s,但是拼包的时候如果造成断包,在接收端处理会非常的麻烦,所以拼包机制制定成这样--在不造成断包以及不超过MTU的情况下最大限度地拼包。

    有任何问题欢迎联系我。

  • 相关阅读:
    VS2008下编的程序生成的EXE 在没有安装VS2008的计算机上能运行
    GDI+使用小记
    双缓冲技术绘图
    INI文件格式及其读写
    缩放图片并保存
    按值传递&&按引用传递&&按地址传递
    傻瓜式制作的U盘winpe(支持4G以上U盘)速度超快
    vi 命令大全
    fopen和open的区别
    Linux下Socket网络编程,文件传输,数据传输的C语言例子
  • 原文地址:https://www.cnblogs.com/answerinthewind/p/6200438.html
Copyright © 2011-2022 走看看