📄 loopbuf.c
字号:
#include "loopbuf.h"
#include "trace.h"
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "44b.H"
#include "EPT32.H"
#include "Nucleus.H"
#include "switch.h"
#include "interdrive.h"
#include "common_exp.h"
#include "exports.h"
#include "IODrive.h"
#include "Regist.h"
int PV_sem_init(int argc, void *argv);
int P_sem(int argc, void *argv);
int V_sem(int argc, void *argv);
int PV_int_init(int argc, void *argv);
int P_int(int argc, void *argv);
int V_int(int argc, void *argv);
/* 此代码只适合于标准读写者问题,即:一个进程读、另一个进程写;或者一个进程读、中断写 */
int PV_sem_init(int argc, void *argv)
{
_loopbuf *loopbuf = (_loopbuf *)argv;
loopbuf->sem=EA_pvMalloc(sizeof(NU_SEMAPHORE));
if(loopbuf->sem==EM_NULL)
{
return EM_ERROR;
}
if(NU_Create_Semaphore(loopbuf->sem,loopbuf->name,1, NU_FIFO)!=NU_SUCCESS)
{
return EM_ERROR;
}
return EM_SUCCESS;
}
int P_sem(int argc, void *argv)
{
_loopbuf *loopbuf = (_loopbuf *)argv;
NU_Obtain_Semaphore(loopbuf->sem,NU_SUSPEND);
return EM_SUCCESS;
}
int V_sem(int argc, void *argv)
{
_loopbuf *loopbuf = (_loopbuf *)argv;
NU_Release_Semaphore(loopbuf->sem);
return EM_SUCCESS;
}
int PV_int_init(int argc, void *argv)
{
return EM_SUCCESS;
}
int P_int(int argc, void *argv)
{
_loopbuf *loopbuf = (_loopbuf *)argv;
loopbuf->int_level = NU_Local_Control_Interrupts(NU_DISABLE_IRQ);
return EM_SUCCESS;
}
int V_int(int argc, void *argv)
{
_loopbuf *loopbuf = (_loopbuf *)argv;
NU_Local_Control_Interrupts(loopbuf->int_level );
return EM_SUCCESS;
}
int loop_init(_loopbuf *loopbuf,char *name,unsigned int max,char mode)
{
if(loopbuf==NULL)
return -99;
memcpy(loopbuf->name,name,strlen(name));
loopbuf->len = 0;
loopbuf->read = 0;
loopbuf->write = 0;
loopbuf->max = max;
/* now malloc buf */
loopbuf->buf = EA_pvMalloc(max);
if(!loopbuf->buf)
{
return EM_ERROR;
}
memset(loopbuf->buf,0x00,max);
if(mode==EM_LOOPBUF_THREAD_THREAD)
{
loopbuf->PV_init = PV_sem_init;
loopbuf->P = P_sem;
loopbuf->V = V_sem;
}
else if(mode==EM_LOOPBUF_THREAD_INT) /* THREAD & INT */
{
loopbuf->PV_init = PV_int_init;
loopbuf->P = P_int;
loopbuf->V = V_int;
}
else
{
loopbuf->PV_init = NULL;
loopbuf->P = NULL;
loopbuf->V = NULL;
}
if(loopbuf->PV_init!=NULL)
{
if((*(loopbuf->PV_init))(0,(void *)loopbuf)!=EM_SUCCESS)
return EM_ERROR;
}
return EM_SUCCESS;
}
int loop_write(_loopbuf *loopbuf,const char *buf,unsigned int len)
{
unsigned int i = 0;
int ret = 0;
if(loopbuf==NULL)
return -99;
if(loopbuf->P!=NULL)
(*(loopbuf->P))(0,(void *)loopbuf);
if(!buf||!loopbuf||len<=0)
{
TRACE("%s: argu error!\n",__FUNCTION__);
ret = -1;
goto loop_write_err;
}
if(loopbuf->len+len>loopbuf->max)
{
TRACE("%s: not enough buf want %d remain %d\n",__FUNCTION__,len,loopbuf->len);
ret = -2;
goto loop_write_err;
}
for(i=0;i<len;i++)
{
loopbuf->buf[loopbuf->write++] = buf[i];
loopbuf->write%=loopbuf->max;
loopbuf->len++;
}
if(loopbuf->len>loopbuf->max)
{
TRACE("%s: fata error, len overflow %d!\n",__FUNCTION__,loopbuf->len);
loopbuf->len = loopbuf->max;
ret = -3;
goto loop_write_err;
}
if(loopbuf->V!=NULL)
(*(loopbuf->V))(0,(void *)loopbuf);
return len;
loop_write_err:
if(loopbuf->V!=NULL)
(*(loopbuf->V))(0,(void *)loopbuf);
return ret;
}
int loop_read(_loopbuf *loopbuf,char *buf,unsigned int len)
{
int i = 0;
int readlen = 0;
int ret = 0;
if(loopbuf==NULL)
return -99;
if(loopbuf->P!=NULL)
(*(loopbuf->P))(0,(void *)loopbuf);
if(!buf||!loopbuf||len<=0)
{
TRACE("%s: argu error!\n",__FUNCTION__);
ret = -1;
goto loop_read_err;
}
readlen = loopbuf->len<len?loopbuf->len:len;
for(i=0;i<readlen;i++)
{
buf[i] = loopbuf->buf[loopbuf->read++];
loopbuf->read%=loopbuf->max;
loopbuf->len--;
}
if(loopbuf->V!=NULL)
(*(loopbuf->V))(0,(void *)loopbuf);
return readlen;
loop_read_err:
if(loopbuf->V!=NULL)
(*(loopbuf->V))(0,(void *)loopbuf);
return ret;
}
int loop_clr_end(_loopbuf *loopbuf,char *buf)
{
int ret = 0;
if(loopbuf==NULL)
return -99;
if(loopbuf->P!=NULL)
(*(loopbuf->P))(0,(void *)loopbuf);
if(!buf||!loopbuf||loopbuf->len<=0)
{
TRACE("%s: argu error!\n",__FUNCTION__);
ret = -1;
goto loop_clr_end;
}
*buf = loopbuf->buf[loopbuf->write];
if(loopbuf->write==0)
loopbuf->write = loopbuf->max-1;
else
loopbuf->write--;
loopbuf->len--;
if(loopbuf->V!=NULL)
(*(loopbuf->V))(0,(void *)loopbuf);
return 1;
loop_clr_end:
if(loopbuf->V!=NULL)
(*(loopbuf->V))(0,(void *)loopbuf);
return ret;
}
int loop_reset(_loopbuf *loopbuf)
{
if(loopbuf==NULL)
return -99;
if(loopbuf->P!=NULL)
(*(loopbuf->P))(0,(void *)loopbuf);
memset(loopbuf->buf,0x00,loopbuf->max);
loopbuf->write = 0;
loopbuf->read = 0;
loopbuf->len = 0;
if(loopbuf->V!=NULL)
(*(loopbuf->V))(0,(void *)loopbuf);
return EM_SUCCESS;
}
unsigned int loop_size(_loopbuf *loopbuf)
{
return loopbuf->len;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -