Xmega Application Note | |||||
This file controls the software FIFO management. More...
Go to the source code of this file.
Data Structures | |
struct | fifo_desc_t |
FIFO descriptor used by FIFO driver. More... | |
Enumerations | |
enum | { FIFO_OK = 0, FIFO_ERROR_OVERFLOW, FIFO_ERROR_UNDERFLOW, FIFO_ERROR } |
Error codes used by FIFO driver. More... | |
enum | { FIFO_ELEMENT_8BITS = 0, FIFO_ELEMENT_16BITS, FIFO_ELEMENT_32BITS } |
Size of the element. More... | |
Functions | |
uint16_t | fifo_get_free_size (fifo_desc_t *fifo_desc) |
This function returns the remaining free spaces of the FIFO (in number of elements). | |
uint16_t | fifo_get_used_size (fifo_desc_t *fifo_desc) |
This function returns the number of elements in the FIFO. | |
int | fifo_init_malloc (fifo_desc_t **fifo_desc, uint16_t size, uint16_t element_size) |
This function initializes a new software FIFO for a certain 'size'. Both fifo descriptor and buffer are allocated by the function. | |
int | fifo_init_no_malloc (fifo_desc_t *fifo_desc, void *buffer, uint16_t size, uint16_t element_size) |
This function initializes a new software FIFO for a certain 'size'. Both fifo descriptor and buffer must be allocated by the caller before calling this function. | |
int | fifo_pull (fifo_desc_t *fifo_desc, void *item) |
This function gets a new element from the FIFO. | |
int | fifo_push (fifo_desc_t *fifo_desc, uint32_t item) |
This function pushes a new element in the FIFO. | |
void | fifo_reset (fifo_desc_t *fifo_desc) |
This function resets a software FIFO. | |
void | fifo_stop_malloc (fifo_desc_t **fifo_desc) |
This function stops a software FIFO and free the allocated buffer. |
This file controls the software FIFO management.
These functions manages FIFOs thanks to simple a API. The FIFO can be 100% full thanks to a double-index range implementation. For example, a FIFO of 4 elements can be implemented: the FIFO can really hold up to 4 elements. This is particurly well suited for any kind of application needing queuing data, events, ...
Definition in file fifo.h.
anonymous enum |
Error codes used by FIFO driver.
Definition at line 57 of file fifo.h.
00057 { 00058 FIFO_OK = 0, 00059 FIFO_ERROR_OVERFLOW, 00060 FIFO_ERROR_UNDERFLOW, 00061 FIFO_ERROR 00063 };
anonymous enum |
Size of the element.
FIFO_ELEMENT_8BITS |
Element is 8 bits. |
FIFO_ELEMENT_16BITS |
Element is 16 bits. |
FIFO_ELEMENT_32BITS |
Element is 32 bits. |
Definition at line 66 of file fifo.h.
00066 { 00067 FIFO_ELEMENT_8BITS = 0, 00068 FIFO_ELEMENT_16BITS, 00069 FIFO_ELEMENT_32BITS 00071 };
uint16_t fifo_get_free_size | ( | fifo_desc_t * | fifo_desc | ) |
This function returns the remaining free spaces of the FIFO (in number of elements).
fifo_desc | The FIFO descriptor. |
Definition at line 147 of file fifo.c.
References fifo_get_used_size(), and fifo_desc_t::size.
Referenced by fifo_push().
00148 { 00149 return fifo_desc->size - fifo_get_used_size(fifo_desc); 00150 }
uint16_t fifo_get_used_size | ( | fifo_desc_t * | fifo_desc | ) |
This function returns the number of elements in the FIFO.
fifo_desc | The FIFO descriptor. |
Definition at line 139 of file fifo.c.
References fifo_desc_t::rd_id, fifo_desc_t::size, and fifo_desc_t::wr_id.
Referenced by fifo_get_free_size(), and fifo_pull().
int fifo_init_malloc | ( | fifo_desc_t ** | fifo_desc, | |
uint16_t | size, | |||
uint16_t | element_size | |||
) |
This function initializes a new software FIFO for a certain 'size'. Both fifo descriptor and buffer are allocated by the function.
fifo_desc | The FIFO descriptor. | |
size | Size of the buffer (unit is in number of 'item'). It must be a 2-power. | |
fifo_desc | The size of the element.
|
FIFO_OK | when no error occured. | |
FIFO_ERROR | when the buffer can not be allocated or if the size is not a 2-power. |
Definition at line 84 of file fifo.c.
References ctz, FIFO_ERROR, and FIFO_OK.
00086 { 00087 uint16_t tmp; 00088 00089 // Check the size parameter. It must be a 2-power. 00090 tmp = size >> ctz(size); 00091 if (tmp != 1) { 00092 // We prefer catching this critical situation that way since most of users does not 00093 // even test return value... 00094 while (1) { 00095 } 00096 //return FIFO_ERROR; 00097 } 00098 00099 if (!(*fifo_desc = malloc(sizeof(fifo_desc_t)))) 00100 return FIFO_ERROR; 00101 00102 // Allocate memory for the buffer. 00103 if (!((*fifo_desc)->buffer.u8ptr = malloc(size))) { 00104 free(*fifo_desc); 00105 return FIFO_ERROR; 00106 } 00107 00108 // Keep the alignement 00109 (*fifo_desc)->align = element_size; 00110 00111 // Fifo starts empty. 00112 (*fifo_desc)->rd_id = (*fifo_desc)->wr_id = 0; 00113 00114 // Save the size parameter. 00115 (*fifo_desc)->size = size; 00116 00117 return FIFO_OK; 00118 }
int fifo_init_no_malloc | ( | fifo_desc_t * | fifo_desc, | |
void * | buffer, | |||
uint16_t | size, | |||
uint16_t | element_size | |||
) |
This function initializes a new software FIFO for a certain 'size'. Both fifo descriptor and buffer must be allocated by the caller before calling this function.
fifo_desc | Pointer on the FIFO descriptor. | |
buffer | Pointer on the buffer. | |
size | Size of the buffer (unit is in number of 'item'). It must be a 2-power. | |
fifo_desc | The size of the element.
|
FIFO_OK | when no error occured. | |
FIFO_ERROR | when the size is not a 2-power. |
Definition at line 54 of file fifo.c.
References fifo_desc_t::align, fifo_desc_t::buffer, ctz, FIFO_OK, fifo_desc_t::rd_id, fifo_desc_t::size, UnionVPtr::u8ptr, and fifo_desc_t::wr_id.
00056 { 00057 uint16_t tmp; 00058 00059 // Check the size parameter. It must be a 2-power. 00060 tmp = size >> ctz(size); 00061 if (tmp != 1) { 00062 // We prefer catching this critical situation that way since most of users does not 00063 // even test return value... 00064 while (1) { 00065 } 00066 //return FIFO_ERROR; 00067 } 00068 00069 // Keep the alignement 00070 fifo_desc->align = element_size; 00071 00072 // Fifo starts empty. 00073 fifo_desc->rd_id = fifo_desc->wr_id = 0; 00074 00075 // Save the size parameter. 00076 fifo_desc->size = size; 00077 00078 // Save the buffer pointer 00079 fifo_desc->buffer.u8ptr = buffer; 00080 00081 return FIFO_OK; 00082 }
int fifo_pull | ( | fifo_desc_t * | fifo_desc, | |
void * | item | |||
) |
This function gets a new element from the FIFO.
fifo_desc | The FIFO descriptor. | |
item | extracted element. |
FIFO_OK | when no error occured. | |
FIFO_ERROR_UNDERFLOW | when the FIFO was empty. |
Definition at line 173 of file fifo.c.
References fifo_desc_t::align, fifo_desc_t::buffer, FIFO_ELEMENT_16BITS, FIFO_ELEMENT_8BITS, FIFO_ERROR_UNDERFLOW, fifo_get_used_size(), FIFO_OK, fifo_desc_t::rd_id, fifo_desc_t::size, UnionVPtr::u16ptr, UnionVPtr::u32ptr, and UnionVPtr::u8ptr.
00174 { 00175 uint8_t rd_id; 00176 if (fifo_get_used_size(fifo_desc) == 0) 00177 return FIFO_ERROR_UNDERFLOW; 00178 00179 rd_id = fifo_desc->rd_id; 00180 if (fifo_desc->align == FIFO_ELEMENT_8BITS) 00181 *(uint8_t*) item = fifo_desc->buffer.u8ptr[rd_id & (fifo_desc->size - 1)]; 00182 else if (fifo_desc->align == FIFO_ELEMENT_16BITS) 00183 *(uint16_t*) item = fifo_desc->buffer.u16ptr[rd_id 00184 & (fifo_desc->size - 1)]; 00185 else 00186 // if( fifo_desc->align==FIFO_ELEMENT_32BITS ) 00187 *(uint32_t*) item = fifo_desc->buffer.u32ptr[rd_id 00188 & (fifo_desc->size - 1)]; 00189 00190 // Must be the last thing to do. 00191 fifo_desc->rd_id = (rd_id + 1) & ((2 * fifo_desc->size) - 1); 00192 return FIFO_OK; 00193 }
int fifo_push | ( | fifo_desc_t * | fifo_desc, | |
uint32_t | item | |||
) |
This function pushes a new element in the FIFO.
fifo_desc | The FIFO descriptor. | |
item | element to push. |
FIFO_OK | when no error occured. | |
FIFO_ERROR_OVERFLOW | when the FIFO was already full before pushing the element. |
Definition at line 152 of file fifo.c.
References fifo_desc_t::align, fifo_desc_t::buffer, FIFO_ELEMENT_16BITS, FIFO_ELEMENT_8BITS, FIFO_ERROR_OVERFLOW, fifo_get_free_size(), FIFO_OK, fifo_desc_t::size, UnionVPtr::u16ptr, UnionVPtr::u32ptr, UnionVPtr::u8ptr, and fifo_desc_t::wr_id.
00153 { 00154 uint8_t wr_id; 00155 if (fifo_get_free_size(fifo_desc) == 0) 00156 return FIFO_ERROR_OVERFLOW; 00157 00158 wr_id = fifo_desc->wr_id; 00159 00160 if (fifo_desc->align == FIFO_ELEMENT_8BITS) 00161 fifo_desc->buffer.u8ptr[wr_id & (fifo_desc->size - 1)] = item; 00162 else if (fifo_desc->align == FIFO_ELEMENT_16BITS) 00163 fifo_desc->buffer.u16ptr[wr_id & (fifo_desc->size - 1)] = item; 00164 else 00165 // if( fifo_desc->align==FIFO_ELEMENT_32BITS ) 00166 fifo_desc->buffer.u32ptr[wr_id & (fifo_desc->size - 1)] = item; 00167 00168 // Must be the last thing to do. 00169 fifo_desc->wr_id = (wr_id + 1) & ((2 * fifo_desc->size) - 1); 00170 return FIFO_OK; 00171 }
void fifo_reset | ( | fifo_desc_t * | fifo_desc | ) |
This function resets a software FIFO.
fifo_desc | The FIFO descriptor. |
Definition at line 120 of file fifo.c.
References fifo_desc_t::rd_id, and fifo_desc_t::wr_id.
void fifo_stop_malloc | ( | fifo_desc_t ** | fifo_desc | ) |
This function stops a software FIFO and free the allocated buffer.
fifo_desc | The FIFO descriptor. |
Generated on Fri Oct 22 12:15:25 2010 for AVR1300 Using the Xmega ADC by ![]() |