123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- #include "ring_buf.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "main.h"
- #ifdef PRINTF_STDLIB
- #include <stdio.h>
- #endif
- #ifdef PRINTF_CUSTOM
- #include "tinystdio.h"
- #endif
- #define _size_w(n) sizeof(n) / sizeof(int)
- void rbuf32_init(rbuf_t *rbuf32, uint32_t *buffer, uint32_t size) {
- rbuf32->buf_ptr = buffer;
- rbuf32->size = size;
- rbuf32->read_index = 0;
- rbuf32->write_index = 0;
- }
- void rbuf64_init(rbuf_t *rbuf64, uint64_t *buffer, uint32_t size) {
- rbuf64->buf_ptr = (uint32_t *)buffer;
- rbuf64->size = size;
- rbuf64->read_index = 0;
- rbuf64->write_index = 0;
- }
- bool rbuf_isempty(rbuf_t *rbuf) {
- if (rbuf->read_index == rbuf->write_index)
- return true;
- else
- return false;
- }
- /**
- * @brief функция определения свободного места в циклическом буфере
- * (всегда остается одна свободная ячейка)
- *
- */
- int32_t rbuf_free_space(rbuf_t *rbuf)
- {
- int32_t free_space = 0;
- if(rbuf->write_index == rbuf->read_index)
- free_space = rbuf->size;
- else if(rbuf->write_index > rbuf->read_index)
- free_space = rbuf->size - (rbuf->write_index - rbuf->read_index);
- else
- free_space = rbuf->read_index - rbuf->write_index;
- return free_space;
- }
- /**
- * @brief функция определения заполнения циклического буфера
- * (всегда остается одна свободная ячейка)
- *
- */
- int32_t rbuf_full_space(rbuf_t *rbuf)
- {
- int32_t full_space = 0;
- if(rbuf->write_index == rbuf->read_index)
- full_space = 0;
- else if(rbuf->write_index > rbuf->read_index)
- full_space = rbuf->write_index - rbuf->read_index;
- else
- full_space = rbuf->size - (rbuf->read_index - rbuf->write_index);
- return full_space;
- }
- bool rbuf_isfull(rbuf_t *rbuf) {
- int r_tmp;
- if (rbuf->write_index == (rbuf->size - 1)) {
- r_tmp = rbuf->read_index + rbuf->size;
- }
- else
- r_tmp = rbuf->read_index;
- if (r_tmp - rbuf->write_index == 1)
- return true;
- else
- return false;
- }
- bool rbuf32_get(rbuf_t *rbuf32, uint32_t *data) {
- /* Check whether buffer is not empty */
- if (!rbuf_isempty(rbuf32)) {
- *data = rbuf32->buf_ptr[rbuf32->read_index++];
- /* swap the read pointer */
- if (rbuf32->read_index == (rbuf32->size))
- rbuf32->read_index = 0;
- return true;
- }
- else
- return false;
- }
- bool rbuf64_get(rbuf_t *rbuf64, uint64_t *data) {
- /* Check whether buffer is not empty */
- if (!rbuf_isempty(rbuf64)) {
- *data = *((uint64_t*)rbuf64->buf_ptr + rbuf64->read_index);
- rbuf64->read_index++;
- /* swap the read pointer */
- if (rbuf64->read_index == (rbuf64->size))
- rbuf64->read_index = 0;
- return true;
- }
- else
- return false;
- }
- /*
- * Oldest data is overwriting when write_ptr reaches read_ptr - 1 (!).
- * For check use rbuf_isfull.
- */
- bool rbuf32_put(rbuf_t *rbuf32, uint32_t data) {
- if(!rbuf_isfull(rbuf32))
- {
- rbuf32->buf_ptr[rbuf32->write_index++] = data;
- /* swap the write pointer */
- if (rbuf32->write_index == (rbuf32->size))
- rbuf32->write_index = 0;
- return true;
- }
- else
- return false;
- }
- bool rbuf64_put(rbuf_t *rbuf64, uint64_t data) {
- uint32_t *data_ptr;
- char size_w = _size_w(data);
- if(!rbuf_isfull(rbuf64))
- {
- data_ptr = rbuf64->buf_ptr + rbuf64->write_index * size_w;
- *(uint64_t*)data_ptr = data;
- rbuf64->write_index++;
- /* swap the write pointer */
- if (rbuf64->write_index == rbuf64->size)
- rbuf64->write_index = 0;
- return true;
- }
- else
- return false;
- }
- /**
- * @brief тестовая функция для циклического буфера
- *
- */
- bool buf_test(void) {
- rbuf_t rbuf32;
- rbuf_t rbuf64;
- uint32_t rbuf_data32[32];
- uint64_t rbuf_data64[32];
- int i;
- rbuf32_init(&rbuf32, rbuf_data32, 32);
- rbuf64_init(&rbuf64, rbuf_data64, 32);
- bool status_test = true;
- uint32_t put32 = 0, get32 = 0;
- uint64_t put64 = 0x5555555555555555, get64 = 0;
- volatile int j;
- //DBG printf("capacity 64 = %d\r\n", rbuf64.size);
- DBG printf("RBUF64 TEST:\r\n");
- DBG printf("FULLNESS TEST:\r\n");
- i = 0;
- while (rbuf64_put(&rbuf64, put64++)) {
- DBG printf("W%d: %.16llX \r\n", i, (long long)rbuf_data64[i]);
- i ++;
- j = 1000000;
- while (j--);
- }
- if(i != rbuf64.size - 1) {
- status_test = false;
- DBG printf("Failed: i = %d, rbuf64.size = %d\r\n", i, rbuf64.size);
- }
- DBG printf("EMPTYNESS TEST:\r\n");
- i = 0;
- while (rbuf64_get(&rbuf64, &get64)) {
- if(get64 != rbuf_data64[i])
- status_test = false;
- DBG printf("R%d: %.16llX \r\n", i++, (long long)get64);
- j = 1000000;
- while (j--);
- }
- if(i != rbuf64.size - 1) {
- status_test = false;
- DBG printf("Failed\r\n");
- }
- i = 0;
- put64 = 0x4444444444444444;
- rbuf64_init(&rbuf64, rbuf_data64, 32);
- DBG printf("CYCLE TEST:\r\n");
- for(i = 0; i < 2*rbuf64.size; i++)
- {
- if(rbuf64_put(&rbuf64, put64++))
- DBG printf("W%d: %.16llX \r\n", i, (long long)rbuf_data64[i-32*(i/32)]);
- else {
- status_test = false;
- DBG printf("Failed\r\n");
- }
- j = 1000000;
- while (j--);
- if(rbuf64_get(&rbuf64, &get64))
- {
- if(get64 != rbuf_data64[i-32*(i/32)]) {
- status_test = false;
- DBG printf("Failed\r\n");
- }
- DBG printf("R%d: %.16llX \r\n", i, (long long)get64);
- }
- else {
- status_test = false;
- DBG printf("Failed\r\n");
- }
- j = 1000000;
- while (j--);
- }
- DBG printf("capacity 32 = %d\r\n", rbuf32.size);
- DBG printf("RBUF32 TEST:\r\n");
- DBG printf("FULLNESS TEST:\r\n");
- i = 0;
- while (rbuf32_put(&rbuf32, put32++)) {
- DBG printf("W%d: %.16lX \r\n", i, rbuf_data32[i]);
- i ++;
- j = 1000000;
- while (j--);
- }
- if(i != rbuf32.size - 1) {
- status_test = false;
- DBG printf("Failed\r\n");
- }
- DBG printf("EMPTYNESS TEST:\r\n");
- i = 0;
- while (rbuf32_get(&rbuf32, &get32)) {
- if(get32 != rbuf_data32[i]) {
- status_test = false;
- DBG printf("Failed\r\n");
- }
- DBG printf("R%d: %.16lX \r\n", i++, get32);
- j = 1000000;
- while (j--);
- }
- if(i != rbuf32.size - 1) {
- status_test = false;
- DBG printf("Failed\r\n");
- }
- i = 0;
- put32 = 0x44444444;
- rbuf32_init(&rbuf32, rbuf_data32, 32);
- DBG printf("CYCLE TEST:\r\n");
- for(i = 0; i < 2*rbuf32.size; i++)
- {
- if(rbuf32_put(&rbuf32, put32++))
- DBG printf("W%d: %.16lX \r\n", i, rbuf_data32[i-32*(i/32)]);
- else {
- status_test = false;
- DBG printf("Failed\r\n");
- }
- j = 1000000;
- while (j--);
- if(rbuf32_get(&rbuf32, &get32))
- {
- if(get32 != rbuf_data32[i-32*(i/32)]) {
- status_test = false;
- DBG printf("Failed\r\n");
- }
- DBG printf("R%d: %.16lX \r\n", i, get32);
- }
- else {
- DBG printf("Failed\r\n");
- status_test = false;
- }
- j = 1000000;
- while (j--);
- }
- if (status_test) {
- printf("Test OK\r\n");
- }
- else printf("Test fail\r\n");
- return status_test;
- }
|