| 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;
 
- }		
 
 
  |