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混合运行相关推荐

  1. promise实现多个请求并行串行执行

    早上查资料,偶然发现这个话题,发现自己并不会,于是乎,下来研究了一下. 想想之前我们用jquery写请求的时候,要实现请求的串行执行,我们可能是这么做的. $.ajax({url: '',data: ...

  2. 基于51的串行通讯原理及协议详解(uart)

    串行与并行通讯方式 并行:控制简单,传输速度快.线多,长距离成本较高且同时接受困难. 串行:将数据字节分成一位一位的行驶在一条传输线上进行传输.如图: 同步与异步串行通讯方式 同步串行通讯方式:同步通 ...

  3. 【Arduino】使用C#实现Arduino与电脑进行串行通讯

    在给Arduino编程的时候,因为没有调试工具,经常要通过使用串口通讯的方式调用Serial.print和Serial.println输出Arduino运行过程中的相关信息,然后在电脑上用Arduin ...

  4. [转载]Palm 串行通讯GPS数据读取的实现

    Palm 串行通讯GPS数据读取的实现 关于J2ME程序编写的教程,各大网站均有介绍.但是J2ME教程的学习与实际应用毕竟还有一段距离.笔者从事J2ME一年多, 已经成功地开发出基于无线互联网palm ...

  5. 结合实际代码谈常见串行通讯方式—USART、SPI以及IIC

    按数据传送的方式,通讯可分为串行通讯与并行通讯,串行通讯是指设备之间通过少量数据信号线(一般是8 根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,而并行通讯一般是指使用8.16 ...

  6. 三菱 fx2n 通信 linux 代码,三菱FX2N PLC串行通讯指令(FNC 80 RS)

    三菱FX2N PLC串行通讯指令(FNC 80 RS) 串行通讯指令(FNC 80 RS) 1.指令格式:    [RS     D0     K8     D10    K8] 发送数据帧起始地址和 ...

  7. CAN总线技术 | 物理层02 - CAN总线的异步串行通讯

    文章目录 一.前言 二.如何解决波特率误差带来的通信错误? 三.填充位 一.前言 广州虹科录制的CAN总线技术课程非常不错,建议同学们学习一下.B站的地址:https://www.bilibili.c ...

  8. 异步串行通讯和同步串行通讯对比

    异步串行通讯和同步串行通讯对比 作者:刘洪涛,华清远见嵌入式学院高级讲师,ARM ATC授权培训讲师. 在计算机系统中,CPU和外部通信有两种通信方式:并行通信和串行通信.而按照串行数据的时钟控制方式 ...

  9. 单片机的串行通讯就是排成一队走,并行就是排成一列走

    单片机的串行通讯就是排成一队走,并行就是排成一列走 ///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领 ...

  10. 串行通讯 -- IIC通讯原理

    前言 I2C是最常见的串行通讯,广泛应用于芯片之间通讯.常见的有EEPROM,温度传感器,触摸屏等.本文力求简单明了把I2C通讯协议说清楚.后面文章会举一些I2C器件示例,让大家更深入理解I2C. I ...

最新文章

  1. Java学习总结:49(字符缓冲流:BufferedReader)
  2. 黑洞最新照片来了:只多了炫酷光纹,却让物理学家解开喷流大谜题
  3. mysql update使用select的结果
  4. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-9底层驱动之USART
  5. kux转换为mp4软件_kux2mp4(优酷kux转换为mp4软件)下载-kux2mp4(优酷kux转换为mp4软件)免费版下载v2021...
  6. 原生JS实现淡入淡出效果(fadeIn/fadeOut/fadeTo)
  7. 60小时打通Python任督二脉
  8. 倒序查10条数据_10 | 怎么给字符串字段加索引?
  9. PP视频怎么设置退出程序时清空本地播放记录
  10. ShellSort 希尔排序
  11. mysql 创建索引 终止_技术分享 | 常见索引问题处理
  12. CCF202006-3 Markdown渲染器(100分)【文本处理】
  13. [linux]ssh配置文件ssh_config和sshd_config的区别
  14. 【GYM-100889 D】Dicy Numbers【数学推导求解】
  15. Googel knowledge graph API
  16. 惠康游戏手柄 WE-8400 Windows 10 驱动教程
  17. php php拼接字符串函数_PHP_PHP开发中常用的字符串操作函数,1,拼接字符串 拼接字符串是最 - phpStudy...
  18. html标签选择器只认最后一个,选择某类的最后一个元素——CSS3伪类选择器走过的坑...
  19. iis7无法写入配置文件,更换进入方式解决
  20. vue中如何实现换肤?

热门文章

  1. Scrapy框架之传智项目整理
  2. 容器如何访问外部世界?- 每天5分钟玩转 Docker 容器技术(36)
  3. 【Winform-右下角弹窗】实现右下角弹窗,提示信息
  4. 3GPP协议R15完整版下载
  5. B-JUI 实践 之 带搜索与编辑的Datagrid
  6. Landsat系列卫星数据应用介绍
  7. 安卓TV开发遇到的那些坑
  8. 万网域名查询接口(API)的说明
  9. 小猪短租网多个价格的查找,requests库,o( ̄ヘ ̄o#)bs4库的简单使用
  10. 基于OSINT的信息收集思路