drvfifo.h
/**
@file DrvFifo.h
@date 2021/05
@author bik3352@hynux.com
@version 1.0
@brief Fifo 드라이버 헤더 파일
*/
#ifndef _DRV_FIFO_H_
#define _DRV_FIFO_H_
#include <stdbool.h>
#define MAX(x, y) ((x < y) ? y : x) /** @def 최대값 리턴 */
#define MIN(x, y) ((x < y) ? x : y) /** @def 최소값 리턴 */
#define ff_flush (x) ((x)->iLoBound = (x)->iHiBound = 0) /** @def fifo 초기화 */
#define ff_isempty(x) ((x)->iLoBound == (x)->iHiBound) /** @def fifo empty 체크 */
#define ff_isfull (x) (ff_getfree(x) <= 0) /** @def fifo full 체크 */
/**
@struct stxFifo
@brief FIFO 구조체 타입 정의
*/
#pragma pack(push, 1)
typedef struct st_Fifo_tag
{
bool b_Inhibit; /// 데이터 스기 유무
unsigned int iDepth; /// 메모리 할당 크기
unsigned int iLoBound; /// 데이터 읽기 인덱스
unsigned int iHiBound; /// 데이터 저장 인덱스
unsigned char *p_ucQueBuff; /// 실제 데이터 메모리 포인터
} stxFifo, *pstxFifo;
#pragma pack(pop)
#ifdef __cplusplus
extern "C" {
#endif
void ff_reload(stxFifo* ff, unsigned int i);
unsigned char* ff_at (stxFifo* ff, unsigned int iLoct);
unsigned char ff_peek (stxFifo* ff, unsigned int iLoct);
int ff_getsize (stxFifo* aff);
int ff_getfree (stxFifo* aff);
void ff_init (stxFifo* aff, unsigned char* ucBuf, unsigned int iDepth);
void ff_remove (stxFifo* aff, unsigned int iSize);
bool ff_push (stxFifo* aff, unsigned char ucData);
bool ff_pop (stxFifo* aff, unsigned char* p_ucData);
bool ff_pushs (stxFifo* aff, unsigned char* ucData, unsigned int iSize);
bool ff_pops (stxFifo* aff, unsigned char* p_ucData, unsigned int iSize);
bool ff_peeks (stxFifo* aff, unsigned char* p_ucData, unsigned int iSize);
bool ff_pushFst (stxFifo* aff, unsigned char ucData);
bool ff_pushsFst(stxFifo* aff, unsigned char* p_ucData, unsigned int iSize);
void ff_reset (stxFifo *aff);
#ifdef __cplusplus
}
#endif
#endif //_DRV_FIFO_H_
drvfifo.cpp
/**
@file DrvFifo.c
@date 2021/05
@author bik3352@hynux.com
@version 1.0
@brief Fifo 드라이버 소스 파일
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include "DrvFifo.h"
/**
@fn void ff_init(stxFifo* aff, unsigned char* ucBuf, unsigned int iDepth)
@brief 초기화 함수
@param aff stxFifo 구조체 타입 포인터
@param ucBuf 데이터 저장 버퍼 포인터
@param iDepth 버퍼 사이즈
*/
void ff_init(stxFifo* aff, unsigned char* ucBuf, unsigned int iDepth)
{
stxFifo* ff = aff;
if(ff != NULL) {
ff->p_ucQueBuff = ucBuf;
ff->iDepth = iDepth;
ff->iHiBound = 0;
ff->iLoBound = 0;
ff->b_Inhibit = false;
#if 0
printf(" ff->p_ucQueBuff : %d\r\n", ff->p_ucQueBuff);
printf(" ff->iDepth : %d\r\n", ff->iDepth);
printf(" ff->iHiBound : %d\r\n", ff->iHiBound);
printf(" ff->iLoBound : %d\r\n", ff->iLoBound);
#endif
}
}
/**
@fn unsigned char* ff_at(stxFifo* aff, unsigned int iLoct)
@brief FIFO 데이터 메모리 주소 반환 함수
@param aff stxFifo 구조체 타입 포인터
@param iLoct 데이터 위치
@return 메모리 주소
*/
unsigned char* ff_at(stxFifo* aff, unsigned int iLoct)
{
stxFifo* ff = aff;
unsigned char* pucRes = NULL;
if(ff != NULL) {
if(ff->iDepth != 0) {
iLoct = (iLoct+ff->iLoBound) % ff->iDepth;
pucRes = ff->p_ucQueBuff + iLoct;
}
}
return pucRes;
}
/**
@fn void ff_remove(stxFifo* aff, unsigned int iSize)
@brief FIFO 데이터 삭제 함수
@param aff stxFifo 구조체 타입 포인터
@param iSize 삭제할 메모리 사이즈
@return
@exception
*/
void ff_remove(stxFifo* aff, unsigned int iSize)
{
stxFifo* ff = aff;
if(ff != NULL) {
if(ff->iDepth != 0) {
ff->iLoBound = (ff->iLoBound + iSize) % ff->iDepth;
}
}
}
/**
@fn int ff_getsize(stxFifo* aff)
@brief 저장된즈 데이터 사이즈 반환 함수
@param aff stxFifo 구조체 타입 포인터
@return 저장 데이터 사이
*/
int ff_getsize(stxFifo* aff)
{
stxFifo* ff = aff;
int nRes = -1;
if(ff != NULL) {
int iHibound = ff->iHiBound;
int iLobound = ff->iLoBound;
nRes = (iHibound >= iLobound) ? (iHibound - iLobound)
: (iHibound + ff->iDepth - iLobound);
}
return nRes;
}
/**
@fn int ff_getfree(stxFifo* aff)
@brief 저장 가능한 데이터 크기 반환 함수
@param aff stxFifo 구조체 타입 포인터
@return 저장 가능한 데이터 크기
*/
int ff_getfree(stxFifo* aff)
{
stxFifo* ff = aff;
int nRes = -1;
if(ff != NULL) {
int iHibound = ff->iHiBound;
int iLobound = ff->iLoBound;
nRes = (iHibound >= iLobound) ? (iLobound + ff->iDepth - 1 - iHibound)
: (iLobound - 1 - iHibound);
}
return nRes;
}
/**
@fn bool ff_push(stxFifo* aff, unsigned char ucData)
@brief 1 바이트부를 저장 함수
@param aff stxFifo 구조체 타입 포인터
@param ucData 저장할 데이터
@return 저장 성공 여부
*/
bool ff_push(stxFifo* aff, unsigned char ucData)
{
stxFifo* ff = aff;
bool bRes = false;
if(ff != NULL) {
ff->b_Inhibit = true;
if(ff_getfree(ff) > 0) {
*(ff->p_ucQueBuff + ff->iHiBound) = ucData;
if(ff->iDepth != 0) {
ff->iHiBound = (ff->iHiBound + 1) % ff->iDepth;
ff->b_Inhibit = false;
bRes = true;
}
}
ff->b_Inhibit = false;
}
return bRes;
}
/**
@fn bool ff_pop(stxFifo* aff, unsigned char* p_ucData)
@brief 1 바이트 읽기 함수
@param aff stxFifo 구조체 타입 포인터
@param p_ucData 데이터 저장 버퍼 포인터
@return 읽기 설정 여부
*/
bool ff_pop(stxFifo* aff, unsigned char* p_ucData)
{
stxFifo* ff = aff;
bool bRes = false;
if(ff != NULL) {
if(ff->iHiBound != ff->iLoBound) {
*p_ucData = *(ff->p_ucQueBuff + ff->iLoBound);
if(ff->iDepth != 0) {
ff->iLoBound = (ff->iLoBound + 1) % ff->iDepth;
bRes = true;
}
}
}
return bRes;
}
/**
@fn bool ff_pushs(stxFifo* aff, unsigned char* p_ucData, unsigned int iSize)
@brief n 바이트 저장 함수
@param aff stxFifo 구조체 타입 포인터
@param p_ucData 데이터 저장 버퍼 포인터
@param iSize 데이터 사이즈
@return 저장 성공 여부
@exception
*/
bool ff_pushs(stxFifo* aff, unsigned char* p_ucData, unsigned int iSize)
{
stxFifo* ff = aff;
bool bRes = false;
int iHigh = 0;
int iLow = 0;
if(ff != NULL) {
int iHibound = ff->iHiBound;
ff->b_Inhibit = true;
if(p_ucData && (iSize > 0) && (iSize <= ff_getfree(ff))) {
iHigh = ff->iDepth - iHibound;
if(iHigh > iSize) iHigh = iSize;
iLow = iSize - (ff->iDepth - iHibound);
if(iHigh > 0) memcpy (ff->p_ucQueBuff + iHibound, p_ucData, iHigh);
if(iLow > 0) memcpy (ff->p_ucQueBuff, p_ucData + iHigh, iLow );
if(ff->iDepth != 0) {
ff->iHiBound = (ff->iHiBound + iSize) % ff->iDepth;
ff->b_Inhibit = false;
bRes = true;
}
}
ff->b_Inhibit = false;
}
return bRes;
}
/**
@fn bool ff_pops(stxFifo* aff, unsigned char* p_ucData, unsigned int iSize)
@brief n 바이트 읽기 함수
@param aff stxFifo 구조체 타입 포인터
@param p_ucData 데이터 저장 버퍼 포인터
@param iSize 읽어갈 데이터 사이즈
@return 읽기 성공 여부
@exception
*/
bool ff_pops(stxFifo* aff, unsigned char* p_ucData, unsigned int iSize)
{
stxFifo* ff = aff;
bool bRes = false;
int iHigh = 0;
int iLow = 0;
if(ff != NULL) {
int iLobound = ff->iLoBound;
if (p_ucData && (iSize > 0) && (iSize <= ff_getsize(ff))) {
iHigh = ff->iDepth - iLobound;
if (iHigh > iSize) iHigh = iSize;
iLow = iSize - (ff->iDepth - iLobound);
if (iHigh > 0) memcpy (p_ucData, ff->p_ucQueBuff + iLobound, iHigh);
if (iLow > 0) memcpy (p_ucData + iHigh, ff->p_ucQueBuff, iLow );
if(ff->iDepth != 0) {
ff->iLoBound = (ff->iLoBound + iSize) % ff->iDepth;
bRes = true;
}
}
}
return bRes;
}
/**
@fn bool ff_pops(stxFifo* aff, unsigned char* p_ucData, unsigned int iSize)
@brief i 바이트 만큼 데이터 복원 함수
@param aff stxFifo 구조체 타입 포인터
@param i 복원할 데이타 사이즈
@return
@exception
*/
void ff_reload(stxFifo* aff, unsigned int i)
{
stxFifo* ff = aff;
if(ff != NULL) {
if(ff->iLoBound >= i) ff->iLoBound -= i;
else ff->iLoBound = ff->iDepth + ff->iLoBound - i;
}
}
/**
@fn unsigned char ff_peek(stxFifo* aff, unsigned int iLoct)
@brief 1 바이트 데이터 미리 읽기 함수
@param aff stxFifo 구조체 타입 포인터
@param iLoct 미리 읽어갈 데이터 위치
@return 저장된 데이터
@exception
*/
unsigned char ff_peek(stxFifo* aff, unsigned int iLoct)
{
stxFifo* ff = aff;
unsigned char ucRes = 0;
if(ff != NULL) {
if(ff->iDepth != 0) iLoct = (iLoct + ff->iLoBound) % ff->iDepth;
ucRes = *(ff->p_ucQueBuff + iLoct);
}
return ucRes;
}
/**
@fn bool ff_peeks(stxFifo* aff, unsigned char* p_ucData, unsigned int iSize)
@brief iSize 만큼 데이터 미리 읽기 함수
@param aff stxFifo 구조체 타입 포인터
@param p_ucData 데이터 저장 버퍼 포인터
@param iSize 읽어갈 데이터 크기
@return 읽기 설공 여부
@exception
*/
bool ff_peeks(stxFifo* aff, unsigned char* p_ucData, unsigned int iSize)
{
stxFifo* ff = aff;
bool bRes = false;
int iHigh = 0;
int iLow = 0;
if(ff != NULL) {
int iLobound = ff->iLoBound;
if(p_ucData && (iSize > 0) && (iSize <= ff_getsize(ff))) {
iHigh = ff->iDepth - iLobound;
if (iHigh > iSize) iHigh = iSize;
iLow = iSize - (ff->iDepth - iLobound);
if (iHigh > 0) memcpy (p_ucData, ff->p_ucQueBuff + iLobound, iHigh);
if (iLow > 0) memcpy (p_ucData + iHigh, ff->p_ucQueBuff, iLow );
bRes = true;
}
}
return bRes;
}
/**
@fn bool ff_pushFst(stxFifo* aff, unsigned char ucData)
@brief 저장될 위치 이전 1 바이트 업데이트 함수
@param aff stxFifo 구조체 타입 포인터
@param ucData 업데이트 데이터
@return 저장 성공 여부
@exception
*/
bool ff_pushFst(stxFifo* aff, unsigned char ucData)
{
stxFifo* ff = aff;
bool bRes = false;
if(ff != NULL) {
int iLobound = ff->iLoBound;
if(ff_getfree(ff) > 0) {
if(ff->iDepth != 0) {
ff->iLoBound = ((--iLobound) + ff->iDepth) % ff->iDepth;
*(ff->p_ucQueBuff + iLobound) = ucData;
bRes = true;
}
}
}
return bRes;
}
/**
@fn bool ff_pushsFst(stxFifo* aff, unsigned char* p_ucData, unsigned int iSize)
@brief 저장될 위치 이전 iSize 바이트 업데이트 함수
@param aff stxFifo 구조체 타입 포인터
@param p_ucData 업데이트 데이터 버퍼 포인터
@param iSize 업데이트 데이터 사이즈
@return 저장 성공 여부
@exception
*/
bool ff_pushsFst(stxFifo* aff, unsigned char* p_ucData, unsigned int iSize)
{
stxFifo* ff = aff;
bool bRes = false;
int iHigh = 0;
int iLow = 0;
if(ff != NULL) {
int iLobound = ff->iLoBound;
if(p_ucData && (iSize > 0) && (iSize <= ff_getfree(ff))) {
iHigh = iLobound;
if (iHigh > iSize) iHigh = iSize;
iLow = iSize - iLobound;
if (iHigh > 0) memcpy (ff->p_ucQueBuff - iHigh, p_ucData + iLow, iHigh);
if (iLow > 0) memcpy (ff->p_ucQueBuff + ff->iDepth - iLow, p_ucData, iLow);
if(ff->iDepth != 0) ff->iLoBound = (ff->iLoBound - iSize + ff->iDepth) % ff->iDepth;
bRes = true;
}
}
return bRes;
}
/**
@fn void ff_reset(stxFifo *aff)
@brief 저장 위치 초기화 함수
@param aff stxFifo 구조체 타입 포인터
@return
@exception
*/
void ff_reset(stxFifo *aff)
{
aff->iLoBound = aff->iHiBound;
}
'미정' 카테고리의 다른 글
데이터 단위 (0) | 2023.07.27 |
---|---|
GitHub에 CMD로 파일 올리고 받기 (0) | 2023.06.16 |
batch_size와 epochs (0) | 2022.07.15 |
CNN(합성곱 신경망) 개념 및 사용법 (0) | 2022.07.14 |
WinMerge (0) | 2022.03.18 |