加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • ?簡介
    • ? 雙核通信
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

【產(chǎn)品應(yīng)用】AWorksLP 樣例詳解(MR6750)——雙核通信

2023/09/27
2675
閱讀需 12 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

AWorksLP 對外設(shè)進行了高度抽象化,為同一類外設(shè)提供了相同的接口,應(yīng)用程序可以輕松跨平臺。本文以MR6750?平臺為例,介紹AWorksLP ?雙核通信的基本用法。

?簡介

通信信箱MBX 有2 套寄存器訪問接口,接口A 和接口B。A 和B 接口都具有一套TX FIFO 寄存器、RX FIFO

寄存器、控制寄存器和狀態(tài)寄存器。用戶從A 接口的發(fā)送端TX 發(fā)送的數(shù)據(jù),可以在B 接口的接收端RX 接收 到。同理,A 接口的接收端RX 可以接收到B 接口發(fā)送端TX 發(fā)送的數(shù)據(jù)。

雙核燒錄的用法請參考《AWorksLP樣例詳解(MR6750)——雙核燒錄》

雙核調(diào)試的用法請參考《AWorksLP樣例詳解(MR6750)——雙核調(diào)試》

? 雙核通信

1. MBX信箱

{SDK}demosmulti-coreopenamp路徑下為openamp的例程。雙核通信需要使用信箱在gui上勾選對應(yīng)的信箱接口,hart0和hart1需勾選同一個信箱的兩個不同接口。例如hart0勾選了mbx0a、則hart1需勾選mbx0b。

圖1 mbx設(shè)備

2.?OpenAMP

OpenMP是由OpenMP Architecture Review Board牽頭提出的,并已被廣泛接受,用于共享內(nèi)存并行系統(tǒng)的多處理器程序設(shè)計的一套指導(dǎo)性編譯處理方案。

3.?例程

#if CONFIG_AW_OPENAMP_MASTERaw_local int rx_callback (struct rpmsg_endpoint *ept, void *data, ? ? ? ? ? ? ? ?size_t len, uint32_t src, void *priv){ ? ?aw_kprintf("[Master receive]: %sn", data); ? ?return 0;}#elseaw_local int rx_callback (struct rpmsg_endpoint *ept, void *data, ? ? ? ? ? ? ? ?size_t len, uint32_t src, void *priv){ ? ?char sendbuf[512];
 ? ?aw_kprintf("[Slave receive]: %sn", data); ? ?aw_snprintf(sendbuf, sizeof(sendbuf), "%s ACK", data); ? ?if (rpmsg_send(&__resmgr_ept, sendbuf, strlen(sendbuf) + 1) < 0) { ? ? ? ?aw_kprintf("[Slave send]: error!n"); ? ?} ? ?return 0;}#endif

aw_local int __mail_box_notify(void *priv, uint32_t id){ ? ?uint32_t tmp;
#if CONFIG_AW_OPENAMP_MASTER ? ?/* master to remote */ ? ?if (id == VRING1_ID) { ? ? ? ?/* send msg */ ? ? ? ?tmp = EPT_SEND_MSG_FLAG; ? ?} else { /* remote to master */ ? ? ? ?/* send ack */ ? ? ? ?tmp = EPT_SEND_ACK_FLAG; ? ?}#else ? ?if (id == VRING1_ID) { ? ? ? ?/* send ack */ ? ? ? ?tmp = EPT_SEND_ACK_FLAG; ? ?} else { ? ? ? ?/* send msg */ ? ? ? ?tmp = EPT_SEND_MSG_FLAG; ? ?}#endif
 ? ?aw_write(__g_mbx_fd, &tmp, 4); ? ?return 0;}

/* 處理其它設(shè)備發(fā)送過來的MBX */aw_local void __openamp_task(void *p_arg){
 ? ?struct rpmsg_virtio_device *p_dev = (struct rpmsg_virtio_device *)p_arg;
 ? ?aw_kprintf("Entry OpenAMP task!n");
 ? ?while(1) { ? ? ? ?uint32_t tmp;
 ? ? ? ?aw_read(__g_mbx_fd, &tmp, 4);
 ? ? ? ?/* ? ? ? ? * 默認Master VRING0是接收, VRING1是發(fā)送, 從機反之 ? ? ? ? */#if CONFIG_AW_OPENAMP_MASTER ? ? ? ?if (tmp == EPT_SEND_MSG_FLAG) {
 ? ? ? ? ? ?/* 接收到來自從機的消息 */ ? ? ? ? ? ?rproc_virtio_notified(p_dev->vdev, VRING0_ID); ? ? ? ?} else {
 ? ? ? ? ? ?/* 接收到來自從機的ACK */ ? ? ? ? ? ?rproc_virtio_notified(p_dev->vdev, VRING1_ID); ? ? ? ?}#else
 ? ? ? ?if (tmp == EPT_SEND_MSG_FLAG) { ? ? ? ? ? ?rproc_virtio_notified(p_dev->vdev, VRING1_ID); ? ? ? ?} else { ? ? ? ? ? ?rproc_virtio_notified(p_dev->vdev, VRING0_ID); ? ? ? ?}#endif ? ?}}
void rpmsg_demo(){ ? ?int ret = 0;#if CONFIG_AW_OPENAMP_MASTER ? ?int i = 0; ? ?int RPMsgRole = 0;#else ? ?int RPMsgRole = 1;#endif
 ? ?__g_mbx_fd = aw_open(CONFIG_MBX_CHOOSE, AW_O_RDWR, 0);
 ? ?ret = aw_openamp_init(&rpmsg_dev, RPMsgRole, NULL, __mail_box_notify);
#if CONFIG_AW_OPENAMP_MASTER ? ?/* 啟動固件 */ ? ?ret = aw_openamp_remoteproc_init(&__aworks_rproc_ops); ? ?if (ret) { ? ? ? ?aw_kprintf("Start processor fail!n"); ? ?}#endif
 ? ?if (ret) { ? ? ? ?aw_kprintf("OpenAMP init error!n"); ? ? ? ?while(1); ? ?}
 ? ?aw_openamp_create_ept(&rpmsg_dev, ? ? ? ? ? ? ? ? ? ? ? ? ?&__resmgr_ept, ? ? ? ? ? ? ? ? ? ? ? ? ? "rpmsg-client-sample", ? ? ? ? ? ? ? ? ? ? ? ? ? 0xFFFFFFFF, ? ? ? ? ? ? ? ? ? ? ? ? ? rx_callback, NULL);
 ? ?aw_openamp_ep_poll_task_start(&rpmsg_dev); ? ?aw_openamp_wait_ept_ready(&__resmgr_ept);
 ? ?while(1) {
#if CONFIG_AW_OPENAMP_MASTER ? ? ? ?char sendbuf[512]; ? ? ? ?aw_snprintf(sendbuf, sizeof(sendbuf), "AWorks %d", i); ? ? ? ?aw_kprintf("[Master send]: %sn", sendbuf); ? ? ? ?if (aw_openamp_send(&__resmgr_ept, sendbuf, strlen(sendbuf) + 1) < 0) { ? ? ? ? ? ?aw_kprintf("[Master send]: error!n"); ? ? ? ?} ? ? ? ?i++;#else ? ? ? ?aw_kprintf("Salve is alive!n");#endif ? ? ? ?aw_mdelay(100); ? ?}}

由于篇幅原因本文僅截取部分關(guān)鍵代碼。

    • 在rpmsg_demo中使用aw_open打開信箱、使用aw_openamp_init并注冊__mail_box_notify函數(shù);在__mail_box_notify函數(shù)中發(fā)送相應(yīng)的標記、使用aw_openamp_remoteproc_init函數(shù)注冊__aworks_rproc_ops,參數(shù)中是各運行階段的函數(shù)接口;使用aw_openamp_create_ept函數(shù)注冊rx_callback接收回調(diào)函數(shù),當作為主核時打印從核發(fā)送的數(shù)據(jù),當作為從核時將收到的數(shù)據(jù)發(fā)送回去;使用aw_openamp_ep_poll_task_start函數(shù)創(chuàng)建一個任務(wù),任務(wù)的函數(shù)入口為__openamp_task,在__openamp_task函數(shù)中根據(jù)讀到的標記做相應(yīng)的處理。

使用aw_openamp_wait_ept_ready函數(shù)等待從機準備好。

在while循環(huán)中主核使用aw_openamp_send函數(shù)循環(huán)的發(fā)送數(shù)據(jù)、從核在rx_callback回調(diào)函數(shù)中將主核發(fā)送的數(shù)據(jù)發(fā)送回去、串口打印如下圖。

圖2?串口打印

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
XB3-24Z8PT-J 1 Digi International Inc Telecom Circuit, 1-Func, MODULE-20

ECAD模型

下載ECAD模型
$20.06 查看
TJA1042T,118 1 NXP Semiconductors TJA1042 - High-speed CAN transceiver with Standby mode SOIC 8-Pin

ECAD模型

下載ECAD模型
$1.52 查看
SN65HVD234D 1 Texas Instruments 3.3 V CAN Transceiver with Sleep Mode 8-SOIC -40 to 125

ECAD模型

下載ECAD模型
$3.95 查看
致遠電子

致遠電子

廣州致遠電子股份有限公司成立于2001年,注冊資金5000萬元,國家級高新技術(shù)認證企業(yè),廣州市高端工控測量儀器工程技術(shù)研究開發(fā)中心,Intel ECA全球合作伙伴和微軟嵌入式系統(tǒng)金牌合作伙伴。

廣州致遠電子股份有限公司成立于2001年,注冊資金5000萬元,國家級高新技術(shù)認證企業(yè),廣州市高端工控測量儀器工程技術(shù)研究開發(fā)中心,Intel ECA全球合作伙伴和微軟嵌入式系統(tǒng)金牌合作伙伴。收起

查看更多

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

ZLG官方賬號,一個匯聚500名工程師的研發(fā)測試分享平臺,為您提供電子世界領(lǐng)先的產(chǎn)品技術(shù)與行業(yè)解決方案.