单片机FIFO代码,不要禁用中断
时间: 2024-01-31 08:02:00 浏览: 26
以下是一个基于队列实现的单片机FIFO代码,不需要禁用中断:
```c
#include <stdint.h>
#define QUEUE_SIZE 32
typedef struct {
uint8_t buffer[QUEUE_SIZE];
uint8_t *head;
uint8_t *tail;
uint8_t count;
} fifo_t;
void fifo_init(fifo_t *fifo) {
fifo->head = fifo->buffer;
fifo->tail = fifo->buffer;
fifo->count = 0;
}
uint8_t fifo_put(fifo_t *fifo, uint8_t data) {
if (fifo->count == QUEUE_SIZE) {
return 0; // 队列已满
}
*(fifo->head) = data;
fifo->head++;
fifo->count++;
if (fifo->head == fifo->buffer + QUEUE_SIZE) {
fifo->head = fifo->buffer;
}
return 1; // 写入成功
}
uint8_t fifo_get(fifo_t *fifo, uint8_t *data) {
if (fifo->count == 0) {
return 0; // 队列为空
}
*data = *(fifo->tail);
fifo->tail++;
fifo->count--;
if (fifo->tail == fifo->buffer + QUEUE_SIZE) {
fifo->tail = fifo->buffer;
}
return 1; // 读取成功
}
```
使用示例:
```c
#include <stdio.h>
#include "fifo.h"
fifo_t my_fifo;
int main() {
uint8_t i, data;
fifo_init(&my_fifo);
// 写入数据
for (i = 0; i < QUEUE_SIZE; i++) {
if (!fifo_put(&my_fifo, i)) {
printf("FIFO is full\n");
break;
}
}
// 读取数据
while (fifo_get(&my_fifo, &data)) {
printf("%d\n", data);
}
return 0;
}
```
上述代码中,`fifo_init`函数用于初始化队列,`fifo_put`函数用于写入数据到队列中,`fifo_get`函数用于从队列中读取数据。在队列已满或者队列为空时,这些函数会返回0,表示写入或者读取失败。在队列中有数据时,这些函数会返回1,表示写入或者读取成功。
需要注意的是,每次写入或者读取数据时,都需要更新队列中的头指针或者尾指针。这些操作都是原子操作,不需要禁用中断。