ring_buf 的实现

//test.c


#include "zkm_buf.h"
int main()
{
    zkm_buf_t zbuf;
    char str[10];
    zkm_motor_t zkm_motor_tmp,zkm_motor_in;
    zkm_buf_init(&zbuf);


    zkm_motor_in.actualPosition = 0x1111;
    zkm_buf_write(&zbuf, &zkm_motor_in);


    zkm_motor_in.actualPosition = 0x2222;
    zkm_buf_write(&zbuf, &zkm_motor_in);


    zkm_motor_in.actualPosition = 0x3333;
    zkm_buf_write(&zbuf, &zkm_motor_in);


    zkm_motor_in.actualPosition = 0x4444;
    zkm_buf_write(&zbuf, &zkm_motor_in);




    zkm_motor_in.actualPosition = 0x5555;
    zkm_buf_write(&zbuf, &zkm_motor_in);


    int k = 0;
    for (k = 0; k < 8; k++)
        if (zkm_buf_read(&zbuf, &zkm_motor_tmp))
            printf("0x%x\n", zkm_motor_tmp.actualPosition);


    return 0;
}


//zkm_buf.h
#ifndef _ZKM_BUF_H_  
#define _ZKM_BUF_H_  




#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>




#define IDX_MASK (SIZE_MAX>>1)  
#define MSB_MASK (~IDX_MASK)   /* also the maximum value of the buffer depth */


#define BUF_DEPTH 128   /* this value is used for buffer R/W balance */


struct zkm_motor  /* this struct is used to save the parameters to pass to hosts displaying in curve , to be extended*/
{
    int32_t actualPosition;  /*0x6064*/
    int32_t actualVelocity;  /*0x606c*/
    int16_t actualTorque;    /*0x6077*/




    int16_t ctrlWords;       /*0x6040*/
    int16_t statusWords;     /*0x6041*/
    int8_t  operModDis;      /*0x6061*/
};


typedef struct zkm_motor zkm_motor_t;
#define ZKM_SIZE sizeof(zkm_motor_t)
/* zkm buffer structure */
struct zkm_buf
{
    size_t rd_idx;             /* MSB is used for the 'mirror' flag */
    size_t wr_idx;             /* MSB is used for the 'mirror' flag */
    zkm_motor_t  buf[BUF_DEPTH]  ;
};


typedef struct zkm_buf  zkm_buf_t;
typedef struct zkm_buf* zkm_buf_p;


bool zkm_buf_init (zkm_buf_p zbuf);
void zkm_buf_clear(zkm_buf_p zbuf);


bool zkm_buf_full (zkm_buf_p zbuf);
bool zkm_buf_empty(zkm_buf_p zbuf);


bool zkm_buf_write(zkm_buf_p zbuf, void *wr_data);
bool zkm_buf_read (zkm_buf_p zbuf, void *rd_data);
#endif


//zkm_buf.c


#include "zkm_buf.h"
#include <stdlib.h>
#include <string.h>


bool zkm_buf_init(zkm_buf_p zbuf)
{
    zbuf->rd_idx = 0;
    zbuf->wr_idx = 0;
    memset(zbuf->buf, 0, sizeof(zbuf->buf));
    return true;
}


void zkm_buf_clear(zkm_buf_p zbuf)
{
    zbuf->rd_idx = 0;
    zbuf->wr_idx = 0;
}


bool zkm_buf_is_empty(zkm_buf_p zbuf)
{
    return zbuf->rd_idx == zbuf->wr_idx;
}


bool zkm_buf_is_full(zkm_buf_p zbuf)
{
    return (zbuf->rd_idx & IDX_MASK) == (zbuf->wr_idx & IDX_MASK) &&
           (zbuf->rd_idx & MSB_MASK) != (zbuf->wr_idx & MSB_MASK);
}


inline void zkm_buf_incr(zkm_buf_p rbuf, size_t *p_idx)
{
    size_t idx = *p_idx & IDX_MASK;
    size_t msb = *p_idx & MSB_MASK;




    if (++idx == BUF_DEPTH) {
        msb ^= MSB_MASK;
        idx = 0;
    }
    *p_idx = msb | idx;
}


bool zkm_buf_write(zkm_buf_p zbuf, void *wr_data)
{
    if (zkm_buf_is_full(zbuf))
        return false;
    else {
        memcpy(zbuf->buf + zbuf->wr_idx * ZKM_SIZE, wr_data, ZKM_SIZE);
        zkm_buf_incr(zbuf, &zbuf->wr_idx);
        return true;
    }
}


bool zkm_buf_read(zkm_buf_p zbuf, void *rd_data)
{
    if (zkm_buf_is_empty(zbuf))
        return false;
    else {
        memcpy(rd_data, zbuf->buf + zbuf->rd_idx * ZKM_SIZE, ZKM_SIZE);
        zkm_buf_incr(zbuf, &zbuf->rd_idx);
        return true;
    }
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值