简单的FIFO
在一些高級語言中(C++、C#等)都內(nèi)置了FIFO的數(shù)據(jù)類型,在使用C語言開發(fā)嵌入式設(shè)備時,有些時候可能會用到FIFO數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)比較簡單,具體可以看下面測試代碼。
#ifndef __USER_FIFO_H_ #define __USER_FIFO_H_#include <stdint.h>/* * 自定義調(diào)試宏。 * 1.快速切換debug版本和relese版本工程 * 2.簡化打印調(diào)試語句的編寫,提高開發(fā)調(diào)試效率 */ /* debug 調(diào)試宏定義 */ #define _MY_DEBUG_ 1#ifdef _MY_DEBUG_#define MY_DEBUG_PRINT_INFO(...) printf(__VA_ARGS__)#define MY_DEBUG_PRINT_VAR(X, ...) printf("file: "__FILE__", Line: %d:"X"\r\n",__LINE__,##__VA_ARGS__) #else#define MY_DEBUG_PRINT_INFO(...)#define MY_DEBUG_PRINT_VAR(X, ...) #endif/*! fifo緩沖區(qū)類型 */ #define FIFO_TYPE int32_t/*! fifo緩沖區(qū)滿后 是否覆蓋舊數(shù)據(jù) 0進(jìn)行覆蓋 1報錯入棧失敗*/ #define FIFO_COVER 0/*** FIFO結(jié)構(gòu)體*/ typedef struct {FIFO_TYPE *buff; /* FIFO 緩沖區(qū) */uint16_t fifoLen; /* FIFO 緩沖區(qū)有效數(shù)據(jù)長度 */uint16_t fifoSize; /* 緩沖區(qū)大小 */uint16_t fifoWrite; /* 緩沖區(qū)寫指針 */uint16_t fifoRead; /* 緩沖區(qū)讀指針 */}fifo_t;void fifo_init(fifo_t *fifo, FIFO_TYPE *buff, uint16_t size); void fifo_resert(fifo_t *fifo); uint8_t fifo_push(fifo_t *fifo, FIFO_TYPE data); uint8_t fifo_pop(fifo_t *fifo, FIFO_TYPE *data); FIFO_TYPE fifo_avg(fifo_t *fifo); #endif #include "user_fifo.h"/*!* @brief fifo初始化** @param fifo_t : FIFO** @return 無** @note 無** @see fifo_t tempFifo;* FIFO_TYPE tempBuff[20];* fifo_init(&tempFifo, tempBuff, 20); //fifo初始化** @date 2020/5/21*/ void fifo_init(fifo_t *fifo, FIFO_TYPE *buff, uint16_t size) {fifo->fifoLen = 0;fifo->fifoRead = 0;fifo->fifoWrite = 0;fifo->buff = buff;fifo->fifoSize = size; }/*!* @brief fifo復(fù)位** @param fifo_t : FIFO** @return 無** @note 無** @see fifo_t tempFifo;* fifo_resert(&tempFifo); //fifo復(fù)位** @date 2020/5/21*/ void fifo_resert(fifo_t *fifo) {fifo->fifoLen = 0;fifo->fifoRead = 0;fifo->fifoWrite = 0; }/*!* @brief fifo壓入數(shù)據(jù)** @param fifo_t : FIFO* @param data : 入棧數(shù)據(jù)** @return 0 :成功 1 :失敗** @note FIFO_COVER 宏定義進(jìn)行判斷緩沖區(qū)滿后的操作** @see fifo_t tempFifo;* fifo_push(&tempFifo, 120); //fifo中壓入一個數(shù)據(jù)** @date 2020/5/21*/ uint8_t fifo_push(fifo_t *fifo, FIFO_TYPE data) {fifo->fifoLen++;/* 判斷緩沖區(qū)是否已滿 */if(fifo->fifoLen > fifo->fifoSize){fifo->fifoLen = fifo->fifoSize;#if FIFO_COVERMY_DEBUG_PRINT_INFO("入棧失敗,緩沖區(qū)已滿! \r\n");return 1; #elseif(++fifo->fifoRead >= fifo->fifoSize){fifo->fifoRead = 0;} #endif}fifo->buff[fifo->fifoWrite] = data;if(++fifo->fifoWrite >= fifo->fifoSize){fifo->fifoWrite = 0;}return 0;}/*!* @brief fifo彈出數(shù)據(jù)** @param fifo_t : FIFO* @param data : 出棧數(shù)據(jù)** @return 0 :成功 1 :失敗** @note 無** @see fifo_t tempFifo;* FIFO_TYPE tempData;* fifo_push(&tempFifo, 120); //fifo中壓入一個數(shù)據(jù)* fifo_pop(&tempFifo, &tempData); //fifo中彈出一個數(shù)據(jù)** @date 2020/5/21*/ uint8_t fifo_pop(fifo_t *fifo, FIFO_TYPE *data) {/* 緩沖區(qū)為空 */if(fifo->fifoLen == 0){ // MY_DEBUG_PRINT_INFO("出棧失敗,緩沖區(qū)為空! \r\n");return 1;}fifo->fifoLen--;*data = fifo->buff[fifo->fifoRead];if(++fifo->fifoRead >= fifo->fifoSize){fifo->fifoRead = 0;}return 0; }FIFO_TYPE fifo_avg(fifo_t *fifo) {FIFO_TYPE tmp = 0; // for(int i = 0; i < fifo->fifoLen; i++) // { // tmp += fifo->buff[i]; // } // return tmp/(fifo->fifoLen); int32_t max = fifo->buff[0], min = fifo->buff[0];for(int i = 0; i < fifo->fifoLen; i++){tmp += fifo->buff[i];if(fifo->buff[i] > max){max = fifo->buff[i];}if(fifo->buff[i] < min){min = fifo->buff[i];}}/* 剔除最大 最小值 */if(fifo->fifoLen > 3){tmp -= max;tmp -= min;return tmp/(fifo->fifoLen-2);}return tmp/(fifo->fifoLen); }總結(jié)
- 上一篇: cortex M内核优先级设置
- 下一篇: 智能车声标定位相关算法优化