|
发表于 2023-6-4 23:40:44
|
显示全部楼层
- #include "fifo.h"
- #include "string.h"
- int FifoInit(Fifo *p, uint8_t *fifo_addr, uint32_t fifo_size) {
- if (fifo_addr == NULL || fifo_size == 0) {
- return -1;
- }
- memset((char *) p, 0, sizeof(Fifo));
- p->buf = fifo_addr; //数据地址
- p->in = 0;
- p->out = 0;
- p->size = fifo_size; //数据大小
- return 0;
- }
- int FifoDataLen(Fifo *p) {
- if (p->out > p->in) {
- FifoClear(p);
- }
- return (p->in - p->out);
- }
- int FifoSpaceLen(Fifo *p) {
- return (p->size - (p->in - p->out));
- }
- int FifoRead(Fifo *p, uint8_t *buf, uint32_t len) {
- __disable_irq();
- uint32_t i = 0, j = 0;
- j = (p->out % p->size);
- len = min(len, p->in - p->out);
- i = min(len, p->size - j);
- memcpy(buf, p->buf + j, i);
- memcpy(buf + i, p->buf, len - i);
- p->out += len;
- __enable_irq();
- return len;
- }
- int FifoWrite(Fifo *p, uint8_t *buf, uint32_t len) {
- __disable_irq();
- uint32_t i = 0, j = 0;
- j = p->in % p->size;
- len = min(len, p->size - p->in + p->out);
- i = min(len, p->size - j);
- memcpy(p->buf + j, buf, i);
- memcpy(p->buf, buf + i, len - i);
- p->in += len;
- __enable_irq();
- return len;
- }
- void FifoClear(Fifo *p) {
- p->in = 0;
- p->out = 0;
- }
复制代码 |
|