国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    1425

    瀏覽量

    83503
  • 應用程序
    +關注

    關注

    38

    文章

    3344

    瀏覽量

    60253
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    詳細解釋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 ?8108次閱讀
    基于RT-Thread的<b class='flag-5'>RPMsg</b>-Lite異構多核通信原理分析 | 技術集結

    如何在應用程序調試期間分析棧和堆使用情況

    ,并在 Unified IDE 仍可使用。本文涵蓋了如何在 Vitis 中使用分析工具在應用程序調試期間對棧和堆進行監控。
    的頭像 發表于 10-24 16:54 ?890次閱讀
    如何在<b class='flag-5'>應用程序</b>調試期間分析棧和堆使用情況

    學生適合使用的SOLIDWORKS 云應用程序

    隨著科技的不斷發展,計算機輔助設計(CAD)技術已經成為現代工程教育的重要組成部分。SOLIDWORKS作為一款CAD軟件,其教育版云應用程序為學生提供了強大而靈活的設計平臺。本文將探討
    的頭像 發表于 09-15 10:39 ?775次閱讀
    學生適合使用的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

    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

    【米爾-全志T536開發板試用體驗】異核心開發

    串口來查看RTOS的輸出信息。但串口在哪里呢,這是個小秘密,就不告訴你,就不告訴你~~。 又重新去翻兩個原理圖,最后找到,是下層底板的一個排針上。 手冊雖然有rpmsg_demo與rpmsg_test兩個通訊測試
    發表于 03-27 17:00

    如何在 Raspberry Pi AI Camera 上構建為開發人員提供實時的智能應用程序

    在這篇特邀文章,我們的合作伙伴索尼公司的雷蒙娜-雷納(RamonaRayner)將向您展示如何快速探索不同的模型和人工智能功能,以及如何在RaspberryPi人工智能相機的基礎上輕松構建應用程序
    的頭像 發表于 03-25 09:37 ?831次閱讀
    如何在 Raspberry Pi AI Camera 上構建為開發人員提供實時的智能<b class='flag-5'>應用程序</b>!

    MCP:連接AI與應用程序的開放標準!

    。 在第二種方式,開發者需要為AI大模型編寫與具體應用程序協作的訪問代碼,例如,開發者希望DeepSeek-R1與Gmail協作,就需要手動編寫協作代碼。這種手動編寫協作代碼的方式,耗時費力,還難以復用。 一,什么是MCP? 為解決AI應用開發者手動編寫A
    的頭像 發表于 03-21 18:21 ?2199次閱讀
    MCP:連接AI與<b class='flag-5'>應用程序</b>的開放標準!

    國產開發板—米爾全志T113-i如何實現ARM+RISC-V+DSP協同計算?

    使用RPMsg框架進行通訊,該框架用于AMP場景下處理器之間進行相互通信。OpenAMP內部實現了可用于RTOS或裸機系統RPMsg框架,與Linux內核的
    發表于 03-21 16:50

    CUST_DEL后如何在S32K312上安全恢復應用程序

    在 AB Update 配置,假設真實性得到確認,在連續 8 次重置后,是否可以在 CUST_DEL IVT 給出地址的安全恢復應用程序(不是基于 Jtag的)? 如果 IVT 丟失或損壞,HSE 將如何啟動安全恢復
    發表于 03-17 07:47

    如何部署OpenVINO?工具套件應用程序

    編寫代碼并測試 OpenVINO? 工具套件應用程序后,必須將應用程序安裝或部署到生產環境的目標設備。 OpenVINO?部署管理器指南包含有關如何輕松使用部署管理器將應用程序打包并
    發表于 03-06 08:23

    請問OpenVINO?工具套件的驗證應用程序是什么?

    OpenVINO?工具套件的驗證應用程序是什么?
    發表于 03-06 06:54