Device IPC-1
目录
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相关推荐
- python 通过ONVIF控制IPC
一.ONVIF介绍 什么是ONVIF ONVIF的功能特点 二.使用Python来控制IPC Python的环境搭建 使用Python通过ONVIF Get和Set IPC参数 三.总结 ONVIF的 ...
- centos7修改服务器密码,centos7 上搭建MQTT服务器,修改密码,设置权限并进行测试。...
①.完成MQTT服务器的搭建 ②.集成MQTT到springboot后台 ③.使MQTT支持WebSocket以便前端与springboot进行消息收发. ④.集成MQTT到工控机中 1.安装 mos ...
- SysLink UserGuide
SysLink UserGuide (来自http://processors.wiki.ti.com/index.php/SysLink_UserGuide) SysLink User Guide C ...
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路(1)
上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划简要介绍了Android系统进程间通信机制Binder的总体架构,它由Client.Server.Service Mana ...
- Windows Mobile使用Shared Memory(共享内存)进行IPC(进程间通信)的开发
背景 在Unix-like系统进行IPC(Inter-process communication)通信,Shared memory是效率最高的,我称之为IPC的王中王. 简介 本文讲述在Windows ...
- IPC 之 Binder 初识
概述 最近在看Android 的 IPC 机制,想要系统的研究一下,然后就走到了 Binder 这里,发现这个东西真是复杂,查看了一下些文章想要记录下.想要自己写但是发现一篇文章已经写的非常好了,就转 ...
- 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 ...
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中.那么,不在同一个进程的 ...
- onvif 客户端 linux,Linux下onvif客户端关于ipc摄像头的搜索
设备搜索:要访问一个IPC摄像头,或者说要调用IPC摄像头提供的WEB服务接口,就要先知道其IP地址,这就是设备发现的过程,或者叫设备搜索的过程.IPC摄像头用的是239.255.255.250(端口 ...
最新文章
- 对话微软黄学东:语音语言技术是镶在 AI 皇冠上的明珠
- python学习系列day3-python基础
- 视音频数据处理入门:AAC音频码流解析
- android.process.media+sd,android P系统WRITE_MEDIA_STORAGE添加读写SD卡权限
- 【TensorFlow】TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法)
- 阵列卡不能格式化磁盘问题所在
- python调用实例做父类_Python super() 调用父类方法, 但是父类中 self 并不是父类的实例而是子类的实例?...
- anaconda 清华镜像及对应下载
- Cookie中设置了 HttpOnly,Secure 属性,有效的防止XSS攻击,X-Frame-Options 响应头避免点击劫持...
- java zinterstore_Java架构之Redis系列:通过文章点赞排名案例学习Sortedset命令
- Vue slot用法(2018.09.05 星期三)
- 使用Chrome开发者工具下载Instagram上的图片
- MT8665原理图芯片资料介绍
- Android的基站、WIFI、GPS定位三点定位源码下载
- 怎么把PWM信号转为模拟量
- 三年级语文计算机之父教学反思,三年级语文教学反思15篇
- 神经网络务实:Linux下用GPU玩转TensorFlow
- kf 和 ekf 和 ukf 入门
- ECharts - 14.小例子:实现日历图
- 6个“纽扣”卖2600 索尼动捕设备要捕捉谁?