//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;
}
}
09-14
3487
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-12
1288
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-26
5380
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)