⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loopbuf.c

📁 modem数据通信源码
💻 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 + -