0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈OpenAMP的应用程序中RPMSG_ADDR_ANY含义

454398 来源:赛灵思中文社区论坛 作者:赛灵思中文社区论 2020-09-29 13:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在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
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的目的地址。

// 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);

	}
	
	... ...
}

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1432

    浏览量

    83757
  • 应用程序
    +关注

    关注

    38

    文章

    3346

    浏览量

    60411
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    构建示例应用程序MCSPTR2AK396的问题求解

    显示任何消息。 此外,如果我选择“更新代码”,则所有驱动程序都将从项目中删除。 关于我遗漏了什么有什么提示吗? 安装的软件堆栈与示例应用程序的发行说明测试的软件堆栈几乎相同 Design
    发表于 04-20 13:11

    RDMA设计56:如何设计基于RDMA的应用程序

    本博文主要交流设计思路,在本博客已给出相关博文约140篇,希望对初学者有用。 注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP 设计。 应用程序的工作流程如图 1所示,大致分为 READ 包
    发表于 04-05 09:54

    如何构建蓝牙应用程序

    应用程序使用蓝牙(blueZ)。 我已经安装了 gcc-riscv64-linux-gnu。 但是,没有安装 blueZ 标头和库。 如何构建我的蓝牙应用程序
    发表于 04-01 07:31

    详细解释Keil-MDKCode、RO-data、RW-data、ZI-data的含义

    、RW-data、ZI-data的含义理解以及程序最终占用处理器的Flash空间大小和SRAM空间大小如何?今天就此问题跟大家进行详细的讨论,希望可以对大家有所帮助。 一、含义解释
    发表于 01-21 07:19

    基于RT-Thread的RPMsg-Lite异构多核通信原理分析 | 技术集结

    RT-Thread(运行于Cortex-M85核)和裸机程序(运行于Cortex-M33核)之间使用rpmsg-lite进行通信,并采用MCMGR组件替代rpmsg
    的头像 发表于 12-19 17:16 8252次阅读
    基于RT-Thread的<b class='flag-5'>RPMsg</b>-Lite异构多核通信原理分析 | 技术集结

    深入了解API:详解应用程序接口的作用和原理

    引言:在现代软件开发领域中, API(Application Programming Interface,应用程序接口)扮演着至关重要的角色。无论是在Web开发、移动应用还是大型软件系统,API
    的头像 发表于 11-03 09:37 532次阅读

    如何在应用程序调试期间分析栈和堆使用情况

    ,并在 Unified IDE 仍可使用。本文涵盖了如何在 Vitis 中使用分析工具在应用程序调试期间对栈和堆进行监控。
    的头像 发表于 10-24 16:54 1029次阅读
    如何在<b class='flag-5'>应用程序</b>调试期间分析栈和堆使用情况

    MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录

    请问MPLAB X IDE 怎么设置bootloader和应用程序的起始地址和大小,不然默认从0开始烧录
    发表于 10-24 16:42

    学生适合使用的SOLIDWORKS 云应用程序

    随着科技的不断发展,计算机辅助设计(CAD)技术已经成为现代工程教育的重要组成部分。SOLIDWORKS作为一款CAD软件,其教育版云应用程序为学生提供了强大而灵活的设计平台。本文将探讨
    的头像 发表于 09-15 10:39 924次阅读
    学生适合使用的SOLIDWORKS 云<b class='flag-5'>应用程序</b>

    V5.2.1 Menuconfig,AMP如何配置呢?

    的cpu数 使能软件包 RT-Thread online packages → system packages → OpenAMP Version 选择为 v1.0.0 2.更新packages 输入
    发表于 09-11 06:27

    深入芯驰D9360核间通信案例,RPMSG关键技术深度剖析

    Core-D9360平台为例,详解如何利用RPMSG与VirtIO机制实现A核与R核间的可靠通信,并提供关键代码实现与调试方法。图1Core-D9360核心板一、通信基础:R
    的头像 发表于 09-10 08:31 1321次阅读
    深入芯驰D9360核间通信案例,<b class='flag-5'>RPMSG</b>关键技术深度剖析

    FX3 UVC 无法与 Ubuntu 24.04 Cheese 或 Snapshot 相机应用程序配合使用,怎么处理?

    `:运行一次,没有问题。首次出现缓冲错误后启动。但是,使用 libcamera 测试应用程序“cam”和“qcam”,我可以毫无问题地传输数据。 如果能帮助检查 wireshark 跟踪是否存在处理
    发表于 07-16 06:37

    CYBT-343026-01能否使用 HFP 和 AVRCP 制作应用程序

    我们计划使用 CYBT-343026-01 制作使用 HFP 和 AVRCP 的应用程序。 可以使用 CYBT-343026-01 制作使用 HFP 和 AVRCP 的应用程序吗? 根据 QDID
    发表于 07-01 08:29

    stm32mp157的异核通信的rpmsg_sdb的m4固件和a7驱动该如何编写?

    stm32mp157的异核通信的rpmsg_sdb的m4固件和a7驱动该如何编写
    发表于 05-19 15:06

    将SDK从版本1.3.4更新至1.3.5后,cyfx3s_msc应用程序的看门狗定时器出现故障怎么解决?

    我的设备固件基于 SDK 示例 cyfx3s_msc。 将 SDK 从 1.3.4 版本更新到 1.3.5 版本后,看门狗定时器出现故障。 每当处理器由于看门狗而重置时,应用程序就会在重新启动后不久
    发表于 05-14 06:40