Engee 文档
Notebook

带外部复位的环形缓冲器

一旦我需要解析流数据,为此我需要一个缓冲区,我可以根据某种条件清除。 在Engee中没有这样的块,但没关系,因为如果我知道我需要什么,那么我总是可以在C或Julia中实现它。 看看我有什么。

外部复位环形缓冲器如何工作?

image.png

缓冲区代码-我们使用工作变量

实现某些东西的最简单方法是最好的。 因此,我们将使用C功能块。

要实现它,您将需要两个变量-状态。:缓冲区本身和计数器。 让我们将它们设置为块的工作变量。

工作变量是作为静态预分配内存区域的特殊变量。 配置此块参数时,为每个变量指定应该分配多少字节。 一个单独的优点是这些变量对于块的每个实例都是不同的。 也就是说,我们可以说这是块的"状态"。

让我们来看看我的设置:

可以看出,将使用2个变量-一个80字节的缓冲区缓冲区和一个1字节的计数器。

要在C函数代码中使用这些变量,需要参考Work结构。

因此,代码将如下所示:

``'c
uint8_tptr=&(工作->缓冲区[0]);
buffer_d_ptr=(双*)ptr;
双*output1_ptr=output1;

如果(重置)
{
memset(buffer_d_ptr,0,BUFFER_LEN_BYTES);
memset(output1_ptr,0,BUFFER_LEN_BYTES);
(工作->pos[0])=0;
}
其他
{
buffer_d_ptr[工作->pos[0]]=字节;
工作->pos[0]++;
memcpy(output1_ptr,buffer_d_ptr,BUFFER_LEN_BYTES);
if(工作->pos[0]>len-1)
{
工作->pos[0]=0;
}
}


## 如何使用工作变量(c魔术)?

工作变量总是类型##uint8\_t##。 但是C很棒,因为它可以让你以任何你想要的方式使用内存。 而且你也可以记住,C中的任何数组都只是一个指向一块内存的指针,所以我们可以随心所欲地解释它。:

``'c
uint8_t*ptr=&(工作->缓冲区[0]);
双*buffer_d_ptr=(双*)ptr;

Ptr和buffer_d_ptr都指向内存中的相同地址,但buffer_d_ptr告诉编译器该地址会有一个double。 我们也可以像使用数组一样使用这个指针。:

``'c
buffer_d_ptr[工作->pos[0]]=字节;


请注意,我们根本不使用动态内存分配!

测试块

让我们创建一个表单的测试工具:

image.png

让我们运行一个模型的模拟:

In [ ]:
sys = engee.open(joinpath(@__DIR__,"cirbuf.engee"))
engee.run(sys)
engee.close(;force=true)

让我们看看结果。:

In [ ]:
using DataFrames
df = DataFrame(time=zero(Float64),Buffer=[zeros(Float64,16)],RESET = zero(UInt8))
for i =1:length(RESETEVT.time)
    push!(df,(time   = collect(RESETEVT).time[i],
              Buffer = collect(BUFFER).value[i],
              RESET  = collect(RESETEVT).value[i]))
end
show(df, allrows=true, allcols=true)
102×3 DataFrame
 Row │ time     Buffer                             RESET
     │ Float64  Array…                             UInt8
─────┼───────────────────────────────────────────────────
   1 │     0.0  [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0…      0
   2 │     0.0  [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0…      0
   3 │     0.1  [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0…      0
   4 │     0.2  [0.0, 1.0, 2.0, 0.0, 0.0, 0.0, 0…      0
   5 │     0.3  [0.0, 1.0, 2.0, 3.0, 0.0, 0.0, 0…      0
   6 │     0.4  [0.0, 1.0, 2.0, 3.0, 4.0, 0.0, 0…      0
   7 │     0.5  [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 0…      0
   8 │     0.6  [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6…      0
   9 │     0.7  [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6…      0
  10 │     0.8  [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6…      0
  11 │     0.9  [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6…      0
  12 │     1.0  [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0…      1
  13 │     1.1  [11.0, 0.0, 0.0, 0.0, 0.0, 0.0, …      0
  14 │     1.2  [11.0, 12.0, 0.0, 0.0, 0.0, 0.0,…      0
  15 │     1.3  [11.0, 12.0, 13.0, 0.0, 0.0, 0.0…      0
  16 │     1.4  [11.0, 12.0, 13.0, 14.0, 0.0, 0.…      0
  17 │     1.5  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0
  18 │     1.6  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0
  19 │     1.7  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0
  20 │     1.8  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0
  21 │     1.9  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0
  22 │     2.0  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0
  23 │     2.1  [5.0, 12.0, 13.0, 14.0, 15.0, 0.…      0
  24 │     2.2  [5.0, 6.0, 13.0, 14.0, 15.0, 0.0…      0
  25 │     2.3  [5.0, 6.0, 7.0, 14.0, 15.0, 0.0,…      0
  26 │     2.4  [5.0, 6.0, 7.0, 8.0, 15.0, 0.0, …      0
  27 │     2.5  [5.0, 6.0, 7.0, 8.0, 9.0, 0.0, 1…      0
  28 │     2.6  [5.0, 6.0, 7.0, 8.0, 9.0, 10.0, …      0
  29 │     2.7  [5.0, 6.0, 7.0, 8.0, 9.0, 10.0, …      0
  30 │     2.8  [5.0, 6.0, 7.0, 8.0, 9.0, 10.0, …      0
  31 │     2.9  [5.0, 6.0, 7.0, 8.0, 9.0, 10.0, …      0
  32 │     3.0  [5.0, 6.0, 7.0, 8.0, 9.0, 10.0, …      0
  33 │     3.1  [15.0, 6.0, 7.0, 8.0, 9.0, 10.0,…      0
  34 │     3.2  [15.0, 0.0, 7.0, 8.0, 9.0, 10.0,…      0
  35 │     3.3  [15.0, 0.0, 1.0, 8.0, 9.0, 10.0,…      0
  36 │     3.4  [15.0, 0.0, 1.0, 2.0, 9.0, 10.0,…      0
  37 │     3.5  [15.0, 0.0, 1.0, 2.0, 3.0, 10.0,…      0
  38 │     3.6  [15.0, 0.0, 1.0, 2.0, 3.0, 4.0, …      0
  39 │     3.7  [15.0, 0.0, 1.0, 2.0, 3.0, 4.0, …      0
  40 │     3.8  [15.0, 0.0, 1.0, 2.0, 3.0, 4.0, …      0
  41 │     3.9  [15.0, 0.0, 1.0, 2.0, 3.0, 4.0, …      0
  42 │     4.0  [15.0, 0.0, 1.0, 2.0, 3.0, 4.0, …      0
  43 │     4.1  [9.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5…      0
  44 │     4.2  [9.0, 10.0, 1.0, 2.0, 3.0, 4.0, …      0
  45 │     4.3  [9.0, 10.0, 11.0, 2.0, 3.0, 4.0,…      0
  46 │     4.4  [9.0, 10.0, 11.0, 12.0, 3.0, 4.0…      0
  47 │     4.5  [9.0, 10.0, 11.0, 12.0, 13.0, 4.…      0
  48 │     4.6  [9.0, 10.0, 11.0, 12.0, 13.0, 14…      0
  49 │     4.7  [9.0, 10.0, 11.0, 12.0, 13.0, 14…      0
  50 │     4.8  [9.0, 10.0, 11.0, 12.0, 13.0, 14…      0
  51 │     4.9  [9.0, 10.0, 11.0, 12.0, 13.0, 14…      0
  52 │     5.0  [9.0, 10.0, 11.0, 12.0, 13.0, 14…      0
  53 │     5.1  [3.0, 10.0, 11.0, 12.0, 13.0, 14…      0
  54 │     5.2  [3.0, 4.0, 11.0, 12.0, 13.0, 14.…      0
  55 │     5.3  [3.0, 4.0, 5.0, 12.0, 13.0, 14.0…      0
  56 │     5.4  [3.0, 4.0, 5.0, 6.0, 13.0, 14.0,…      0
  57 │     5.5  [3.0, 4.0, 5.0, 6.0, 7.0, 14.0, …      0
  58 │     5.6  [3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 1…      0
  59 │     5.7  [3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9…      0
  60 │     5.8  [3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9…      0
  61 │     5.9  [3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9…      0
  62 │     6.0  [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0…      1
  63 │     6.1  [13.0, 0.0, 0.0, 0.0, 0.0, 0.0, …      0
  64 │     6.2  [13.0, 14.0, 0.0, 0.0, 0.0, 0.0,…      0
  65 │     6.3  [13.0, 14.0, 15.0, 0.0, 0.0, 0.0…      0
  66 │     6.4  [13.0, 14.0, 15.0, 0.0, 0.0, 0.0…      0
  67 │     6.5  [13.0, 14.0, 15.0, 0.0, 1.0, 0.0…      0
  68 │     6.6  [13.0, 14.0, 15.0, 0.0, 1.0, 2.0…      0
  69 │     6.7  [13.0, 14.0, 15.0, 0.0, 1.0, 2.0…      0
  70 │     6.8  [13.0, 14.0, 15.0, 0.0, 1.0, 2.0…      0
  71 │     6.9  [13.0, 14.0, 15.0, 0.0, 1.0, 2.0…      0
  72 │     7.0  [13.0, 14.0, 15.0, 0.0, 1.0, 2.0…      0
  73 │     7.1  [7.0, 14.0, 15.0, 0.0, 1.0, 2.0,…      0
  74 │     7.2  [7.0, 8.0, 15.0, 0.0, 1.0, 2.0, …      0
  75 │     7.3  [7.0, 8.0, 9.0, 0.0, 1.0, 2.0, 3…      0
  76 │     7.4  [7.0, 8.0, 9.0, 10.0, 1.0, 2.0, …      0
  77 │     7.5  [7.0, 8.0, 9.0, 10.0, 11.0, 2.0,…      0
  78 │     7.6  [7.0, 8.0, 9.0, 10.0, 11.0, 12.0…      0
  79 │     7.7  [7.0, 8.0, 9.0, 10.0, 11.0, 12.0…      0
  80 │     7.8  [7.0, 8.0, 9.0, 10.0, 11.0, 12.0…      0
  81 │     7.9  [7.0, 8.0, 9.0, 10.0, 11.0, 12.0…      0
  82 │     8.0  [7.0, 8.0, 9.0, 10.0, 11.0, 12.0…      0
  83 │     8.1  [1.0, 8.0, 9.0, 10.0, 11.0, 12.0…      0
  84 │     8.2  [1.0, 2.0, 9.0, 10.0, 11.0, 12.0…      0
  85 │     8.3  [1.0, 2.0, 3.0, 10.0, 11.0, 12.0…      0
  86 │     8.4  [1.0, 2.0, 3.0, 4.0, 11.0, 12.0,…      0
  87 │     8.5  [1.0, 2.0, 3.0, 4.0, 5.0, 12.0, …      0
  88 │     8.6  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 1…      0
  89 │     8.7  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7…      0
  90 │     8.8  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7…      0
  91 │     8.9  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7…      0
  92 │     9.0  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7…      0
  93 │     9.1  [11.0, 2.0, 3.0, 4.0, 5.0, 6.0, …      0
  94 │     9.2  [11.0, 12.0, 3.0, 4.0, 5.0, 6.0,…      0
  95 │     9.3  [11.0, 12.0, 13.0, 4.0, 5.0, 6.0…      0
  96 │     9.4  [11.0, 12.0, 13.0, 14.0, 5.0, 6.…      0
  97 │     9.5  [11.0, 12.0, 13.0, 14.0, 15.0, 6…      0
  98 │     9.6  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0
  99 │     9.7  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0
 100 │     9.8  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0
 101 │     9.9  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0
 102 │    10.0  [11.0, 12.0, 13.0, 14.0, 15.0, 0…      0

结论

我们做了一个循环缓冲块与外部复位,并学习了如何与工作变量的工作,并在同一时间记住如何与c指针的工作。