| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | //rbuf.c#include "rbuf.h"//#include <avr/interrupt.h>void rbuf_ini(uint8_t* ptr, uint8_t l){	ptr[0] = l;	ptr[1] = 0;	ptr[2] = 0;}//lock/unlock macros//#define _lock() uint8_t _sreg = SREG; cli();//#define _unlock() SREG = _sreg;#define _lock()#define _unlock()//put single byte to bufferint rbuf_put(uint8_t* ptr, uint8_t b){//#ifdef _NO_ASM	_lock();                         //lock	uint8_t buf_w = ptr[1];          //get write index	uint8_t buf_r = ptr[2];          //get read index	_unlock();                       //unlock	ptr[4 + buf_w] = b;              //store byte to buffer	buf_w++;                         //incerment write index	uint8_t buf_l = ptr[0];          //get length	if (buf_w >= buf_l) buf_w = 0;   //rotate write index	if (buf_w == buf_r) return -1;   //return -1 to signal buffer full	ptr[1] = buf_w;                  //store write index	return 0;                        //return 0 to signal success//#else //_NO_ASM// TODO - optimized assembler version//	asm("movw r26, r24");//	asm("ld r18, X+");//	asm("cli");//	asm("ld r19, X+");//	asm("ld r20, X");//	asm("cp r19, r18");//	asm("brne .-6");*///#endif //_NO_ASM}//get single byte from bufferint rbuf_get(uint8_t* ptr){//#ifdef _NO_ASM	_lock();                         //lock	uint8_t buf_w = ptr[1];          //get write index	uint8_t buf_r = ptr[2];          //get read index	_unlock();                       //unlock	if (buf_r == buf_w) return -1;   //return -1 to signal buffer empty	int ret = ptr[4 + buf_r];        //get byte from buffer	buf_r++;                         //increment read index	uint8_t buf_l = ptr[0];          //get length	if (buf_r >= buf_l) buf_r = 0;   //rotate read index	ptr[2] = buf_r;                  //store read index	return ret;                      //return byte (0-255)//	return 0;                        //return 0 to signal success//#else //_NO_ASM// TODO - optimized assembler version//#endif //_NO_ASM}
 |