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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

AWorksLP 樣例詳解(MR6750)——雙核通信

ZLG致遠電子 ? 2023-09-27 08:26 ? 次閱讀

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

881d3c96-5ccc-11ee-9788-92fbcf53809c.jpg ?簡介

通信信箱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)試》


881d3c96-5ccc-11ee-9788-92fbcf53809c.jpg ?雙核通信

1. MBX信箱

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

883b8e76-5ccc-11ee-9788-92fbcf53809c.png

圖1 mbx設備

2.OpenAMP

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

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]: %s\n", 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]: %s\n", 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;}

/* 處理其它設備發(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]: %s\n", 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); ? ?}}

由于篇幅原因本文僅截取部分關鍵代碼。

  • 在rpmsg_demo中使用aw_open打開信箱、使用aw_openamp_init并注冊__mail_box_notify函數(shù);
  • 在__mail_box_notify函數(shù)中發(fā)送相應的標記、使用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)建一個任務,任務的函數(shù)入口為__openamp_task,在__openamp_task函數(shù)中根據(jù)讀到的標記做相應的處理。

使用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ā)送回去、串口打印如下圖。885177ae-5ccc-11ee-9788-92fbcf53809c.png

圖2串口打印

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

    關注

    33

    文章

    8355

    瀏覽量

    150517
  • 通信
    +關注

    關注

    18

    文章

    5926

    瀏覽量

    135699
  • 雙核
    +關注

    關注

    0

    文章

    37

    瀏覽量

    15158
收藏 人收藏

    評論

    相關推薦

    dsp和單核dsp的區(qū)別

    DSP(Digital Signal Processor,數(shù)字信號處理器)與單核DSP在多個方面存在顯著差異,這些差異主要體現(xiàn)在處理能力、任務分配、資源利用以及適用場景等方面。 一、處理能力
    的頭像 發(fā)表于 09-24 16:14 ?283次閱讀

    TI基于ConcertoMCU的PRIME電力線通信數(shù)據(jù)集中器方案應用說明

    電子發(fā)燒友網(wǎng)站提供《TI基于ConcertoMCU的PRIME電力線通信數(shù)據(jù)集中器方案應用說明.pdf》資料免費下載
    發(fā)表于 09-10 11:10 ?0次下載
    TI基于Concerto<b class='flag-5'>雙</b><b class='flag-5'>核</b>MCU的PRIME電力線<b class='flag-5'>通信</b>數(shù)據(jù)集中器方案應用說明

    STM32H743與STM32H745在外部電路上是否完全一,是否可以不更換外部電路的情況下實現(xiàn)直接替換呢?

    請教下STM32H743與STM32H745在外部電路上是否完全一,是否可以不更換外部電路的情況下實現(xiàn)直接替換呢? 如果電路需要有變化,能否發(fā)個文檔進行說明呢?
    發(fā)表于 04-07 08:17

    STM32H745ZGTx芯片使用內(nèi)部FLASH,掛載FATFS為什么打不開文件?

    STM32H745ZGTx芯片使用內(nèi)部FLASH,掛載FATFS為何打不開文件?
    發(fā)表于 04-07 07:11

    STM32H747如何用JLINK調(diào)試?

    1.我之前是在STM32H747的官方開發(fā)板discover上進行調(diào)試,板子上自帶了STlink調(diào)試器,按照官方文檔配置可以進行調(diào)試 2.目前自己設計的板子上是調(diào)試接口是SWD接口,手上只有
    發(fā)表于 03-28 08:58

    VC++串口通信詳解

    電子發(fā)燒友網(wǎng)站提供《VC++串口通信詳解.doc》資料免費下載
    發(fā)表于 03-24 09:36 ?0次下載

    解決HPM6750EVK2jlink下載

    拿到HPM6750EVK2,使用jlink下載時,我原來用買jlink配的20轉(zhuǎn)10轉(zhuǎn)接板進行連接,下載程序里一直報不能連接到開發(fā)板。經(jīng)過查找用手冊后,找到了問題。 我的jlink的引腳圖與之不對
    發(fā)表于 02-16 10:30

    PSoC架構(gòu)中都可以訪問全部外設嗎?

    你好!如標題:PSoC 架構(gòu)中兩個內(nèi)核對芯片的全部外設都有直接訪問能力嘛?如果都可以直接訪問,那IPC模塊的主要應用場景是哪些呢?
    發(fā)表于 02-02 11:44

    【2023電子工程師大會】基于RK3568的OH開發(fā)及ppt

    【2023電子工程師大會】基于RK3568的OH開發(fā)及ppt
    發(fā)表于 01-03 16:31 ?23次下載

    光路激光焊接機技術詳解優(yōu)勢及相關的種類有哪些

    編輯:鐳拓激光光路激光焊接機目前可以適合大多數(shù)激光焊接,因焊接深度深,焊接強度好的特點,操作簡單,大大節(jié)約用戶人力成本。用戶需求實現(xiàn)全自動焊接或半自動焊接,以下是光路激光焊接機技術詳解優(yōu)勢及相關
    的頭像 發(fā)表于 12-18 10:45 ?458次閱讀
    <b class='flag-5'>雙</b>光路激光焊接機技術<b class='flag-5'>詳解</b>優(yōu)勢及相關的種類有哪些

    AWorksLP應用筆記:重定向printf函數(shù)

    printf函數(shù)作為標準庫定義的格式化輸出方式,本文將介紹其在AWorksLP下默認適配以及重映射至熱拔插設備端口的實現(xiàn)。默認適配AWorksLP中默認已經(jīng)對printf函數(shù)完成相關適配工作,且默認
    的頭像 發(fā)表于 11-25 08:24 ?539次閱讀
    <b class='flag-5'>AWorksLP</b>應用筆記:重定向printf函數(shù)

    多核異構(gòu)中A與M通信過程

    目前域控項目有的采用S32G這類多核異構(gòu)的芯片,轉(zhuǎn)載一篇分析下多核異構(gòu)中A與M通信過程的文章。
    的頭像 發(fā)表于 10-31 11:09 ?1015次閱讀
    多核異構(gòu)中A<b class='flag-5'>核</b>與M<b class='flag-5'>核</b><b class='flag-5'>通信</b>過程

    【深度測評】HPM6750 MCU片內(nèi)16位ADC精度測試

    【深度測評】HPM6750 MCU片內(nèi)16位ADC精度測試
    的頭像 發(fā)表于 10-30 17:43 ?2566次閱讀
    【深度測評】HPM<b class='flag-5'>6750</b> MCU片內(nèi)16位ADC精度測試

    無法用start gui生成雙例程

    當我嘗試用start gui生成一個支行的hello程序來學習的時候,發(fā)生提示錯誤,如下圖所示: 改選6750evk等其它板子也不行,提示的錯誤一。 請教各位大佬,這是什么情況,
    發(fā)表于 10-29 11:16

    MindSDK應用基礎——TIM模塊

    MindSDK應用基礎——TIM模塊
    的頭像 發(fā)表于 10-25 16:25 ?498次閱讀