eRPC:通过实现双向请求的串行通讯传输(dual serial transport)支持client/server混合运行
Dual serial transport
概述
eRPC 的默认的设计模型是简单的主从模式,也就是设备A上运行服务,另一个设备B主动发起请求调用A的服务,但在实际的应用中,我们需要双向的请求,也就是说设备A,设备B互为主从,两台设备上都会运行服务供对方调用。在这种模式下,原有的串行通讯传输(SerialTransport)实现就不能满足要求,因为设备接收到的数据无法知道是给server的请求(Requst),还是给client的响应(Response)。
如果要实现上述的双向请求并不复杂,只要修改串行通讯传输(SerialTransport)的实现,在发送数据时,多发送一个数据类型的标志,这样接收方收到数据时先判断这个标志,如果是给server端的Request,后续的数据就让server接收,如果是给client端的Response,就让client接收。
由此就可以实现一个支持双向请求的串行数据传输(dual serial transport).通过只修改传输层,就可以让eRPC框架实现client/server混合运行。
实现逻辑
如下图是Dual serial transport的实现模型。
因为client/server混合运行时,client和server都会发送数据也都会接收数据,所以关键的问题就是通过数据类型标志(segType),让接收到的数据被正确的接收端(client或server)接收。
数据发送
为了防止client/server的数据发送能同时正常执行,设计了一个发送数据互斥锁(send_lock),使用互斥锁将client和server发送数据的操作严格区分开。
在发送正式数据之前先发送一个数据类型标志(segType)标志
数据接收
为了确保client/server能正确收到自己应该接收的数据,设计了三个数据接收信号量:
变量名 | 说明 | 备注 |
---|---|---|
server_semaphore | server 端数据接收信号量 | 初始状态下server端接收请求数据时被此信号量阻塞,等待被开关线程收唤醒 |
client_semaphore | client 端数据接收信号量 | 初始状态下cliennt端接收响应数据时被此信号量阻塞,等待被开关线程收唤醒 |
switch_semaphore | 数据开关线程 数据接收信号量 | 开关线程负责读取数据类型标志(segType),并根据标志唤醒server或client接收数据 |
当数据开关线程唤醒server或client接收数据后,自己就进入阻塞状态,等待server或client端的唤醒
当server或client被被开关线程收唤醒接收完数据后,会设置switch_semaphore信号量唤醒开关线程准备接收下一个数据类型标志(segType)
上述三个数据接收信号量和发送数据互斥锁定义在
erpc_setup_dual_serial.cpp
数据开关线程的实现在:
DualSerialTransport::serverThread
在原有的SerialTransport的数据发送函数基础上,DualSerialTransport 做了简单修改,增加了信号量等待和发送数据类型标志(segType)动作,参见:
DualSerialTransport::underlyingSend
在原有的SerialTransport的数据接收函数基础上,DualSerialTransport 增加了信号量等待动作,参见:
DualSerialTransport::underlyingReceive
测试验证
关于双向数据传输完整的测试代码参见
https://gitee.com/l0km/facelog/blob/dev3/facelog-client-cpp/dependencies/erpc/test/erpc_dual_test.cpp
eRPC:通过实现双向请求的串行通讯传输(dual serial transport)支持client/server混合运行相关推荐
- promise实现多个请求并行串行执行
早上查资料,偶然发现这个话题,发现自己并不会,于是乎,下来研究了一下. 想想之前我们用jquery写请求的时候,要实现请求的串行执行,我们可能是这么做的. $.ajax({url: '',data: ...
- 基于51的串行通讯原理及协议详解(uart)
串行与并行通讯方式 并行:控制简单,传输速度快.线多,长距离成本较高且同时接受困难. 串行:将数据字节分成一位一位的行驶在一条传输线上进行传输.如图: 同步与异步串行通讯方式 同步串行通讯方式:同步通 ...
- 【Arduino】使用C#实现Arduino与电脑进行串行通讯
在给Arduino编程的时候,因为没有调试工具,经常要通过使用串口通讯的方式调用Serial.print和Serial.println输出Arduino运行过程中的相关信息,然后在电脑上用Arduin ...
- [转载]Palm 串行通讯GPS数据读取的实现
Palm 串行通讯GPS数据读取的实现 关于J2ME程序编写的教程,各大网站均有介绍.但是J2ME教程的学习与实际应用毕竟还有一段距离.笔者从事J2ME一年多, 已经成功地开发出基于无线互联网palm ...
- 结合实际代码谈常见串行通讯方式—USART、SPI以及IIC
按数据传送的方式,通讯可分为串行通讯与并行通讯,串行通讯是指设备之间通过少量数据信号线(一般是8 根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,而并行通讯一般是指使用8.16 ...
- 三菱 fx2n 通信 linux 代码,三菱FX2N PLC串行通讯指令(FNC 80 RS)
三菱FX2N PLC串行通讯指令(FNC 80 RS) 串行通讯指令(FNC 80 RS) 1.指令格式: [RS D0 K8 D10 K8] 发送数据帧起始地址和 ...
- CAN总线技术 | 物理层02 - CAN总线的异步串行通讯
文章目录 一.前言 二.如何解决波特率误差带来的通信错误? 三.填充位 一.前言 广州虹科录制的CAN总线技术课程非常不错,建议同学们学习一下.B站的地址:https://www.bilibili.c ...
- 异步串行通讯和同步串行通讯对比
异步串行通讯和同步串行通讯对比 作者:刘洪涛,华清远见嵌入式学院高级讲师,ARM ATC授权培训讲师. 在计算机系统中,CPU和外部通信有两种通信方式:并行通信和串行通信.而按照串行数据的时钟控制方式 ...
- 单片机的串行通讯就是排成一队走,并行就是排成一列走
单片机的串行通讯就是排成一队走,并行就是排成一列走 ///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领 ...
- 串行通讯 -- IIC通讯原理
前言 I2C是最常见的串行通讯,广泛应用于芯片之间通讯.常见的有EEPROM,温度传感器,触摸屏等.本文力求简单明了把I2C通讯协议说清楚.后面文章会举一些I2C器件示例,让大家更深入理解I2C. I ...
最新文章
- Java学习总结:49(字符缓冲流:BufferedReader)
- 黑洞最新照片来了:只多了炫酷光纹,却让物理学家解开喷流大谜题
- mysql update使用select的结果
- 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-9底层驱动之USART
- kux转换为mp4软件_kux2mp4(优酷kux转换为mp4软件)下载-kux2mp4(优酷kux转换为mp4软件)免费版下载v2021...
- 原生JS实现淡入淡出效果(fadeIn/fadeOut/fadeTo)
- 60小时打通Python任督二脉
- 倒序查10条数据_10 | 怎么给字符串字段加索引?
- PP视频怎么设置退出程序时清空本地播放记录
- ShellSort 希尔排序
- mysql 创建索引 终止_技术分享 | 常见索引问题处理
- CCF202006-3 Markdown渲染器(100分)【文本处理】
- [linux]ssh配置文件ssh_config和sshd_config的区别
- 【GYM-100889 D】Dicy Numbers【数学推导求解】
- Googel knowledge graph API
- 惠康游戏手柄 WE-8400 Windows 10 驱动教程
- php php拼接字符串函数_PHP_PHP开发中常用的字符串操作函数,1,拼接字符串 拼接字符串是最 - phpStudy...
- html标签选择器只认最后一个,选择某类的最后一个元素——CSS3伪类选择器走过的坑...
- iis7无法写入配置文件,更换进入方式解决
- vue中如何实现换肤?