加速度センサーのキューイング、リングバッファ処理を考える(ひと工夫



目的
無線電送で割り込み処理で落ちる件を解決する為に
リングバッファを導入する予定

仕様

すべては、実装がただしい
要素数(アイテム)は、256個とする
配列0から配列255とする
読み込みポイントと書き込みポイントを使った追っかけ方式とする
最大になった場合は、古いデータは、廃棄する。ポインターは、共に1つ進む
読み取りポイントは、読み取ると1個進む
書き込みポイントは、書き込むと1個進む
ポイントは、255の次は、0である
読み取り数の関数は、読み取りがない場合は、0を返す
バッファーに何かある場合は、読み取り数を返す
読み取り数0の時に読み取ると同じ値を返す

なんかこんな感じの仕様

```

#define xxx_read_x()  a[0]
#define xxx_read_y()  a[1]
#define xxx_read_z()  a[2]

int a[3];

if(読み取り数関数 != 0) {

  xxx_read(a)
  x = xxx_read_x();
  y = xxx_read_x();
  z = xxx_read_y();

  ccc.print(x);
  ccc.print(',');
  ccc.print(y);
  ccc.print(',');
  ccc.print(z);
  ccc.println();

}

ウエート


```



プログラム
(オンラインコンパイラ)


```c++

#include <iostream>
using namespace std;

int acceleration_stack[256][3];

int acceleration_write_point = 0;

int acceleration_read_point = 0;


int acceleration_num(){
    
    int a = acceleration_write_point - acceleration_read_point;
    if(a < 0) {
        a = 256 + acceleration_write_point - acceleration_read_point;
    }
    
    return(a);
}


void acceleration_write(int *a){

    printf("write_point=[%d]\n",acceleration_write_point);

    printf(">%d\n",a[0]);
    acceleration_stack[acceleration_write_point][0] = a[0];
    printf("<%d\n",acceleration_stack[acceleration_write_point][0]);

    acceleration_stack[acceleration_write_point][1] = a[1];
    acceleration_stack[acceleration_write_point][2] = a[2];

    //ライトポイントを1個進める
    acceleration_write_point++;
    acceleration_write_point = acceleration_write_point & 0xff;
    
    if(acceleration_num() > (255-1) ){
        printf("-");
        printf("acceleration_num=[%d]\n",acceleration_num());
        //リードポイントを1個進める
        acceleration_read_point++;
        acceleration_read_point = acceleration_read_point & 0xff;
    }
}

void acceleration_read(int *a){

    printf("read_point=[%d]\n",acceleration_read_point);


      a[0] = acceleration_stack[acceleration_read_point][0];
      printf("read %d\n",acceleration_stack[acceleration_read_point][0]);
      
      a[1] = acceleration_stack[acceleration_read_point][1];
      a[2] = acceleration_stack[acceleration_read_point][2];


    if(acceleration_num() != 0 ){
        printf(">");
        printf("acceleration_num=[%d]\n",acceleration_num());
        //リードポイントを1個進める
        acceleration_read_point++;
        acceleration_read_point = acceleration_read_point & 0xff;
    }


}

int main(void){
    // Your code here!
    printf("START\n");

acceleration_write_point = 250;
acceleration_read_point = 250;

    int a[3];
    
    
    printf("acceleration_num=[%d]\n",acceleration_num());
    
    a[0] = 1;a[1] = 2;a[2] = 3;
    
    acceleration_write(a);
    acceleration_read(a);
printf("\n");
    acceleration_write(a);
    acceleration_read(a);
printf("\n");
    acceleration_write(a);
    acceleration_read(a);
printf("\n");
    acceleration_write(a);
    acceleration_read(a);
printf("\n");
    acceleration_write(a);
    acceleration_read(a);
printf("\n");
    acceleration_write(a);
    acceleration_read(a);
printf("\n");
    acceleration_write(a);
    acceleration_read(a);
printf("\n");
    acceleration_write(a);
    acceleration_read(a);
printf("\n");
    acceleration_write(a);
    acceleration_read(a);
printf("\n");





 
    //a[0] = 1;
    printf("0=[%d],1=[%d],2=[%d]\n",a[0],a[1],a[2]);
    

    printf("acceleration_num=[%d]\n",acceleration_num());

    
}

```


```


START
acceleration_num=[0]
write_point=[250]
>1
<1
read_point=[250]
read 1
>acceleration_num=[1]

write_point=[251]
>1
<1
read_point=[251]
read 1
>acceleration_num=[1]

write_point=[252]
>1
<1
read_point=[252]
read 1
>acceleration_num=[1]

write_point=[253]
>1
<1
read_point=[253]
read 1
>acceleration_num=[1]

write_point=[254]
>1
<1
read_point=[254]
read 1
>acceleration_num=[1]

write_point=[255]
>1
<1
read_point=[255]
read 1
>acceleration_num=[1]

write_point=[0]
>1
<1
read_point=[0]
read 1
>acceleration_num=[1]

write_point=[1]
>1
<1
read_point=[1]
read 1
>acceleration_num=[1]

write_point=[2]
>1
<1
read_point=[2]
read 1
>acceleration_num=[1]

0=[1],1=[2],2=[3]
acceleration_num=[0]



```