澳门至尊网站-首页

您的位置:澳门至尊网站 > 黑客安全 > 嵌入式框架Zorb

嵌入式框架Zorb

2019-10-22 23:05

自己是卓波,作者是一名嵌入式程序员,我相对没悟出笔者会在这里间跟大家吹捧皮。

嵌入式框架Zorb Framework搭建进程

嵌入式框架Zorb Framework搭建生机勃勃:嵌入式境遇搭建、调节和测试输出和树登时间体系

嵌入式框架Zorb Framework搭建二跋山涉水的近义词环形缓冲区的落实

嵌入式框架Zorb Framework搭建三爬山涉水列表的兑现

嵌入式框架Zorb Framework搭建四爬山涉水状态机的完结

嵌入式框架Zorb Framework搭建五:事件的落实

嵌入式框架Zorb Framework搭建六跋山涉水的近义词电火花计时器的兑现

嵌入式框架Zorb Framework搭建七爬山涉水职分的完毕

 

一、前言

  在这里龙精虎猛篇中,大家将为Zorb Framework提供环形缓冲区的功力。环形缓冲区首要运用在字节数据流传输上,如串口、网口的收发都得以经过环形缓冲区进行缓存。举例笔者要透过串口发送命令“LED ON”来支配开采板的led灯亮起来,但开拓板串口选择不是一回把“LED ON”同一时候收纳,而是多少个字节三个字节地收到,因而供给动用缓冲区来缓存数据,然后解析器来深入分析缓冲区的数额。

 

二、环形缓冲区设计

  大家先来探视要促成的缓冲科长什么样体统,提供什么样作用,那样有支持大家陈设。

  初始要提供的效应如下爬山涉水

  1、要有能够缓存数据的上空

  2、能够知晓总空间的分寸

  3、能够驾驭已用空间的数码

  4、能够压入数据

  5、能够弹出多少

  6、作者也足以在不弹出多少的意况下,读到特定长度的数额

  由此,开端设计的数据结构如下爬山涉水

 1 /* 环形缓冲区数据结构 */
 2 typedef struct _RingBuffer
 3 {
 4     bool IsExternBuffer;  /* 是否外部缓冲区,是则销毁时不释放 */
 5     uint8_t *pBuf;        /* 缓冲区指针 */
 6     uint32_t Head;        /* 缓冲区头地址 */
 7     uint32_t Trail;       /* 缓冲区尾地址 */
 8     uint32_t Size;        /* 缓冲区大小 */
 9     uint32_t Count;       /* 数据字节数 */
10     
11     /* 缓冲器是否已满 */
12     bool (*IsFull)(struct _RingBuffer * const pRb);
13     
14     /* 缓冲器是否空 */
15     bool (*IsEmpty)(struct _RingBuffer * const pRb);
16     
17     /* 压入一个字节 */
18     bool (*SaveByte)(struct _RingBuffer * const pRb, uint8_t byte);
19     
20     /* 取出一个字节 */
21     bool (*GetByte)(struct _RingBuffer * const pRb, uint8_t *pByte);
22     
23     /* 读取缓冲器已使用字节个数 */
24     uint32_t (*GetCount)(struct _RingBuffer * const pRb);
25     
26     /* 读取n个字节(n超过最大数据数时全部读出) */
27     bool (*ReadBytes)(struct _RingBuffer * const pRb, uint8_t *pArray,
28         uint32_t n);
29     
30     /* 丢弃n个字节(n超过最大数据数时全部丢弃) */
31     bool (*DropBytes)(struct _RingBuffer * const pRb, uint32_t n);
32     
33     /* 清空缓冲器 */
34     bool (*Clear)(struct _RingBuffer * const pRb);
35     
36     /* 释放缓冲器(不释放外部创建的缓冲区) */
37     bool (*Dispose)(struct _RingBuffer * const pRb);
38 } RingBuffer;

  其实按实际须求,恐怕远不仅下边提到的6种状态,比方作者得以废弃特定数量的字节数据,也能够直接清空掉缓冲区数码,以致足以怀恋提供动态缓冲区的作用,也正是说可以释放缓冲器自身。

  缓冲区已经陈设好了,具体得以实现请看附属类小部件代码或在文末的github地址拉框架源码。

 

三、环形缓冲区结果测验

  简单的测量试验代码如下爬山涉水

 1 /**
 2   *****************************************************************************
 3   * @file    app_buffer.c
 4   * @author  Zorb
 5   * @version V1.0.0
 6   * @date    2018-06-28
 7   * @brief   环形缓冲区测试的实现
 8   *****************************************************************************
 9   * @history
10   *
11   * 1. Date:2018-06-28
12   *    Author:Zorb
13   *    Modification:建立文件
14   *
15   *****************************************************************************
16   */
17 
18 #include "app_buffer.h"
19 #include "zf_includes.h"
20 
21 /* 环形缓冲区指针 */
22 RingBuffer *rb;
23 
24 /******************************************************************************
25  * 描述  :任务初始化
26  * 参数  :无
27  * 返回  :无
28 ******************************************************************************/
29 void App_Buffer_init(void)
30 {
31     /* 创建500字节的缓冲区 */
32     RB_create(&rb, 500);
33 }
34 
35 /******************************************************************************
36  * 描述  :任务程序
37  * 参数  :无
38  * 返回  :无
39 ******************************************************************************/
40 void App_Buffer_process(void)
41 {
42     uint32_t i;
43     uint8_t buf[11];
44     uint8_t byte;
45     
46     ZF_DEBUG(LOG_D, "rb count before adding data is %drn", rb->Count);
47     
48     /* 填充10个字节数据(0-9) */
49     for (i = 0; i < 10; i++)
50     {
51         rb->SaveByte(rb, i);
52     }
53     
54     ZF_DEBUG(LOG_D, "rb count after adding data is %drn", rb->Count);
55     
56     /* 读出数据看是否正确 */
57     rb->ReadBytes(rb, buf, 10);
58     
59     ZF_DEBUG(LOG_D, "rb data is ");
60     
61     for (i = 0; i < 10; i++)
62     {
63         ZF_DEBUG(LOG_D, "%d ", buf[i]);
64     }
65     
66     ZF_DEBUG(LOG_D, "rnrn");
67     
68     /* 弹出数据 */
69     for (i = 0; i < 10; i++)
70     {
71         rb->GetByte(rb, &byte);
72         
73         ZF_DEBUG(LOG_D, "byte %d is %drn", i, byte);
74         ZF_DEBUG(LOG_D, "rb count is %drn", rb->Count);
75     }
76     
77     while(1);
78 }
79 
80 /******************************** END OF FILE ********************************/

  结果:

rb count before adding data is 0
rb count after adding data is 10
rb data is 0 1 2 3 4 5 6 7 8 9 

byte 0 is 0
rb count is 9
byte 1 is 1
rb count is 8
byte 2 is 2
rb count is 7
byte 3 is 3
rb count is 6
byte 4 is 4
rb count is 5
byte 5 is 5
rb count is 4
byte 6 is 6
rb count is 3
byte 7 is 7
rb count is 2
byte 8 is 8
rb count is 1
byte 9 is 9
rb count is 0

 

四、最后

  本篇为Zorb Framework提供了环形缓冲区作用,只要提到到字节流通讯,基本都急需缓冲区来落到实处,能够说接收效能比较高。以往造了这么些轮子,前面就可以间接造跑车了。

 

  Zorb Framework github:

  版权全部,转载请打赏哟

 

设若你赏识我的小说,能够因此微信扫一扫给本身打赏哟

图片 1

本文由澳门至尊网站发布于黑客安全,转载请注明出处:嵌入式框架Zorb

关键词: