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

    文章

    1270

    浏览量

    78282
  • 应用程序
    +关注

    关注

    37

    文章

    3133

    浏览量

    56368
收藏 人收藏

    评论

    相关推荐

    【米尔-TIAM62开发板-接替335x-试用评测】4、异构通信初体验

    数据。写入新数据则标记为已使用,读取完数据则标记为可用。 2、RPMsg通信流程 从Linux到mcu核心,首先从环形缓冲区这边申请空间,然后写入RPMsg消息头和传递的数据,再插入到环形缓冲区
    发表于 01-05 20:30

    开发java应用程序的基本步骤是

    ava是一种面向对象的编程语言,广泛用于开发各种类型的应用程序。在开发Java应用程序时,有一些基本步骤需要遵循,以确保应用程序的正确性和可靠性。 1.确定需求:这是开发任何应用程序
    的头像 发表于 11-28 16:52 661次阅读

    Libmetal和OpenAMP用户指南

    电子发烧友网站提供《Libmetal和OpenAMP用户指南.pdf》资料免费下载
    发表于 09-15 10:07 2次下载
    Libmetal和<b class='flag-5'>OpenAMP</b>用户指南

    最新LWM ESXi应用程序

    电子发烧友网站提供《最新LWM ESXi应用程序.zip》资料免费下载
    发表于 08-22 10:44 0次下载
    最新LWM ESXi<b class='flag-5'>应用程序</b>

    RK3568-OpenAMP应用示例

    在rk3568 cpu0 / 3上各自跑rtthread,并通过openamp跑demo
    的头像 发表于 08-07 15:46 1448次阅读
    RK3568-<b class='flag-5'>OpenAMP</b>应用示例

    cubeProgrammer修改BOOT_ADDR失败是怎么回事?

    芯片中FLASH.CR的LOCK和OPTLOCK都=1,通过应用程序写入序列修改了两个LOCK,从cubeProgrammer的寄存器也看到是=0,但是在OB修改BOOT_ADDR
    发表于 08-04 09:43

    如何用addr2line去debug

    Core 文件的时候,如何知道程序在什么地方出错了呢?addr2line 就在这时派上用场。 这是一个示例程
    的头像 发表于 07-30 10:20 275次阅读
    如何用<b class='flag-5'>addr</b>2line去debug

    PreEmptiveProtection:全面的移动应用程序保护

    您的组织经不起黑客攻击 保护在不受信任的环境中运行的移动应用程序变得越来越重要,因为移动和物联网应用程序使客户端更智能,并经常访问敏感或金融信息。 由于黑客越来越多地将目标对准消费者和企业移动
    的头像 发表于 07-06 10:42 337次阅读

    Preemptive 全面的移动应用程序保护

    由于黑客越来越多地将目标对准消费者和企业移动应用程序,您的应用程序可能会给您的组织带来风险。例如,黑客可以使用反编译器或反汇编器对您的安卓或iOS应用程序进行逆向工程,调试你的应用程序
    的头像 发表于 07-06 10:41 366次阅读
    Preemptive 全面的移动<b class='flag-5'>应用程序</b>保护

    构建一个移动应用程序

    电子发烧友网站提供《构建一个移动应用程序.zip》资料免费下载
    发表于 07-04 14:33 0次下载
    构建一个移动<b class='flag-5'>应用程序</b>

    浅谈PLC应用程序的内容和质量

    PLC应用程序应最大限度地满足被控对象的控制要求,在构思程序主体的框架后,要以它为主线,逐一编写实现各控制功能或各子任务的程序
    发表于 06-25 10:04 167次阅读
    <b class='flag-5'>浅谈</b>PLC<b class='flag-5'>应用程序</b>的内容和质量

    微健康应用程序开源

    电子发烧友网站提供《微健康应用程序开源.zip》资料免费下载
    发表于 06-16 11:42 0次下载
    微健康<b class='flag-5'>应用程序</b>开源

    为ESP8266编写一个TCP服务器程序,无法找到要在我的程序声明的正确包含文件是怎么回事?

    看起来与标准 C 创建/使用 TCP 套接字的方式非常相似。但是,我无法找到要在我的程序声明的正确包含文件 。 以这个片段为例: 代码:全选struct sockaddr_in
    发表于 06-12 07:13

    简述后端应用程序的工作原理

    一个Java后端应用程序要想运行起来需要两步,第一步是搭建Web应用服务器,为后端应用程序提供运行环境,第二步是把后端应用程序放到Web应用服务器上。
    的头像 发表于 05-05 16:45 1281次阅读
    简述后端<b class='flag-5'>应用程序</b>的工作原理

    imx-rpmsg读取文件会覆盖保留内存无法加载 \'hello_world.bin是为什么?

    ,在下面的主题中,这个人谈到了 imx_rpmsg.c 的硬编码。我问:如何把 rpdev->vring[0] = 0x9FFF0000; rpdev->vring[1
    发表于 04-27 07:15