本文档主要介绍 G32R5xx IPC模块的相关内容。具体内容包括 IPC模块基本介绍、寄存器访问方式、共享的 RAM存储区以及双核的启动过程。文中还提供了 IPC模块的应用示例,包括使用消息邮箱实现双核通信、资源共享的实现方法,以及 IPC模块的事件控制使用流程。
G32R5xx IPC模块介绍
2.1 概述
G32R501是一款同构多核非对称架构的双核微控制器芯片,内部集成了两颗 Arm® Cortex®-M52内核,其中 CPU0为主核,CPU1为从核。在双核运行模式下,两个内核需要相互进行通信。G32R501提供了 IPC(处理器间通信)模块,以实现双核之间的通信。其中,G32R501 IPC模块包含三个部分功能:
- 中断控制和数据共享(邮箱):
- 通过 4个寄存器共享数据,并可以为每个 CPU生成 12个中断。
- 通过共享内存交换数据。
- 事件控制
- WRPRT:实现了 WRPRT功能。写寄器保护功能可以防止 CPU对一些外设模块的寄器进行错误的写操作。
2.2 寄器访问
G32R501的 IPC模块并非作为一个片上外设模块存在,而是与 Arm内核的协处理器接口相连,协处理器编号为 1。因此,对 IPC模块寄器的访问,只能通过 Arm内核提供的协处理指令进行读写操作。Arm内核提供了 MCR/MRC或 MCRR/MRRC协处理指令,用于访问位于协处理接口上的 IPC模块。其中,MCR/MRC指令一次仅能传输 32位数据,而 MCRR/MRRC指令则可以一次传输 64位数据。有关这些协处理指令的详细信息,请参考 Arm官方提供的 Cortex-M内核技术参考手册。
以下简要说明 MCR和 MRC指令的格式。MCR指令用于将 Arm寄器中的数据写入协处理器寄器,而 MRC指令则用于将协处理器寄器中的数据读取到 Arm寄器中。
MCR与 MRC指令格式:
MCR{cond} coproc,,,,,
MRR{cond} coproc,,,,,
其中各个参数含义如下表所示:
| 指令参数 | 含义 |
|---|---|
| cond | 指令执行的条件码,可忽略 |
| coproc | 协处理器编号。IPC模块是协处理器编号是 1 |
| opc1 | 协处理器要执行的操作码 |
| Rt | ARM内核寄器 |
| CRn | 协处理器的目标寄器 |
| CRm | 协处理器的目标寄器。如果只用到一个则设置为 c0 |
| opc2 | 可选的协处理器特定操作码,当不需要时设置为 0 |
G32R5xx SDK中的 IPC模块驱动代码已经对相关的协处理指令操作进行了封装,并提供了相应的接口函数供用户调用,用户无需直接使用这些复杂的指令来操作 IPC模块的寄器。
2.3 双核共享的 RAM存储区
G32R501有 ITCM、DTCM、SRAM三种 RAM存储区类型,一共有 7块独立的 RAM存储区,如下表所示:
| RAM存储区类型 | 起始地址 |
|---|---|
| CPU0_ITCM | 0x0000_0000 |
| CPU1_ITCM | 0x0000_0000 |
| CPU0_DTCM | 0x2000_0000 |
| CPU1_DTCM | 0x2000_0000 |
| SRAM1 | 0x2010_0000 |
| SRAM2 | 0x2020_0000 |
| SRAM3 | 0x2030_0000 |
尽管 CPU0和 CPU1的 ITCM和 DTCM存储区具有相同的地址,但它们各自拥有独立的物理存储空间。此外,CPU0只能访问其自身的 ITCM和 DTCM,无法访问 CPU1的 ITCM和 DTCM;同样,CPU1也只能访问其自身的 ITCM和 DTCM,而无法访问 CPU0的 ITCM和 DTCM。SRAM1/2/3则是 CPU0和 CPU1都可以访问的共享 RAM存储区,如果有数据块需要从一个核传递到另一个核,那么通过 IPC模块再结合共享的 RAM存储区是一个很好的选择。典型的工作流程如下:
- CPU0将数据块写入共享存储区。
- 完成之后,CPU0触发 CPU1 IPC模块的 GP中断,那么 CPU1就会知道来自 CPU0的数据块已经准备就绪。
- CPU1读取数据块,并进行处理。
- 步骤 3完成之后,CPU1触发 CPU0 IPC模块的 GP中断,那么 CPU0就会知道 CPU1已经处理完该数据块,然后 CPU0可以接着继续传递新的数据块给 CPU0。
2.4 双核启动过程
G32R501首先从主核 CPU0启动,然后执行 BOOTROM。在 CPU0启动后,通过写入BOOT_ADDR1寄器配置 CPU1的启动地址,并通过写入 BOOTCTRL寄器以开启 CPU1的时钟。这样,从核 CPU1就可以从 BOOT_ADDR1寄器配置的地址处开始执行程序。双核启动过程的流程图如下:
启动 CPU1从核的基本步骤是:
- 将从核的映像文件编译到主核的映像文件中,然后把得到的主核映像文件下载到 G32R501。
- 主核执行程序,配置从核的启动地址并使能从核的时钟,从而启动从核。
- CPU1从核开始执行程序。
在 G32R501中,主核和从核共用同一片 Flash存储空间,因此将从核的映像文件编译到主核的映像文件中时,需要考虑两个核所占用的 Flash空间分配问题。在 G32R5xx SDK中所提供的双核例程,将 Flash的大小均等划分给两个 CPU核使用。如果用户希望修改主核和从核所占用的Flash空间大小,可以通过修改双核启动例程的.sct链接文件来实现。
134
