此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的情况下最大限度地拼包。

有任何问题欢迎联系我。

以帧为存储单位的循环stack的更多相关文章

  1. [No00000A]计算机的存储单位

    位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位. 字节 byte:8个二进制[bit (比特)(Binary Digits)]位为一个字节(B), ...

  2. Pb (数据存储单位)

    PB (数据存储单位) 编辑 pb指petabyte,它是较高级的存储单位,其上还有EB,ZB,YB等单位. 它等于1,125,899,906,842,624(2的50次方)字节,“大约”是一千个te ...

  3. EB(存储单位)

    abbr.艾字节,1EB=1024PB 计算机的存储单位 位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位. 字节 byte:8个二进制位为一个字节 ...

  4. 比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围

    1.在表示网络传输速度中与表示存储单位的不同: 表示存储单位时:1kB=1024B,但在网络中表示传输速度是1KB=1000B 2.下面介绍表示存储单位时的关系及其与操作系统位数的关系: 1B=8bi ...

  5. 存储单位的换算(KB, MB, GB)

    关于存储单位的换算,大家一般会想到下面的换算方法. 1GB=1024MB 1MB=1024KB 1kb=1024字节 但实际生活中,这种换算方法并不准确. 例如在商家生产销售的硬盘, U盘中就不是这样 ...

  6. 计算机存储单位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 ...

  7. 【学习笔记】比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围

    1.在表示网络传输速度中与表示存储单位的不同: 表示存储单位时:1kB=1024B,但在网络中表示传输速度是1KB=1000B 2.下面介绍表示存储单位时的关系及其与操作系统位数的关系: 1B=8bi ...

  8. 深入理解计算机系统cp1:存储单位与编码

    摘要: 理解计算机是如何存储数据的. 原文:深入理解计算机系统cp1:存储单位与编码 作者:Chor Fundebug经授权转载,版权归原作者所有. 1. 存储单位 位:即 bit,表示二进制位,要么 ...

  9. 栈帧的内部结构--操作数栈(Opreand Stack)

    每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返 ...

随机推荐

  1. 在 .h 和 cpp 中查找 :grep consume ~/test/2016/AMQP-CPP/**/*.cpp ~/test/2016/AMQP-CPP/**/*.h -r

    :grep consume ~/test/2016/AMQP-CPP/**/*.cpp ~/test/2016/AMQP-CPP/**/*.h -r -w "whole" 匹配整个 ...

  2. HashSet源码分析:JDK源码系列

    1.简介 继续分析源码,上一篇文章把HashMap的分析完毕.本文开始分析HashSet简单的介绍一下. HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承 ...

  3. Netty-解码器架构与常用解码器

    任何数据类型想在网络中进行传输,都得经过编解码转换成字节流 在netty中,服务端和客户端进行通信的其实是下面这样的 程序 ---编码--> 网络 网路 ---解码--> 程序 对应服务端 ...

  4. 小白开学Asp.Net Core《三》

    小白开学Asp.Net Core<三> ——界面 我胡汉三再次又回来了(距离上篇时间有点长),今天抽时间将最近对框架采用的后台界面做个记录 1.先上图 (图一) (图二) 2.界面说明 后 ...

  5. Redis(二)--- Redis的底层数据结构

    1.Redis的数据结构 Redis 的底层数据结构包含简单的动态字符串(SDS).链表.字典.压缩列表.整数集合等等:五大数据类型(数据对象)都是由一种或几种数结构构成. 在命令行中可以使用 OBJ ...

  6. SpringBoot日志相关

    SpringBoot使用的是SLF4j当门面,Logback当实现完成 日志级别 数字越大,级别越高,框架只会输出大于等于当前日志级别的信息 ERROR 40 WARN 30 INFO 20 DEBU ...

  7. 0 推荐系统——CB和CF

    一.基于内容的推荐(CB,Content-based Recommendations): 基于内容的推荐CB应该算是最早被使用的推荐方法,它根据用户过去喜欢的产品(本文统称为 item),为用户推荐和 ...

  8. 【iOS】"OS X"想要进行更改。键入管理员的名称和密码以允许执行此操作("OS X"想使用系统钥匙串)

    今天真机调试的时候遇到了这个问题,如下图: 每次调试都要输入两次用户名和密码,好麻烦的说…… 关键时刻找到了这篇文章:"Mac OS X"想要进行更改.键入管理员的名称和密码以允许 ...

  9. SpringBoot的yml配置

    Spring Boot的yml配置 #开发配置 spring: data: solr: host: http://localhost:6789/solr/mote mvc: view: # 页面默认前 ...

  10. Appium+python自动化(二十六)- 烟花一瞬,昙花一现 -Toats提示(超详解)

    简介 今天宏哥在这里首先给小伙伴们和童鞋们分享一个有关昙花的小典故:话说昙花原是一位花神,她每天都开花,四季都灿烂.她还爱上了每天给她浇水除草的年轻人.后来,此事给玉帝得知.于是,玉帝大发雷霆,要拆散 ...