i.MX RT600 双核通讯之 MU 消息单元

    NXP 推出的i.MX RT600 系列 MCU,其内部包含了 Cortex-M33控制处理器内核和 HiFi 4 DSP处理器内核,默认情况下只使用到 Cortex-M33 时 DSP 默认不工作,如果需要使用到 DSP 则可以通过 Cortex-M33 来对 DSP 进行初始化,从而启动 DSP,此时在双核工作模式下,RT600 可以通过 MU(消息单元)实现双核之间的通讯。


1. MU(消息单元)
    MU 是双核共享的一个外设,具有 32 位 IP 总线接口以及对应于每个处理器的中断请求信号。消息单元向每个处理器公开一组寄存器,通过 32 位的数据字、中断和标志实现处理器间的通信。在 SDK_2_13_0_EVK-MIMXRT685 包中,提供 MU 使用的相关例程,下面来看看例程中对 MU 的使用和配置。

         

                                (图片引用自 NXP《AN12789 RT600 双核通信与调试》)


2. mu_interrupt
    在 SDK 中 MU 的例程有两个,分别是 mu_interrupt 和 mu_polling,演示了 MU 的中断和轮询两种方式,两者差不多,下面主要以 mu_interrupt 来看。

    前面提到,默认情况下 RT600 中 DSP 是不工作的,需要由 ARM 核进行初始化 ,所以先从 AMR 核工程来看。首先是 MU 的初始化,MU 的初始化比较简单,通过 RSTCTL1_PRSTCTL1 寄存器对外设 MU 进行复位,并通过 RSTCTL1_PRSTCTL1_CLR 清除外设 MU 复位状态,在例程中通过 RESET_PeripheralReset(kMU_RST_SHIFT_RSTn); 来完成;使能 MU 时钟,是例程中 MU_Init(APP_MU); 初始化完成的主要功能,此时已经可以使用 MU 模块。那么如果后续需要使用 MU 的中断,则需要使能 MU 的中断。

        

    MU 初始化完成后对 DSP 进行初始化,并启动 DSP ,需要等待 DSP 启动再往下执行。

        


    此时使用到 MU 的第一个功能,MU 中有三个通用的标志位可以进行设置,这个标志位可以反应到另一侧,以下是 DSP 部分的代码,这里 DSP 启动后对 MU 进行初始化,过程与 ARM 核中相似,初始化 MU 后,设置 MU 的通用标志位,改标志位会反应到 ARM 核中,此时 MU_GetFlags(APP_MU); 可以获取到 DSP 设置的标志位,从而知道 DSP 已经运行。


        

    ARM 和 DSP 都启动后,例程中则开始通过中断进行数据发送,以下是 MU 的中断处理函数,主要是在中断中通过 MU_SendMsgNonBlocking 和 MU_ReceiveMsgNonBlocking 接收或发送数据,DSP 中的中断处理类似;CHN_MU_REG_NUM 为使用的 MU TX 或 RX 寄存器的索引号,MU 中一共有 4 个 TX 寄存器和 4 个 RX 寄存器,只要了解以下两个特性就可以使用好 MU,以寄存器 0 为例:

      1.在 ARM 中向 TX0 寄存器写入数据,会立即反应在 DSP RX0 寄存器中,并触发 DSP RX0 寄存器满中断,反之亦然;
      2.DSP 中读取 RX0 寄存器,可清除 RX0 寄存器满中断,并触发 ARM TX0 寄存器空中断,反之亦然,此时有需要可以继续下一包数据的发送;

        


    整个例程中,ARM 将发送 32 个数据给 DSP ,DSP 接收完 32 个数据在将其发送给 ARM ,最后 ARM 校验发送接收前后的数据,将代码烧录到 DSP 的开发板中,运行可以看到如下输出。

        


3.MU 一种用法
    在 SDK MU 例程中,ARM 和 DSP 通过 MU 发送接收了 32 个数据,数据较少,通常 RT600 的 DSP 在应用开发中用于处理音频数据,此时如果需要将大量的数据发送到 ARM 中,或者 ARM 中有音频数据需要共享给 DSP,再通过 MU 发送就有点不方便了;这里给大家提供一种思路, RT600 中,有 4.5M 的SRAM,这个空间是 ARM 和 DSP 都可以进行访问的,此时,可以在 SRAM 中定义好一块区域作为 ARM 和 DSP 双方共享数据的空间,一方准备好数据后通过 MU 通知对方去相应的地址读取数据,这样就可以实现大量数据的共享了;那么问题来了,如果 DSP 正在取用共享 SRAM 区域的数据,此时 ARM 开始对共享的 SRAM 区域进行下一次写入,必然会造成数据出错,那应该如何避免呢?不用担心,RT600 早已考虑到多处理器系统下竞争共享资源的情况,可以通过信号量块(Semaphore Block)来避免,那么此处留下一个悬念,下次再给大家带来分享。

    那么以上就是本文的全部内容,如果文中有错误或遗漏欢迎大家帮忙指出,相互学习。



参考文档

AN12789 RT600 双核通信与调试    ---NXP
UM11147 RT6xx User manual        ---NXP

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论