目录

1、ringbuffer

1.1、ringbuffer结构体

1.1.1、镜像值

1.1.2、缓存区空

1.1.3、缓存区满

1.2、ringbuffer接口

1.2.1、rt_ringbuffer_status()函数

1.2.2、rt_ringbuffer_get_size()函数

1.2.3、rt_ringbuffer_data_len()函数

1.2.4、rt_ringbuffer_space_len宏

1.2.5、rt_ringbuffer_reset()函数

1.2.6、rt_ringbuffer_init()函数

1.2.7、rt_ringbuffer_create()函数

1.2.8、rt_ringbuffer_destroy()函数

1.2.9、rt_ringbuffer_putchar()函数

1.2.10、rt_ringbuffer_putchar_force()函数

1.2.11、rt_ringbuffer_put()函数

1.2.12、rt_ringbuffer_put_force()函数

1.2.13、rt_ringbuffer_getchar()函数

1.2.14、rt_ringbuffer_get()函数

1.2.15、rt_ringbuffer_peek()函数

2、ringblk_buf

2.1、块与块队列

2.1.1、分配块

2.1.2、块队列

2.2、ringblk_buf外部访问接口

2.2.1、rt_rbb_init()函数

2.2.2、rt_rbb_create()函数

2.2.3、rt_rbb_destroy()函数

2.2.4、rt_rbb_get_buf_size()函数

2.3、ringblk_buf块接口

2.3.1、rt_rbb_blk_alloc()函数

2.3.2、rt_rbb_blk_free()函数

2.3.3、rt_rbb_blk_put()函数

2.3.4、rt_rbb_blk_get()函数

2.3.5、rt_rbb_blk_size()函数

2.3.6、rt_rbb_blk_buf()函数

2.3、ringblk_buf块队列接口

2.3.1、rt_rbb_blk_queue_get()函数

2.3.2、rt_rbb_blk_queue_len()函数

2.3.3、rt_rbb_blk_queue_buf()函数

2.3.4、rt_rbb_blk_queue_free()函数

2.3.5、rt_rbb_next_blk_queue_len()函数

2.4、ringblk_buf内部函数

2.4.1、find_empty_blk_in_set()函数

2.4.2、list_append()函数

2.4.3、list_remove()函数

3、dataqueue

3.1、dataqueue控制块

3.1.1、低水位标志

3.1.2、事件通知

3.2、dataqueue接口

3.2.1、rt_data_queue_init()函数

3.2.2、rt_data_queue_reset()函数

3.2.3、rt_data_queue_deinit()函数

3.2.4、rt_data_queue_len()函数

3.2.5、rt_data_queue_push()函数

3.2.6、rt_data_queue_pop()函数

3.2.7、rt_data_queue_peek()函数


1、ringbuffer

ringbuffer其实就是个环形缓冲区。通过导入头文件 #include <ipc/ringbuffer.h> 即可直接使用。如设备驱动serial_v2就使用到了ringbuffer。

注:RT-Thread的ringbuffer组件并未提供线程阻塞的功能,因此 ringbuffer 本质上是一个全局共享的对象,多线程使用时注意使用互斥锁保护。

1.1、ringbuffer结构体

struct rt_ringbuffer
{rt_uint8_t *buffer_ptr; //指向缓冲区的指针rt_uint16_t read_mirror : 1; //读镜像值rt_uint16_t read_index : 15; //读索引rt_uint16_t write_mirror : 1; //写镜像值rt_uint16_t write_index : 15; //写索引rt_int16_t buffer_size; //缓冲区的大小
};

1.1.1、镜像值

镜像值可用于判断缓冲区内数据是满还是空。

1)每当write_index(写索引)环绕缓冲区时,write_mirror(写镜像值)翻转一次。

2)每当read_index(读索引)环绕缓冲区时,read_mirror(读镜像值)翻转一次。

1.1.2、缓存区空

当 write_index == read_index 且 read_mirror == write_mirror 时,缓冲区内数据为空。

1.1.3、缓存区满

当write_index == read_index 且 read_mirror != write_mirror 时,缓冲区内数据已满。 

1.2、ringbuffer接口

1.2.1、rt_ringbuffer_status()函数

获取ringbuffer环形缓冲区状态。

enum rt_ringbuffer_state rt_ringbuffer_status(struct rt_ringbuffer *rb)
RT_RINGBUFFER_EMPTY 缓冲区空
RT_RINGBUFFER_FULL 缓冲区满
RT_RINGBUFFER_HALFFULL 缓冲区非空未满

1.2.2、rt_ringbuffer_get_size()函数

该接口用于获取rb 指向的 ringbuffer缓存区大小。

rt_uint16_t rt_ringbuffer_get_size(struct rt_ringbuffer *rb)

1.2.3、rt_ringbuffer_data_len()函数

该接口用于获取 rb 指向的 ringbuffer 内存储的数据大小。

rt_size_t rt_ringbuffer_data_len(struct rt_ringbuffer *rb)

1.2.4、rt_ringbuffer_space_len宏

该接口用于获取 rb 指向的 ringbuffer 内剩余可存储的数据大小。

#define rt_ringbuffer_space_len(rb) ((rb)->buffer_size - rt_ringbuffer_data_len(rb))

1.2.5、rt_ringbuffer_reset()函数

该接口用于将rb指向的ringbuffer复位。其实就是将成read_mirror、read_index、write_mirro、write_inde成员置为0。

void rt_ringbuffer_reset(struct rt_ringbuffer *rb)

1.2.6、rt_ringbuffer_init()函数

静态初始化 ringbuffer。需要用户自己创建一个静态缓冲区,并传入缓冲区指针 pool 和缓冲区大小 size ,而后初始化 rb 所指向的 ringbuffer 结构体。

void rt_ringbuffer_init(struct rt_ringbuffer *rb,rt_uint8_t           *pool,rt_int16_t            size)

1.2.7、rt_ringbuffer_create()函数

动态创建并初始化ringbuffer。根据传入的length参数动态分配 length 个字节大小的缓冲区,创建 ringbuffer 结构体。

struct rt_ringbuffer *rt_ringbuffer_create(rt_uint16_t size)

1.2.8、rt_ringbuffer_destroy()函数

该接口会释放掉rt_ringbuffer_create()分配的内存。

void rt_ringbuffer_destroy(struct rt_ringbuffer *rb)

1.2.9、rt_ringbuffer_putchar()函数

该接口向rb指向的ringbuffer里写入一个字节 ch,并返回写入的字节数。若 ringbuffer 已满,则写入失败,并返回0 。

rt_size_t rt_ringbuffer_putchar(struct rt_ringbuffer *rb, const rt_uint8_t ch)

1.2.10、rt_ringbuffer_putchar_force()函数

该接口也是向 rb 指向的 ringbuffer 里写入一个字节 ch,并返回写入的字节数。不过当 ringbuffer 已满时,它也会执行写入操作,即用新的值覆盖掉旧的值。

rt_size_t rt_ringbuffer_putchar_force(struct rt_ringbuffer *rb, const rt_uint8_t ch)

1.2.11、rt_ringbuffer_put()函数

该接口向 rb 指向的 ringbuffer 里写入数据块,数据块的起始地址为 ptr,数据块大小为 length,并返回写入的字节数。若写入时 ringbuffer 已满,则剩余的写入数据被抛弃,不再继续写入。

rt_size_t rt_ringbuffer_put(struct rt_ringbuffer *rb,const rt_uint8_t     *ptr,rt_uint16_t           length)

1.2.12、rt_ringbuffer_put_force()函数

该接口向 rb 指向的 ringbuffer 里写入数据块,数据块的起始地址为 ptr,数据块大小为 length,并返回写入的字节数。不过若写入时 ringbuffer 已满,该接口会继续写入剩余的数据,即用新的数据覆盖旧的数据。

rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb,const rt_uint8_t     *ptr,rt_uint16_t           length)

1.2.13、rt_ringbuffer_getchar()函数

该接口从 rb 指向的 ringbuffer 里读出一个字节,该字节通过 ch 返回,ch 是一个字节的缓冲区,供接口内部填充数据,该接口返回读取的字节数。

rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer *rb, rt_uint8_t *ch)

1.2.14、rt_ringbuffer_get()函数

该接口从 rb 指向的 ringbuffer 里读出 length 个字节,并存入 ptr 所指向的缓冲区。该接口返回实际读取的字节数。

rt_size_t rt_ringbuffer_get(struct rt_ringbuffer *rb,rt_uint8_t           *ptr,rt_uint16_t           length)

1.2.15、rt_ringbuffer_peek()函数

该接口用于获取 rb 指向的 ringbuffer 内部缓冲区第一个可读数据的地址,并保存到 *ptr,该接口返回*ptr大小。

rt_size_t rt_ringbuffer_peek(struct rt_ringbuffer *rb, rt_uint8_t **ptr)

注:当前版本该函数会读数据并取出数据(与一般peek()函数读数据但并不取出数据的行为有区别)!但会保证不会越界(读取大小返回读索引read_index到缓存区结尾buffer_size的数据)。

2、ringblk_buf

ringblk_buf其实就是个环块缓冲区。通过导入头文件 #include <ipc/ringblk_buf.h> 即可直接使用。实际应用中使用ringblk_buf的情况应该比较少。

struct rt_rbb
{rt_uint8_t *buf; //缓存区指针rt_size_t buf_size; //缓存区大小rt_rbb_blk_t blk_set; //块设置rt_size_t blk_max_num; //最大块数量/* saved the initialized and put status blocks */rt_slist_t blk_list;/* point to tail node */rt_slist_t *tail;/* free node list */rt_slist_t free_list;
};
typedef struct rt_rbb *rt_rbb_t;

2.1、块与块队列

2.1.1、分配块

分配块时可能出现2种情况。

1)head小于等于tail

先判断empty1是否有足够空间可分配。若空间不足,则尝试从empty2分配。

 2)head大于tail

直接尝试从empty1分配。

2.1.2、块队列

块队列包含状态为RT_RBB_BLK_PUT的连续块(不wrap)便于一次性管理多个连续块。

2.2、ringblk_buf外部访问接口

2.2.1、rt_rbb_init()函数

静态初始化ringblk_buf。需要用户自己创建一个静态缓冲区,并传入缓冲区指针 pool 和缓冲区大小 size ,而后初始化 rb 所指向的 ringbuffer 结构体。

void rt_rbb_init(rt_rbb_t rbb, rt_uint8_t *buf, rt_size_t buf_size, rt_rbb_blk_t block_set, rt_size_t blk_max_num)

2.2.2、rt_rbb_create()函数

动态创建ringblk_buf。

rt_rbb_t rt_rbb_create(rt_size_t buf_size, rt_size_t blk_max_num)

2.2.3、rt_rbb_destroy()函数

该接口释放rt_rbb_create()函数分配的内存。

void rt_rbb_destroy(rt_rbb_t rbb)

2.2.4、rt_rbb_get_buf_size()函数

该接口获取环块缓冲区大小。

rt_size_t rt_rbb_get_buf_size(rt_rbb_t rbb)

2.3、ringblk_buf块接口

2.3.1、rt_rbb_blk_alloc()函数

该函数按给定的大小分配块。当分配成功时,block将被添加到块链表blk_list中。

rt_rbb_blk_t rt_rbb_blk_alloc(rt_rbb_t rbb, rt_size_t blk_size)

2.3.2、rt_rbb_blk_free()函数

该接口用于释放块block。即从块链表移除,设置块状态为RT_RBB_BLK_UNUSED并加入到可用块链表。

void rt_rbb_blk_free(rt_rbb_t rbb, rt_rbb_blk_t block)

2.3.3、rt_rbb_blk_put()函数

该接口将块block的状态设置为RT_RBB_BLK_PUT。

void rt_rbb_blk_put(rt_rbb_blk_t block)

2.3.4、rt_rbb_blk_get()函数

该接口从块链表中获取一个状态为RT_RBB_BLK_PUT的块,并将该块的状态设置为RT_RBB_BLK_GET。

rt_rbb_blk_t rt_rbb_blk_get(rt_rbb_t rbb)

2.3.5、rt_rbb_blk_size()函数

该接口用于获取指定块block的大小。

rt_size_t rt_rbb_blk_size(rt_rbb_blk_t block)

2.3.6、rt_rbb_blk_buf()函数

该接口用于获取指定块block的缓冲区。

rt_uint8_t *rt_rbb_blk_buf(rt_rbb_blk_t block)

2.3、ringblk_buf块队列接口

2.3.1、rt_rbb_blk_queue_get()函数

该接口用于获取一个可用块队列。

rt_size_t rt_rbb_blk_queue_get(rt_rbb_t rbb, rt_size_t queue_data_len, rt_rbb_blk_queue_t blk_queue)

2.3.2、rt_rbb_blk_queue_len()函数

该接口用于获取块队列上所有块的总大小。

rt_size_t rt_rbb_blk_queue_len(rt_rbb_blk_queue_t blk_queue)

2.3.3、rt_rbb_blk_queue_buf()函数

该接口用于获取块队列的缓存区地址。

rt_uint8_t *rt_rbb_blk_queue_buf(rt_rbb_blk_queue_t blk_queue)

2.3.4、rt_rbb_blk_queue_free()函数

该接口调用rt_rbb_blk_free()函数释放块队列的所有块。

void rt_rbb_blk_queue_free(rt_rbb_t rbb, rt_rbb_blk_queue_t blk_queue)

2.3.5、rt_rbb_next_blk_queue_len()函数

该接口返回从下一个可以创建块队列的长度。

rt_size_t rt_rbb_next_blk_queue_len(rt_rbb_t rbb)

2.4、ringblk_buf内部函数

2.4.1、find_empty_blk_in_set()函数

该接口用于从空闲块链表free_list中取出空闲块。

static rt_rbb_blk_t find_empty_blk_in_set(rt_rbb_t rbb)

2.4.2、list_append()函数

该接口用于将块节点加入到块链表队尾。

void list_append(rt_rbb_t rbb, rt_slist_t *n)

2.4.3、list_remove()函数

该接口用于将块节点n从到块链表中移除。

rt_slist_t *list_remove(rt_rbb_t rbb, rt_slist_t *n)

3、dataqueue

dataqueue是个数据队列。通过导入头文件 #include <ipc/dataqueue.h> 即可直接使用。

3.1、dataqueue控制块

struct rt_data_item
{const void *data_ptr; //数据指针rt_size_t data_size; //数据大小
};struct rt_data_queue
{rt_uint32_t magic; //幻数rt_uint16_t size; //队列大小rt_uint16_t lwm; //低水位标志rt_uint16_t get_index : 15; //出队索引rt_uint16_t is_empty  : 1; //队列空标志rt_uint16_t put_index : 15; //入队索引rt_uint16_t is_full   : 1; //队列满标志struct rt_data_item *queue; //队列数据rt_list_t suspended_push_list; //入队挂起链表rt_list_t suspended_pop_list; //出队挂起链表void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event); //事件通知回调函数
};

3.1.1、低水位标志

当数据队列中的数据数小于低水位标志时,将会唤醒等待写入数据的线程。

3.1.2、事件通知

#define RT_DATAQUEUE_EVENT_UNKNOWN   0x00
#define RT_DATAQUEUE_EVENT_POP       0x01
#define RT_DATAQUEUE_EVENT_PUSH      0x02
#define RT_DATAQUEUE_EVENT_LWM       0x03

1)当数据队列入队时,调用evt_notify()通知RT_DATAQUEUE_EVENT_PUSH事件

2)当数据队列出队时,调用evt_notify()通知RT_DATAQUEUE_EVENT_POP事件

3)当数据队列出队,且数据队列的数据数小于低水位标志lwm时,调用evt_notify()通知RT_DATAQUEUE_EVENT_LWM事件

3.2、dataqueue接口

3.2.1、rt_data_queue_init()函数

该接口用于初始化数据队列。初始化数据队列控制块并设置通知回调函数。

rt_err_t rt_data_queue_init(struct rt_data_queue *queue,rt_uint16_t size,rt_uint16_t lwm,void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event))

3.2.2、rt_data_queue_reset()函数

该接口用于重置数据队列。

注:调用该接口会唤醒所有应该资源而挂起的线程。

void rt_data_queue_reset(struct rt_data_queue *queue)

3.2.3、rt_data_queue_deinit()函数

此函数将取消数据队列的初始化。

rt_err_t rt_data_queue_deinit(struct rt_data_queue *queue)

3.2.4、rt_data_queue_len()函数

该接口用于获取数据队列中的已使用的数量。

rt_uint16_t rt_data_queue_len(struct rt_data_queue *queue)

3.2.5、rt_data_queue_push()函数

该接口用于将数据写入数据队列。如果数据队列已满,线程将挂起指定的时间。

rt_err_t rt_data_queue_push(struct rt_data_queue *queue,const void *data_ptr,rt_size_t data_size,rt_int32_t timeout)

3.2.6、rt_data_queue_pop()函数

该接口用于将从数据队列中弹出数据。如果数据队列为空,线程将挂起指定的时间。

rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,const void **data_ptr,rt_size_t *size,rt_int32_t timeout)

3.2.7、rt_data_queue_peek()函数

该接口用于获取但查看数据队列中的数据(不取出)。

rt_err_t rt_data_queue_peek(struct rt_data_queue *queue,const void **data_ptr,rt_size_t *size)

Device IPC-1相关推荐

  1. python 通过ONVIF控制IPC

    一.ONVIF介绍 什么是ONVIF ONVIF的功能特点 二.使用Python来控制IPC Python的环境搭建 使用Python通过ONVIF Get和Set IPC参数 三.总结 ONVIF的 ...

  2. centos7修改服务器密码,centos7 上搭建MQTT服务器,修改密码,设置权限并进行测试。...

    ①.完成MQTT服务器的搭建 ②.集成MQTT到springboot后台 ③.使MQTT支持WebSocket以便前端与springboot进行消息收发. ④.集成MQTT到工控机中 1.安装 mos ...

  3. SysLink UserGuide

    SysLink UserGuide (来自http://processors.wiki.ti.com/index.php/SysLink_UserGuide) SysLink User Guide C ...

  4. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路(1)

    上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划简要介绍了Android系统进程间通信机制Binder的总体架构,它由Client.Server.Service Mana ...

  5. Windows Mobile使用Shared Memory(共享内存)进行IPC(进程间通信)的开发

    背景 在Unix-like系统进行IPC(Inter-process communication)通信,Shared memory是效率最高的,我称之为IPC的王中王. 简介 本文讲述在Windows ...

  6. IPC 之 Binder 初识

    概述 最近在看Android 的 IPC 机制,想要系统的研究一下,然后就走到了 Binder 这里,发现这个东西真是复杂,查看了一下些文章想要记录下.想要自己写但是发现一篇文章已经写的非常好了,就转 ...

  7. oracle no space left,ORA-09817/Linux-x86_64 Error: 28: No space left on device/ORA-01075

    1.通过sqlplus / as sysdba在服务器上无法登录oracle,并提示一下错误 ERROR: ORA-09817: Write to audit file failed. Linux-x ...

  8. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...

  9. Android进程间通信(IPC)机制Binder简要介绍和学习计划

    在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中.那么,不在同一个进程的 ...

  10. onvif 客户端 linux,Linux下onvif客户端关于ipc摄像头的搜索

    设备搜索:要访问一个IPC摄像头,或者说要调用IPC摄像头提供的WEB服务接口,就要先知道其IP地址,这就是设备发现的过程,或者叫设备搜索的过程.IPC摄像头用的是239.255.255.250(端口 ...

最新文章

  1. 对话微软黄学东:语音语言技术是镶在 AI 皇冠上的明珠
  2. python学习系列day3-python基础
  3. 视音频数据处理入门:AAC音频码流解析
  4. android.process.media+sd,android P系统WRITE_MEDIA_STORAGE添加读写SD卡权限
  5. 【TensorFlow】TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法)
  6. 阵列卡不能格式化磁盘问题所在
  7. python调用实例做父类_Python super() 调用父类方法, 但是父类中 self 并不是父类的实例而是子类的实例?...
  8. anaconda 清华镜像及对应下载
  9. Cookie中设置了 HttpOnly,Secure 属性,有效的防止XSS攻击,X-Frame-Options 响应头避免点击劫持...
  10. java zinterstore_Java架构之Redis系列:通过文章点赞排名案例学习Sortedset命令
  11. Vue slot用法(2018.09.05 星期三)
  12. 使用Chrome开发者工具下载Instagram上的图片
  13. MT8665原理图芯片资料介绍
  14. Android的基站、WIFI、GPS定位三点定位源码下载
  15. 怎么把PWM信号转为模拟量
  16. 三年级语文计算机之父教学反思,三年级语文教学反思15篇
  17. 神经网络务实:Linux下用GPU玩转TensorFlow
  18. kf 和 ekf 和 ukf 入门
  19. ECharts - 14.小例子:实现日历图
  20. 6个“纽扣”卖2600 索尼动捕设备要捕捉谁?

热门文章

  1. text rank java 实现_使用TextRank实现的关键字提取
  2. java多线程学习之【Exchanger】
  3. 海龟画图 python太阳花_python画图之“小海龟”turtle
  4. Python tkintertools 模块介绍(新版)
  5. 手牵手系列之node+koa2+mpvue全栈(后端)
  6. 一份标准的测试计划包含哪些要素?
  7. 免费远程桌面连接工具合集
  8. IPv6 02-IPv6地址配置
  9. 【Android】5+APP 打包安卓
  10. ORBSLAM2编译依赖(实现视觉SLAM)