以帧为存储单位的循环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包含两个内容:
- stack的统计信息:stack中帧的个数(frame_count),最新的帧的ID(frame_lastNum);
- 数据存储区--一个数组,数据格式为Frame,容量为MAX_STACK_FRAME_NUM(frame_info[MAX_STACK_FRAME_NUM]);
然后,帧的构造也包含了两个部分:
- 此帧数据的字节数(frame_len);
- 数据存储空间--数组,数据格式为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的情况下最大限度地拼包。
有任何问题欢迎联系我。
以帧为存储单位的循环stack的更多相关文章
- [No00000A]计算机的存储单位
位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位. 字节 byte:8个二进制[bit (比特)(Binary Digits)]位为一个字节(B), ...
- Pb (数据存储单位)
PB (数据存储单位) 编辑 pb指petabyte,它是较高级的存储单位,其上还有EB,ZB,YB等单位. 它等于1,125,899,906,842,624(2的50次方)字节,“大约”是一千个te ...
- EB(存储单位)
abbr.艾字节,1EB=1024PB 计算机的存储单位 位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位. 字节 byte:8个二进制位为一个字节 ...
- 比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围
1.在表示网络传输速度中与表示存储单位的不同: 表示存储单位时:1kB=1024B,但在网络中表示传输速度是1KB=1000B 2.下面介绍表示存储单位时的关系及其与操作系统位数的关系: 1B=8bi ...
- 存储单位的换算(KB, MB, GB)
关于存储单位的换算,大家一般会想到下面的换算方法. 1GB=1024MB 1MB=1024KB 1kb=1024字节 但实际生活中,这种换算方法并不准确. 例如在商家生产销售的硬盘, U盘中就不是这样 ...
- 计算机存储单位KB,MB,GB,TB,PB,EB,ZB,YB后面是什么?
关于计算机存储单位KB,MB,GB,TB,PB,EB,ZB,YB后面是什么? 我们知道Kb是1000的1次方,所以 MB就是1000的2次方(106) GB就是1000的3次方(109) TB就是10 ...
- 【学习笔记】比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围
1.在表示网络传输速度中与表示存储单位的不同: 表示存储单位时:1kB=1024B,但在网络中表示传输速度是1KB=1000B 2.下面介绍表示存储单位时的关系及其与操作系统位数的关系: 1B=8bi ...
- 深入理解计算机系统cp1:存储单位与编码
摘要: 理解计算机是如何存储数据的. 原文:深入理解计算机系统cp1:存储单位与编码 作者:Chor Fundebug经授权转载,版权归原作者所有. 1. 存储单位 位:即 bit,表示二进制位,要么 ...
- 栈帧的内部结构--操作数栈(Opreand Stack)
每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返 ...
随机推荐
- GLFW+GLEW搭建opengl环境(备忘)
使用VS2017社区版本(免费版) 下载GLFW和GLEW源码. 使用CMAKE生成工程文件 打开右击GLFW和GLEW项目编译 GLFW默认是静态库 编译GLEW时调整为静态库.将生成的lib和源码 ...
- React躬行记(9)——组件通信
根据组件之间的嵌套关系(即层级关系)可分为4种通信方式:父子.兄弟.跨级和无级. 一.父子通信 在React中,数据是自顶向下单向流动的,而父组件通过props向子组件传递需要的信息是组件之间最常见的 ...
- 如何启用linux的路由转发功能
如何使用iptables的NAT功能把红帽企业版Linux作为一台路由器使用? 方法: 提示: 以下方法只适用于红帽企业版Linux 3 以上. 1.打开包转发功能: echo "1&quo ...
- 【JS档案揭秘】第一集 内存泄漏与垃圾回收
程序的运行需要内存,对于一些需要持续运行很久的程序,尤其是服务器进程,如果不及时释放掉不再需要的内存,就会导致内存堆中的占用持续走高,最终可能导致程序崩溃. 不再需要使用的内存,却一直占用着空间,得不 ...
- Jmeter CSV config使用
1.添加线程组,自己给线程组命名 2.添加CSV data set config 如上,filename是文件的名字 新增.txt文件,将变量写在文件中,完成后,更名为.csv:变量之间用逗号隔开(第 ...
- 【MySQL】java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB3' for column
问题原因: 输入内容包含特殊字符,MySQL 中的列不支持. 解决方法 多数是修改 MySQL 的数据库和表结构,CHARSET 改为 utf8mb4,但本人测试还是不能传入 emoji. 后来在代码 ...
- Cell Phone Networ (树形dp-最小支配集)
目录 Cell Phone Networ (树形dp-最小支配集) 题意 思路 题解 Cell Phone Networ (树形dp-最小支配集) Farmer John has decided to ...
- 给最近正在找工作(iOS)的朋友一些建议/经验
众所周知, iOS开发找工作越来越难, 企业要求越来越高,一方面是资本寒冬期+七八月是企业招人淡季, 另外一方面也是iOS市场饱和.最近有出去看新机会, 所以下面记录一下面试XimalayaFM的大概 ...
- Vmware Exsi使用简要说明
界面介绍 Exsi的管理工具可以用vSphere Client来管理虚拟机.管理虚拟的网络交换机.管理物理机的内存.物理机的硬盘.物理机的CPU等资源.界面的大致介绍如下图. 资源分配 创建内存.CP ...
- [译]Python中的异步IO:一个完整的演练
原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...