// vikenzhou
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "mod_ringbuffer.h"
uint16_t ring_rx[16];
uint16_t ring_tx[16];
ring_buffer_t *test_rbuf = NULL;
uint32_t kk;
void ringbuf_init(void) {
for (uint8_t i=0; i<16; i++) {
ring_rx[i] = 0;
ring_tx[i] = 0xf100+i;
}
test_rbuf = ringBuffer_create(16);
ringBuffer_flush(test_rbuf, true);
}
void ringbuf_proc(void) {
static uint8_t j=0;
for (uint8_t i=0; i<5; i++) {
kk = ringBuffer_available_data(test_rbuf);
ringBuffer_write(test_rbuf, &ring_tx[i*3], 3);
ringBuffer_read(test_rbuf, &ring_rx[j], 3);
j += 3;
if(j>=15) {ringBuffer_flush(test_rbuf, true); for(j=0; j<16; j++) ring_tx[j]+=0x10; j=0; }
}
}
ring_buffer_t * ringBuffer_create (uint16_t length) {
ring_buffer_t *buf = calloc(1, sizeof(ring_buffer_t));
buf->length = length;
buf->start = buf->end = 0;
buf->buf = calloc(length, ring_tx[0] = sizeof(*(buf->buf)));
return buf;
}
void ringBuffer_flush (ring_buffer_t *buf, const bool clearBuffer) {
buf->start = buf->end = 0;
if (clearBuffer==true) {
memset(buf->buf, 0, (buf->length) * sizeof(*(buf->buf)));
}
}
void ringBuffer_destroy(ring_buffer_t * buf) {
if (buf) {
free(buf->buf);
free(buf);
}
}
int16_t ringBuffer_write(ring_buffer_t * buf, uint16_t *data, uint16_t amount) {
void *result;
if(amount <= ringBuffer_available_space(buf)){
switch (amount) {
case 0:
return amount;
break;
case 1:
result = memcpy(ringBuffer_ends_at(buf), data, sizeof(*(buf->buf)));
break;
default:
if (buf->end < buf->start) {
result = memcpy(ringBuffer_ends_at(buf), data, amount*sizeof(*(buf->buf)));
} else {
if (buf->start == 0) {
result = memcpy(ringBuffer_ends_at(buf), data, amount*sizeof(*(buf->buf)));
} else {
int16_t len_st = buf->length - buf->end;
if (amount <= len_st) {
result = memcpy(ringBuffer_ends_at(buf), data, amount*sizeof(*(buf->buf)));
} else {
int16_t len_nd = amount - len_st;
result = memcpy(ringBuffer_ends_at(buf), data, len_st * sizeof(*(buf->buf)));
if (result == NULL) return -1;
ringBuffer_commit_write(buf, len_st);
result = memcpy(ringBuffer_ends_at(buf), data + len_st, len_nd * sizeof(*(buf->buf)));
if (result == NULL) return -1;
ringBuffer_commit_write(buf, len_nd); return amount;
}
}
}
break;
}
if (result == NULL) return -1;
ringBuffer_commit_write(buf, amount);
}else{
return -1;
}
return amount;
}
int16_t ringBuffer_read (ring_buffer_t * buf, uint16_t *target, uint16_t amount) {
void *result;
if(amount <= ringBuffer_available_data(buf)){
switch (amount) {
case 0:
return amount;
break;
case 1:
result = memcpy(target, ringBuffer_starts_at(buf), sizeof(*(buf->buf)));
break;
default:
if (buf->end > buf->start) {
result = memcpy(target, ringBuffer_starts_at(buf), amount*sizeof(*(buf->buf)));
} else {
int16_t len_st = buf->length - buf->start;
if (amount <= len_st) {
result = memcpy(target, ringBuffer_starts_at(buf), amount*sizeof(*(buf->buf)));
} else {
int16_t len_nd = amount - len_st;
result = memcpy(target, ringBuffer_starts_at(buf), len_st * sizeof(*(buf->buf)));
if (result == NULL) return -1;
ringBuffer_commit_read(buf, len_st);
result = memcpy(target + len_st, ringBuffer_starts_at(buf), len_nd * sizeof(*(buf->buf)));
if (result == NULL) return -1;
ringBuffer_commit_read(buf, len_nd); return amount;
}
}
break;
}
if (result == NULL) return -1;
ringBuffer_commit_read(buf, amount);
}else{
return -1;
}
return amount;
}
没有合适的资源?快使用搜索试试~ 我知道了~
ringbuffer - 原创-高效率管理
共2个文件
c:1个
h:1个
需积分: 50 18 下载量 152 浏览量
2015-12-08
14:48:04
上传
评论 1
收藏 2KB RAR 举报
温馨提示
原创ringbuffer:具有高效率管理块传输,动态内存分配释放。自适应char8,int16, int32数据类型。
资源推荐
资源详情
资源评论
收起资源包目录
ringbuffer.rar (2个子文件)
mod_ringbuffer.c 5KB
mod_ringbuffer.h 2KB
共 2 条
- 1
资源评论
chinaviken
- 粉丝: 4
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功