0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺談OpenAMP的應(yīng)用程序中RPMSG_ADDR_ANY含義

454398 ? 來(lái)源:賽靈思中文社區(qū)論壇 ? 作者:賽靈思中文社區(qū)論 ? 2020-09-29 13:43 ? 次閱讀

在OpenAMP的應(yīng)用程序中,經(jīng)??吹降刂繁辉O(shè)置成RPMSG_ADDR_ANY。在通信過(guò)程中,為什么可以把源地址、目的地址設(shè)置成任意值?

這個(gè)宏的名字不夠清楚,它的本意是讓系統(tǒng)自動(dòng)選擇。如果設(shè)置源地址為RPMSG_ADDR_ANY,則系統(tǒng)自動(dòng)選擇一個(gè)空閑的源地址。如果設(shè)置目的地址為RPMSG_ADDR_ANY,則系統(tǒng)會(huì)自動(dòng)發(fā)送一個(gè)查詢消息,根據(jù)名稱查詢對(duì)方的地址,相當(dāng)于TCP/IP中的域名解析。

查看代碼,我們可以確認(rèn)以上結(jié)論。第一個(gè)函數(shù)是rpmsg_create_ept(),提供源地址、目的地址后,它創(chuàng)建rpmsg endpoint(節(jié)點(diǎn))。

下面代碼顯示,如果調(diào)用rpmsg_create_ept()時(shí)指定了源地址,會(huì)調(diào)用rpmsg_is_address_set設(shè)置源地址,相當(dāng)于TCP/IP中的Bind。如果調(diào)用rpmsg_create_ept()時(shí)沒(méi)有指定源地址,則會(huì)調(diào)用rpmsg_get_address(),自動(dòng)從設(shè)備中沒(méi)有使用的地址中取一個(gè)地址。

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

如果調(diào)用rpmsg_create_ept()時(shí)沒(méi)有指定目的地址,會(huì)調(diào)用rpmsg_send_ns_message()發(fā)送消息,之后就會(huì)返回。如果另外一側(cè)返回消息后,會(huì)觸發(fā)的調(diào)用rpmsg_virtio_rx_callback()。在rpmsg_virtio_rx_callback中,從消息中得到entpoint信息,檢查其中的目的地址,如果目的地址是ANY,就會(huì)從消息中提取出遠(yuǎn)端地址,賦值給本地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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1324

    瀏覽量

    78759
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3198

    瀏覽量

    57364
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【米爾NXP i.MX 93開(kāi)發(fā)板試用評(píng)測(cè)】1、異構(gòu)核心通信的技術(shù)內(nèi)容

    前言 很多異構(gòu)核心使用的是標(biāo)準(zhǔn)的OpenAMP,OpenAMP(Open Asymmetric Multi-Processing)是一個(gè)開(kāi)源的軟件框架,用于在異構(gòu)多核處理器系統(tǒng)實(shí)現(xiàn)多核處理。異構(gòu)
    發(fā)表于 09-21 20:24

    Anthropic推出iPhone應(yīng)用程序和業(yè)務(wù)層

    Anthropic 推出 iPhone 應(yīng)用程序和業(yè)務(wù)層,支持使用Claude 3 Opus、Sonnet 和 Haiku 模型
    的頭像 發(fā)表于 05-07 10:22 ?312次閱讀

    使用Docker部署Go Web應(yīng)用程序步驟

    大多數(shù)情況下Go應(yīng)用程序被編譯成單個(gè)二進(jìn)制文件,web應(yīng)用程序則會(huì)包括模版和配置文件。而當(dāng)一個(gè)項(xiàng)目中有很多文件的時(shí)候,由于很多文件沒(méi)有同步就會(huì)導(dǎo)致錯(cuò)誤的發(fā)生并且產(chǎn)生很多的問(wèn)題。
    發(fā)表于 04-20 09:33 ?385次閱讀
    使用Docker部署Go Web<b class='flag-5'>應(yīng)用程序</b>步驟

    應(yīng)用程序的服務(wù)器錯(cuò)誤怎么解決?

    在使用應(yīng)用程序時(shí),可能會(huì)遇到服務(wù)器錯(cuò)誤的問(wèn)題。這種錯(cuò)誤通常會(huì)導(dǎo)致應(yīng)用程序無(wú)法正常運(yùn)行 ,給用戶帶來(lái)不便。下面將介紹應(yīng)用程序的服務(wù)器錯(cuò)誤及其解決方法,幫助您快速解決這一問(wèn)題。
    的頭像 發(fā)表于 03-12 15:13 ?4411次閱讀

    如何在ModusToolbox?檢查和設(shè)置應(yīng)用程序的內(nèi)存地址?

    如何在ModusToolbox?檢查和設(shè)置應(yīng)用程序的內(nèi)存地址?
    發(fā)表于 03-01 10:16

    LTE MQTT通信應(yīng)用程序說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《LTE MQTT通信應(yīng)用程序說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 02-21 10:47 ?0次下載
    LTE MQTT通信<b class='flag-5'>應(yīng)用程序</b>說(shuō)明

    為什么無(wú)法在modustoolbox?工具箱打開(kāi)新應(yīng)用程序

    我無(wú)法在modustoolbox?工具箱打開(kāi)新應(yīng)用程序。 如何解決這個(gè)問(wèn)題?
    發(fā)表于 01-31 07:32

    【米爾-TIAM62開(kāi)發(fā)板-接替335x-試用評(píng)測(cè)】4、異構(gòu)通信初體驗(yàn)

    數(shù)據(jù)。寫入新數(shù)據(jù)則標(biāo)記為已使用,讀取完數(shù)據(jù)則標(biāo)記為可用。 2、RPMsg通信流程 從Linux到mcu核心,首先從環(huán)形緩沖區(qū)這邊申請(qǐng)空間,然后寫入RPMsg消息頭和傳遞的數(shù)據(jù),再插入到環(huán)形緩沖區(qū)
    發(fā)表于 01-05 20:30

    oraclerownum的含義

    在Oracle數(shù)據(jù)庫(kù),ROWNUM是一個(gè)用于查詢語(yǔ)句中的偽列,用于限制結(jié)果集的行數(shù)。ROWNUM是在查詢結(jié)果返回之前分配給每一行的一個(gè)值。下面將詳細(xì)介紹ROWNUM的含義以及在查詢
    的頭像 發(fā)表于 12-05 17:03 ?902次閱讀

    如何在Spring Boot應(yīng)用程序整合ZXing庫(kù)

    在數(shù)字化時(shí)代,二維碼已經(jīng)成為了信息交流的一種常見(jiàn)方式。它們被廣泛用于各種應(yīng)用,從產(chǎn)品標(biāo)簽到活動(dòng)傳單,以及電子支付。本文將向您展示如何在Spring Boot應(yīng)用程序整合ZXing庫(kù),以創(chuàng)建和解析QR碼。
    的頭像 發(fā)表于 12-03 17:39 ?972次閱讀

    開(kāi)發(fā)java應(yīng)用程序的基本步驟是

    ava是一種面向?qū)ο蟮木幊陶Z(yǔ)言,廣泛用于開(kāi)發(fā)各種類型的應(yīng)用程序。在開(kāi)發(fā)Java應(yīng)用程序時(shí),有一些基本步驟需要遵循,以確保應(yīng)用程序的正確性和可靠性。 1.確定需求:這是開(kāi)發(fā)任何應(yīng)用程序
    的頭像 發(fā)表于 11-28 16:52 ?1311次閱讀

    Flask如何升級(jí)到 Quart 應(yīng)用程序

    Flask 平均性能提高3倍。 這個(gè)比較,我使用了一個(gè)簡(jiǎn)單的只提供一個(gè) RESTful 接口的應(yīng)用程序,這是微服務(wù)架構(gòu)的常見(jiàn)用例。
    的頭像 發(fā)表于 11-01 16:23 ?543次閱讀
    Flask如何升級(jí)到 Quart <b class='flag-5'>應(yīng)用程序</b>

    PGO到底是什么?PGO如何提高應(yīng)用程序性能呢?

    性能的方法。PGO技術(shù)在編譯優(yōu)化起了很大的作用,能夠優(yōu)化代碼、減少程序體積、提升程序性能等。 PGO技術(shù)可以分為三個(gè)步驟,首先是收集運(yùn)行特征數(shù)據(jù),然后是根據(jù)收集到的數(shù)據(jù)生成優(yōu)化參數(shù),最后是使用優(yōu)化參數(shù)來(lái)重新編譯
    的頭像 發(fā)表于 10-26 17:37 ?1883次閱讀

    SEW-MOVIPRO啟動(dòng)應(yīng)用程序配置程序

    AMA0801應(yīng)用程序模塊使用六個(gè)過(guò)程數(shù)據(jù)字進(jìn)行尋址。因此,應(yīng)用程序配置程序必須將這六個(gè)過(guò)程數(shù)據(jù)字傳輸?shù)捷S,而不進(jìn)行更改。這是通過(guò)選擇“透明6PD”選項(xiàng)來(lái)確保的。
    的頭像 發(fā)表于 10-22 16:18 ?634次閱讀
    SEW-MOVIPRO啟動(dòng)<b class='flag-5'>應(yīng)用程序</b>配置<b class='flag-5'>程序</b>

    MPLAB Harmony應(yīng)用程序幫助

    電子發(fā)燒友網(wǎng)站提供《MPLAB Harmony應(yīng)用程序幫助.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 09:50 ?0次下載
    MPLAB Harmony<b class='flag-5'>應(yīng)用程序</b>幫助