zoukankan      html  css  js  c++  java
  • 嵌入式网络设备一次盲点补报的开发经验(一)

    作者:良知犹存

    转载授权以及围观:欢迎添加微信号:Conscience_Remains

    总述

        曾经开发的时候遇到这样一个情况,我们的设备是车载设备,在车辆行驶过程中需要实时上报车辆数据,但是由于用的网络端是2G网,在行驶过程中,会遇到信号不好导致网络中断的情况,最早时候因为配置联网状态机很快,重联网时间很小,我直接就选择重联网之后再进行上报。可是在实际使用过程中发现,基站的切换、网络信号不好都会导致网络中断,重联网机制也不是每次都很迅速。所以开始考虑将数据本地保存,等待联网成功之后再次进行补报。下面我就介绍一下具体的思路。

    一、需求的落地

    确认思路实现方式:

    思路就代表未来代码执行的逻辑,所以第一步选择梳理逻辑。首先脑海中大致会出现两种数据结构,一种是栈排序;一种是队列。

    顺道也简单介绍一下这两种数据结构:

    下图是栈排序的示意图,看图说话,栈是CPU分配的一块内存,分成很多个小单元用来储存数据,栈有栈顶和栈底。

    入栈的动作是,当数据来的时候从栈底开始进行储存,当储存的数据top指向的地址从栈底到了栈顶地址,那么意味着本次分配的栈空间都满了。

    出栈的时候,数据从存放的最高处top开始pop,直至top指向的地址等于栈底的地址,那么说明栈空了。

    队列有链表式有顺序表式,两者一个是动态分配内存一个是静态分配内存,但是对于数据的进出来说都是一样的,队列是一边设置为数据入队口,一边为数据出队口。

    这两者最大区别就是栈是先入后出 (First input Last output),而队列是先入先出(FIrst input First output) 。

    针对设备实际情况来看,盲点的时间长度是不可知的,也相当于说数据的长度是未知的。我们需要获知到最新的数据,而内存是有限的,所以我们需要在大量数据保存的时候把旧的数据不停的覆盖掉,保留最新的数据,并且第一时间上报最新的数据,综合考虑栈结构最适合我们。

    确认平台控制分配内存大小:

    操作平台:STM32

    RAM大小:32K

        因为不同的芯片不同内存不一样,可用于分配的内存不一样,例如这次我们要进行一个小时的盲点补报的数据保存,按照实时上报数据大小乘以频次,再乘以总数量计算得到我们需要至少25k的内存,又因为程序运行需要十多K的内存,芯片RAM总大小只有32K,最后经过测试22K的大小刚合适。

    const int MaxCachesLen = 22 * 1024;

    const int MaxCachesCount = MaxCachesLen / sizeof(Message);

    g_Caches  = (Message**)malloc(sizeof(Message*) * MaxCachesCount);

     这就是我分享的一篇盲点补报的文章,因为晚上写文章也比较晚了,所以就早点休息了,明天分享代码分析篇,如果大家有什么更好的思路,欢迎分享交流哈。

  • 相关阅读:
    用于 webpack 打包后方便修改的配置文件
    antd 中对树形表格中二级元素进行筛选过滤
    layui快速搭建一个后台管理系统
    centos使用shell定时清空缓存
    内存异常原因查询
    Protocol "‘https" not supported or disabled in libcurl
    HTML table标签实现表头固定
    vue 查询某个对象在对象列表的索引位置
    vue 实现页面监听键盘按键 上下左右
    Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能
  • 原文地址:https://www.cnblogs.com/conscience-remain/p/13389186.html
Copyright © 2011-2022 走看看