查看: 1747|回复: 0

[分享] 浅析RT1170的双核通信机制

[复制链接]
  • TA的每日心情
    慵懒
    昨天 21:19
  • 签到天数: 1210 天

    [LV.10]以坛为家III

    22

    主题

    4763

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    8083

    活跃会员

    最后登录
    2024-4-26
    发表于 2021-5-13 09:19:00 | 显示全部楼层 |阅读模式
    RT1170是双核处理器。而双核应用中,很重要的一个问题就是如何保持两个core之间的同步。
    在1170上,相关的方法有:
    1.MU(Message Unit)
    2.SEMA(Semaphore)
    3.Shared memory

    MU用最通俗的方式讲解就是,可以看成8个寄存器,按不同的方向分成两组,每组4个。
    这样,单向有4个通信寄存器。A核往任意A到B方向的一个寄存器写一个32bit的值,B核会产生中断,同时可以从寄存器中拿到A核过来的信息。
    反之,B核往A核写4个寄存器中的任何一个,也能触发A核的中断,并且A核可以从寄存器中拿到B核写入寄存器的内容。

    1.jpg






    SDK提供了相关的API进行MU的操作,实现非常便捷。
    void MU_SendMsg(MU_Type *base, uint32_t regIndex, uint32_t msg);
    uint32_t MU_ReceiveMsg(MU_Type *base, uint32_t regIndex);

    SEMA的字面意思就是信号量,信号量有很多种,这里不详细讨论了。
    1170实现的是互斥信号,即01信号量,最常用的场景是资源互斥,拿到信号量的core才能使用资源。如果拿不到又要使用资源,就必须等。拿到资源的core使用完后要尽快释放SEMA,以让另一个core能使用设备。
    SEMA硬件支持16组01信号量。







    SDK提供的SEMA API也非常便捷:
    status_t SEMA4_TryLock(SEMA4_Type *base, uint8_t gateNum, uint8_t procNum);
    根据这个函数的返回值判断lock是否成功,如果失败可以尝试一直去拿, 也支持中断,对方释放请求的SEMA后,本机会有一个中断产生,此时可以再一次尝试拿SEMA。

    Shared Memory主要用于大批量数据通信,比如一个core有个大buffer的数据要给另一个core。
    这里首先要考虑好是不是真的要这样来assign两个core去处理同一个大数据块。能一个core搞定的,就别弄两个core了,调试各方面都麻烦。
    这里只讲重点,1170上并没有特殊的区域作为shared memory。所以对于一块memory,如果CM4和CM7都可以读/写,就可以作为shared memory。
    建议把shared memory放到non cacheable的region。否则,需要做cache maintenance。
    以下是一组实测的共享内存结果,CM7写,CM4读。该测试涵盖了片内的OCRAM和片外的SDRAM。
    对于TCM的share, CM4的TCM 被从映射到了M7的0x2020_0000空间,但是CM7的TCM/FLEX RAM没有针对CM4的重映空间。换句话说,M7可以访问M4的TCM,但是M4不能访问M7的TCM/FLEX RAM。如果实在要访问只能通过DMA间接实现。请注意EDMA 和 EDMA_LPSR都是共享M7 memory map的。
    log:
    Get MU data, 11223344

    80000000 = 80800000
    80000004 = 80800001
    80000008 = 80800002
    8000000c = 80800003

    20350000 = 35000000
    20350004 = 35000001
    20350008 = 35000002
    2035000c = 35000003

    20340000 = 34000000
    20340004 = 34000001
    20340008 = 34000002
    2034000c = 34000003

    202c0000 = 2c000000
    202c0004 = 2c000001
    202c0008 = 2c000002
    202c000c = 2c000003

    20240000 = 24000000
    20240004 = 24000001
    20240008 = 24000002
    2024000c = 24000003

    2.jpg
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 16:32 , Processed in 0.111285 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表