队列

作者: 嵌入式工作 | 来源:发表于2018-04-25 17:32 被阅读0次

    支持对块数据的操作

    1初始化化队列

    void queue_dt_init(STU_QUEUE *StuQueue,uint8_t *pbuf,uint16_t buf_len,uint8_t max_fram_len);
    传入参数:
    pbuf为指向队列的缓存空间
    buf_len输入参数指向缓存空间的大小
    max_fram_len 表示最大的数据块长度

    使用举例:
    uint8_t buf[512];//每次入队的数据长度最大20 字节
    STU_QUEUE TestStuQueue;
    queue_dt_init(&TestStuQueue,buf,512,20);

    2一帧数据入队列

    bool queue_dt_in(STU_QUEUE *StuQueue,uint8_t *datain,uint8_t len);
    传入参数:
    datain指向入队一帧的数据
    len指向入队一帧的数据长度,长度不可以超过初始化的参数max_fram_len
    使用举例:
    queue_dt_in(&TestStuQueue,"123456789",9);//存入长度为9的一帧数据
    queue_dt_in(&TestStuQueue,"1234567890123456789",19);//存入长度为19的一帧数据

    3从队列取出一帧数据,然后从队列中删除这这帧数据

    bool queue_dt_out(STU_QUEUE *StuQueue,uint8_t pdata,uint8_t data_len);
    传入参数:
    pdata指向取出的一帧数据
    data_len指向取出的一帧数据的长度
    使用举例:
    uint8_t buf[20];
    uint8_t buflen;
    if(true==queue_dt_out(&TestStuQueue,&buf,&buflen))
    {
    queue_dt_delete(&TestStuQueue,1);
    }

    .c文件

    
    void queue_dt_init(STU_QUEUE *StuQueue,uint8_t *pbuf,uint16_t buf_len,uint8_t max_fram_len)
    {
    StuQueue->max_fram_len=max_fram_len;
    StuQueue->dt_in=0;
    StuQueue->dt_out=0;
    StuQueue->dt_buf=pbuf;
    StuQueue->max_fram=buf_len/(max_fram_len+1);
    
    }
    
    /*
    return : 
    true: queue is empty
    false: queue have data
    */
    
    bool queue_is_empty(STU_QUEUE *StuQueue)
    {
        if(StuQueue->dt_in==StuQueue->dt_out)
        return true;
        else
        return false;
    }
    
    
    /*
    return : 
    true: para is right
    false: para is err,or queue full
    */
    
    bool queue_dt_in(STU_QUEUE *StuQueue,uint8_t *datain,uint8_t len)
    {   
        uint8_t *buf;
        bool ret=true;
        if(len>StuQueue->max_fram_len)// length is too long
        {
            len=StuQueue->max_fram_len;
            ret=false;
        }
        
        if(((StuQueue->dt_in+1)%StuQueue->max_fram)==StuQueue->dt_out)//queue is full
        {
        ret=false;
        }
        
        buf= (StuQueue->dt_buf)+(StuQueue->dt_in)*(StuQueue->max_fram_len+1);
        memcpy(&buf[1],datain,len);
        buf[0]=len;
        StuQueue->dt_in++;
        StuQueue->dt_in%=StuQueue->max_fram;
        
        return ret;
    
    
    }
    
    /*
    para:   pdata--------->point out data buf
            data_len------>point out data length
    
    return : 
    true:have data in queue
    false:no data in queue
    */
    
    bool queue_dt_out(STU_QUEUE *StuQueue,uint8_t *pdata,uint8_t* data_len)
    {
           
        uint8_t *buf;
        if(StuQueue->dt_in == StuQueue->dt_out) 
        {
            return false;
        }
        else
        {
            buf= (StuQueue->dt_buf)+(StuQueue->dt_out)*(StuQueue->max_fram_len+1);
            *data_len=buf[0];
            memcpy(pdata,&buf[1],*data_len);
            return true;
        }
    }
    
    /*
    para:   cnt -->1 means deletes n frams
            
    */
    void queue_dt_delete(STU_QUEUE *StuQueue,uint8_t cnt)
    {
        uint16_t i,length;
    
        if(cnt == 0) return;
    
        length=cnt;
    
        for(i=0;i<length;i++)
        {
    
            if(StuQueue->dt_in == StuQueue->dt_out) 
            {
            return;
            }
            StuQueue->dt_out++;
            StuQueue->dt_out%=StuQueue->max_fram;
    
        }
    }
    
    

    .h文件

    typedef struct
    {
    uint8_t max_fram_len;  //uint16_t
    uint8_t dt_in;      //uint16_t
    uint8_t dt_out;     //uint16_t
    uint8_t max_fram;
    uint8_t *dt_buf;
    }STU_QUEUE;
    
    
    void queue_dt_delete(STU_QUEUE *StuQueue,uint8_t cnt);
    bool queue_dt_out(STU_QUEUE *StuQueue,uint8_t *pdata,uint8_t* data_len);
    bool queue_dt_in(STU_QUEUE *StuQueue,uint8_t *datain,uint8_t len);
    bool queue_is_empty(STU_QUEUE *StuQueue);
    void queue_dt_init(STU_QUEUE *StuQueue,uint8_t *pbuf,uint16_t buf_len,uint8_t max_fram_len);
    

    相关文章

      网友评论

          本文标题:队列

          本文链接:https://www.haomeiwen.com/subject/yzpylftx.html