#ifndef __GTC_FIFO_H_
#define __GTC_FIFO_H_ #ifndef GTC_MAX
#define GTC_MAX(a,b) ((a) > (b) ? (a) : (b))
#endif #ifndef GTC_MIN
#define GTC_MIN(a,b) ((a) < (b) ? (a) : (b))
#endif #ifdef __cplusplus
extern "C"
{
#endif struct gfifo {
unsigned char *buffer; /* the buffer holding the data */
unsigned int size; /* the size of the allocated buffer */
unsigned int in; /* data is added at offset (in % size) */
unsigned int out; /* data is extracted from off. (out % size) */
}; //队列初始化
int gfifo_alloc(struct gfifo *fifo, unsigned int size); //压入队列
unsigned int gfifo_put(struct gfifo *fifo, const unsigned char *buffer, unsigned int len); //弹出队列
unsigned int gfifo_get(struct gfifo *fifo, unsigned char *buffer, unsigned int len); #ifdef __cplusplus
}
#endif #endif
#include "gfifo.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h> /********************************************************
Func Name: gfifo_init
Date Created: 2019-4-1
Description: 初始化
Input:
Output:
Return:
Caution:
*********************************************************/
static void gfifo_init(struct gfifo *fifo, void *buffer, unsigned int size)
{
fifo->buffer = buffer;
fifo->size = size;
fifo->in = ;
fifo->out = ;
} /********************************************************
Func Name: gfifo_roundup
Date Created: 2019-4-1
Description: 扩展
Input:
Output:
Return: size
Caution:
*********************************************************/
static unsigned int gfifo_roundup(unsigned int x)
{
unsigned int i = ;
unsigned int y = ; if (!x)
{
return ;
} for (i = x; i != ; )
{
i >>= ;
y <<= ;
} return y; } /********************************************************
Func Name: gfifo_alloc
Date Created: 2019-4-1
Description: 内存分配
Input:
Output:
Return: error code
Caution:
*********************************************************/
int gfifo_alloc(struct gfifo *fifo, unsigned int size)
{
assert(fifo); unsigned char *buffer; /*
size的值总是在调用者传进来的size参数的基础上向2的幂扩展,这是内核一贯的做法。
这样的好处不言而喻--对kfifo->size取模运算可以转化为与运算,如下:
fifo->in % fifo->size 可以转化为 fifo->in & (fifo->size – 1)
在kfifo_alloc函数中,使用size & (size – 1)来判断size 是否为2幂,如果条件为真,则表示size不是2的幂,然后调用roundup_pow_of_two将之向上扩展为2的幂。
*/
if (size & (size - ))
{
size = gfifo_roundup(size);
} buffer = calloc(, size);
if (NULL == buffer)
{
return -;
} gfifo_init(fifo, buffer, size); return ;
} /********************************************************
Func Name: gfifo_put
Date Created: 2019-4-1
Description: 压入队列
Input:
Output:
Return: 压入队列数据长度
Caution:
*********************************************************/
unsigned int gfifo_put(struct gfifo *fifo, const unsigned char *buffer, unsigned int len)
{
unsigned int left_over = ; /*
计算出实际写入队列数据大小
(fifo->in - fifo->out) 已经使用空间大小
fifo->size - (fifo->in - fifo->out) 可以使用空间大小
len 需要写入数据大小
*/
len = GTC_MIN(len, fifo->size - (fifo->in - fifo->out)); /*
计算出在队列in后面插入数据的大小
fifo->in & (fifo->size - 1) 等同于 fifo->in % fifo->size
fifo->size - (fifo->in & (fifo->size - 1)) 表示in后面可写数据的长度
*/
left_over = GTC_MIN(len, fifo->size - (fifo->in & (fifo->size - ))); //拷贝数据到in后面
memcpy(fifo->buffer + (fifo->in & (fifo->size - )), buffer, left_over); //将剩余的数据拷贝到out前面
memcpy(fifo->buffer, buffer + left_over, len - left_over); //更新in
fifo->in += len; return len;
} /********************************************************
Func Name: gfifo_get
Date Created: 2019-4-1
Description: 弹出队列
Input:
Output:
Return: 弹出队列
Caution:
*********************************************************/
unsigned int gfifo_get(struct gfifo *fifo, unsigned char *buffer, unsigned int len)
{
assert(buffer); unsigned int readable_length = ; /*
计算出实际可读队列数据大小
(fifo->in - fifo->out) 已经使用空间大小
*/ len = GTC_MIN(len, fifo->in - fifo->out); /*
计算出在队列out后面插入数据的大小
fifo->in & (fifo->size - 1) 等同于 fifo->in % fifo->size
fifo->size - (fifo->out & (fifo->size - 1)) 表示out后面可读数据的长度
*/
readable_length = GTC_MIN(len, fifo->size - (fifo->out & (fifo->size - ))); //拷贝数据
memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - )), readable_length); //拷贝能从头部获取的数据
memcpy(buffer + readable_length, fifo->buffer, len - readable_length); //更新out
fifo->out += len; return len;
}

Sword 内核队列二的更多相关文章

  1. Sword 内核队列一

    1.gfifo概述 gfifo是一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只 ...

  2. linux内核(二)内核移植(DM365-DM368开发攻略——linux-2.6.32的移植)

    一.介绍linux-2.6.32: Linux-2.6.32的网上介绍:增添了虚拟化内存 de-duplicacion.重写了 writeback 代码.改进了 Btrfs 文件系统.添加了 ATI ...

  3. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  4. (笔记)Linux内核学习(二)之进程

    一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是线程而不是进程.对 ...

  5. Android组件内核之Fragment管理与内核(二)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下三个内容来介绍Fragment管理与内核: [Fragm ...

  6. 深入理解PHP内核(十二)函数-函数的定义、传参及返回值

    原文链接:http://www.orlion.ga/344/ 一.函数的定义 用户函数的定义从function 关键字开始,如下 function foo($var) {    echo $var; ...

  7. ActiveMQ_点对点队列(二)

      一.本文章包含的内容 1.列举了ActiveMQ中通过Queue方式发送.消费队列的代码(普通文本.json/xml字符串.对象数据) 2.spring+activemq方式   二.配置信息 1 ...

  8. linux内核系列(二)内核数据结构之链表

    双向链表 传统链表与linu内核链表的区别图: 图一 图二 从上图中看出在传统链表中各种不同链表间没有通用性,因为各个数据域不同,而在linux内核中巧妙将链表结构内嵌到数据域结构中使得不同结构之间能 ...

  9. RabbitMQ 消息队列 二

    一:查看MQ的用户角色 rabbitmqctl list_users 二:添加新的角色,并授予权限 rabbitmqctl add_user xiaoyao 123456 rabbitmqctl se ...

随机推荐

  1. 2017中国无人机公开赛 总决赛 CDR Final 竞赛规则

    2017中国无人机公开赛总决赛 CDR Final竞赛规则 V2 二〇一七年八月(修订) 一. 竞赛项目描述(一) 无人机绕标竞速赛(专业组)飞行员通过佩戴眼镜或显示屏采用第一视角飞行,使用无线电遥控 ...

  2. redis(四)

    hash hash用于存储对象,对象的格式为键值对 命令 设置 设置单个属性 HSET key field value 设置多个属性 HMSET key field value [field valu ...

  3. python安装虚拟环境virtualenv

    虚拟环境 虚拟环境是一个将不同项目所需求的依赖分别放在独立的地方的一个工具,它给这些工程创建虚拟的Python环境.它解决了“项目X依赖于版本1.x,而项目Y需要项目4.x”的两难问题,而且使你的全局 ...

  4. 【并查集】Connectivity @ABC049&amp;ARC065/upcexam6492

    Connectivity 时间限制: 1 Sec  内存限制: 128 MB 题目描述 There are N cities. There are also K roads and L railway ...

  5. JAVA自学笔记17

    JAVA自学笔记17 1.Map接口 1)概述 将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值.可以存储键值对的元素 2)与Collection接口的不同: ①Map是双列的 ...

  6. pygame-KidsCanCode系列jumpy-part14-背景音乐及音效

    没有音乐和音效的游戏是没有灵魂的,这回讲解如何处理背景音乐及跳跃音效.加载music及sound的方法,之前已经写过,见:pygame 笔记-8 背景音乐&子弹音效 . 先介绍一个很棒的生成各 ...

  7. Android的Databinding-数据、Map绑定

    本节主要说Collection的字符串数组.List.SparseArray.Map的绑定.先看看xml的布局. <layout xmlns:android="http://schem ...

  8. Java的内存管理机制之内存区域划分

    各位,好久不见.先做个预告,由于最近主要在做Java服务端开发,最近一段时间会更新Java服务端开发相关的一些知识,包括但不限于一些读书笔记.框架的学习笔记.和最近一段时间的思考和沉淀.先从Java虚 ...

  9. Go语言排序算法实现

    // Algorithm project Algorithm.go package Algorithm // 冒泡排序 func BubbleSort(a []int) { n := len(a) ; ...

  10. PL/SQL学习笔记之事务

    一:事务自动提交的开启与关闭 1)开启事务自动提交:则每一个INSERT,UPDATE或DELETE命令执行时,都提交一次事务. SET AUTOCOMMIT ON; 2)关闭事务自动提交:则执行到C ...