Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【分享】OpenAMP的RPMSG_ADDR_ANY含义

【分享】OpenAMP的RPMSG_ADDR_ANY含义

作者头像
hankfu
发布于 2020-07-16 03:26:34
发布于 2020-07-16 03:26:34
1.2K00
代码可运行
举报
文章被收录于专栏:hankhank
运行总次数:0
代码可运行

在OpenAMP的应用程序中,经常看到地址被设置成RPMSG_ADDR_ANY。在通信过程中,为什么可以把源地址、目的地址设置成任意值?

这个宏的名字不够清楚,它的本意是让系统自动选择。如果设置源地址为RPMSG_ADDR_ANY,则系统自动选择一个空闲的源地址。如果设置目的地址为RPMSG_ADDR_ANY,则系统会自动发送一个查询消息,根据名称查询对方的地址,相当于TCP/IP中的域名解析。 查看代码,我们可以确认以上结论。第一个函数是rpmsg_create_ept(),提供源地址、目的地址后,它创建rpmsg endpoint(节点)。

下面代码显示,如果调用rpmsg_create_ept()时指定了源地址,会调用rpmsg_is_address_set设置源地址,相当于TCP/IP中的Bind。如果调用rpmsg_create_ept()时没有指定源地址,则会调用rpmsg_get_address(),自动从设备中没有使用的地址中取一个地址。

// rpmsg.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
		     const char *name, uint32_t src, uint32_t dest,
		     rpmsg_ept_cb cb, rpmsg_ns_unbind_cb unbind_cb)
{

	... ...

	if (src != RPMSG_ADDR_ANY) {
		status = rpmsg_is_address_set(rdev->bitmap,
					      RPMSG_ADDR_BMP_SIZE, src);
		if (!status) {
			/* Mark the address as used in the address bitmap. */
			rpmsg_set_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE,
					  src);
		} else if (status > 0) {
			status = RPMSG_SUCCESS;
			goto ret_status;
		} else {
			goto ret_status;
		}
	} else {
		addr = rpmsg_get_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE);
	}

	... ...

	return status;
}

// rpmsg.c
static uint32_t rpmsg_get_address(unsigned long *bitmap, int size)
{
	unsigned int addr = RPMSG_ADDR_ANY;
	unsigned int nextbit;

	nextbit = metal_bitmap_next_clear_bit(bitmap, 0, size);
	if (nextbit < (uint32_t)size) {
		addr = nextbit;
		metal_bitmap_set_bit(bitmap, nextbit);
	}

	return addr;
}

如果调用rpmsg_create_ept()时没有指定目的地址,会调用rpmsg_send_ns_message()发送消息,之后就会返回。如果另外一侧返回消息后,会触发的调用rpmsg_virtio_rx_callback()。在rpmsg_virtio_rx_callback中,从消息中得到entpoint信息,检查其中的目的地址,如果目的地址是ANY,就会从消息中提取出远端地址,赋值给本地endpoint的目的地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// rpmsg.c
int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
		     const char *name, uint32_t src, uint32_t dest,
		     rpmsg_ept_cb cb, rpmsg_ns_unbind_cb unbind_cb)
{
	... ...
	
	if (!status  && ept->dest_addr == RPMSG_ADDR_ANY) {
		/* Send NS announcement to remote processor */
		metal_mutex_release(&rdev->lock);
		status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE);
		metal_mutex_acquire(&rdev->lock);
		if (status)
			rpmsg_unregister_endpoint(ept);
	}

	... ...
	
	return status;
}

// rpmsg_virtio.c
static void rpmsg_virtio_rx_callback(struct virtqueue *vq)
{

	... ...

	/* Process the received data from remote node */
	rp_hdr = (struct rpmsg_hdr *)rpmsg_virtio_get_rx_buffer(rvdev,
								&len, &idx);

	while (rp_hdr) {

		ept = rpmsg_get_ept_from_addr(rdev, rp_hdr->dst);
		if (ept->dest_addr == RPMSG_ADDR_ANY) {
			/*
			 * First message received from the remote side,
			 * update channel destination address
			 */
			ept->dest_addr = rp_hdr->src;
		}
		status = ept->cb(ept, (void *)RPMSG_LOCATE_DATA(rp_hdr),
				   rp_hdr->len, ept->addr, ept->priv);

	}
	
	... ...
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux用户空间与内核空间通信(Netlink通信机制)
Netlink是linux提供的用于内核和用户态进程之间的通信方式。但是注意虽然Netlink主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式,一般不用Netlink。除非需要用到Netlink的广播特性时。
嵌入式Linux内核
2022/10/25
5K2
Linux用户空间与内核空间通信(Netlink通信机制)
virtio 虚拟化系列之一:从 virtio 论文开始(文末有福利~)
SmartX是中国领先的超融合产品与企业云解决方案提供商,拥有国内最顶尖的分布式存储和超融合架构研发团队,在分布式存储、虚拟化计算、微服务、容器、前端开发、自动化测试等领域都做着行业最前沿的实践。现正在招兵买马,看完请点击左下角阅读原文查看福利哦~
Linux阅码场
2019/07/08
2.4K0
virtio详细介绍和1.1新功能
virtio是一种实践出来的技术,并且最终标准化,virtio是一种通用的虚拟化设备模拟标准,得到了大部分guest操作系统和hypervisor的支持,方便guest操作系统和hypervisor之间任意互相匹配。virtio出现之前hypervisor各有各的IO设备模拟方案,并在guest操作系统中大量合入驱动代码,导致一片混乱,后来xen中出来了部分virtio思想,在kvm中实现并且发扬光大,发表了论文《virtio: Towards a De-Facto Standard For Virtual I/O Devices》,论文促使virtio形成了正式标准。virtio标准最早是0.9.5版本(Virtio PCI Card Specification Version 0.9.5),于2012年形成了draft,并没有正式发布,继续发展,2016年发布了1.0版本(Virtual I/O Device (VIRTIO) Version 1.0),2019年发布了1.1版本(Virtual I/O Device (VIRTIO) Version 1.1)。
惠伟
2021/04/27
4.4K0
Linux用户态协议栈与DPDK构建高性能应用
这里使用了已经搭建好的dpdk环境,dpdk的搭建过程网上有很多教程可以参考,后面有空再做一篇dpdk环境搭建文章吧! (1)检查网卡状态
Lion 莱恩呀
2024/09/15
3440
Linux用户态协议栈与DPDK构建高性能应用
全志R128 SDK HAL 模块开发指南——DMA Controller
DMA 主要实现设备与设备、设备与 memory、memory 与 memory 之间的数据搬运与传输;BSP DMA 驱动主要实现设备驱动的底层细节,并为上层提供一套标准的 API 接口以供使用。
阿志小管家
2024/03/26
1310
全志R128 SDK HAL 模块开发指南——DMA Controller
Netfilter编程实现用户名和密码的窃取
本实验窃取密码的前提是要明文传输,先必须找到一个登录页面是采用http协议(非https)的站点,一般的163邮箱都有相应的防御机制,建议使用自己学校的邮箱或门户,随意输入用户名和密码。
matt
2022/10/25
2.8K0
Netfilter编程实现用户名和密码的窃取
多核异构通信框架(RPMsg-Lite)
随着科技的飞速发展,计算需求日益复杂和多样化,传统的单核处理器已难以满足所有应用场景的需求。在这样的背景下,异构多核系统应运而生,成为推动计算领域进步的重要力量。异构多核系统不仅提高了计算效率,还优化了能耗,为众多领域带来了革命性的变革。
Rice加饭
2024/03/12
2.2K0
多核异构通信框架(RPMsg-Lite)
【STM32H7教程】第40章 STM32H7的BDMA基础知识和HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第40章       STM32H7的BDMA基础知识和HAL库API
Simon223
2020/01/13
1.2K0
【STM32H7教程】第40章  STM32H7的BDMA基础知识和HAL库API
全志T113双核异构处理器的使用基于Tina Linux5.0——异构双核通信的具体实现
本章节以SBC-T113S4主板的TinaLinux为例,介绍异构双核通信的实现。该方法也同样适用于T113i平台。 本章节主要涉及到Tina Linux内核的配置、Tina Linux文件系统(openwrt)的配置、Freertos的配置。其中Tina Linux内核的配置包括设备树的配置及相关内核驱动及协议的配置;Tina Linux文件系统(openwrt)的配置包括异构双核通信测试程序和小核C906终端的配置;Freertos的配置包括通信协议的配置。
阿志小管家
2024/11/21
2120
全志T113双核异构处理器的使用基于Tina Linux5.0——异构双核通信的具体实现
【STM32H7教程】第61章 STM32H7的MDMA基础知识和HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第61章       STM32H7的MDMA基础知识和HAL库API
Simon223
2020/03/02
2.4K0
C语言中如何实现数据帧封装与解析
在计算机网络通信中,数据帧的封装与解析是非常重要的环节。本文将介绍一种基于C语言的实现方法,旨在帮助读者理解数据帧的结构和实现过程。
用户10354340
2023/08/13
6780
内核通信之 Netlink 源码分析和实例分析
这几天在看 ipvs 相关代码的时候又遇到了 netlink 的事情,所以这两天花了点时间重新把 netlink 的事情梳理了一下。
黑光技术
2020/07/31
3.5K0
内核通信之 Netlink 源码分析和实例分析
全志 Tina Linux RISC-V E907核心开发指南支持百问网V85x系列开发板100ask-v853-pro v851s等
这里主要介绍几个下文会用到的命令,并不会介绍全部命令,如果想了解全部命令,可以在lunch 方案后使用hmm打印出所有tina提供的快捷命令。
韦东山
2022/12/28
7850
全志 Tina Linux RISC-V E907核心开发指南支持百问网V85x系列开发板100ask-v853-pro v851s等
Istio Ambient 模式流量管理实现机制详解(三)
本文将继续介绍 ambient 模式下四层流量处理的实现机制。本文将以 bookinfo 应用中 productpage 访问 reviews 的请求路径为例进行分析,以理清一个请求从 client 端发出到 server 端处理的完整流程。
赵化冰
2022/10/31
5120
【STM32H7教程】第42章 STM32H7的DMA基础知识和HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第42章       STM32H7的DMA基础知识和HAL库API
Simon223
2020/01/13
2.4K0
【STM32H7教程】第42章  STM32H7的DMA基础知识和HAL库API
Android中WiFi的RX与TX获取流程以及配置
Android中的RX与TX,即WiFI的传输速率与接收速率,是在WifiConfigController里添加的,可以看到,只有它们的值不为0时,才会显示。
用户7557625
2020/07/15
2.4K0
【计网】从零开始使用UDP进行socket编程 --- 客户端与服务端的通信实现
我们了解了网络编程的大概,今天我们就来使用UDP协议来实现客户端与服务端之间的通信过程:
叫我龙翔
2024/09/17
2790
DAOS Mercury(HG) Libfabric(OFI) RDMA 分层verbs接口调用详解
参考之前的分享中, DAOS与RDMA分层关系如下图, DAOS引擎 -> CART(RPC/大块数据/集合RPC请求) -> Mercury(HG: RPC注册/回调/RPC操作/预期/非预期消息/大块消息/轮训/阻塞/网络抽象等) -> Libfabric(网络抽象层,对rxm,rdma verbs, socket, 共享内存等抽象) -> RDMA(verbs) -> rdma-core(用户态驱动) -> RDMA网卡硬件驱动(如:英伟达 mellanox迈络思), 今天咱们来探讨一下分层verbs接口调用详情
晓兵
2023/10/05
1K2
DAOS Mercury(HG) Libfabric(OFI) RDMA 分层verbs接口调用详解
DAOS_分布式存储_mercury_libfabric_rdma_rpc高性能网络_大块数据_bulk传输_中断_轮询自动切换_等笔记
博客: https://logread.cn | https://blog.csdn.net/ssbandjl | https://cloud.tencent.com/developer/user/5060293/articles
晓兵
2023/11/03
4190
DAOS_分布式存储_mercury_libfabric_rdma_rpc高性能网络_大块数据_bulk传输_中断_轮询自动切换_等笔记
DPU/IPU SPDK存储卸载之用户态vfio(vfio_user)
IPU: Infrastructure Processing Units (lPUs), 基础设施处理单元(硬件卡), 如存储处理/卸载到IPU
晓兵
2024/09/01
5652
DPU/IPU SPDK存储卸载之用户态vfio(vfio_user)
推荐阅读
相关推荐
Linux用户空间与内核空间通信(Netlink通信机制)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验