ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【STM32MP157 异核通信框架学习篇】(2)IPCC通信框架

【STM32MP157 异核通信框架学习篇】(2)IPCC通信框架 文章目录1 概要2 IPCC 通信框架2.1 IPCC 框架2.2 IPCC 通道2.3 IPCC 寄存器2.4 IPCC 功能描述2.4.1 IPCC 概述2.4.2 IPCC 通信模式2.5 Mailbox 框架3 总结4 其他章节1 概要使用正点原子的stm32mp157mini进行RPMSG多核通信试验。硬件STM32MP157软件STM32CubeIDE / STM32CubeMX本章节将会介绍IPCC通信框架STM32MP157的A核和M核之间通信底层将会使用这个框架进行消息交互。2 IPCC 通信框架当多个处理器位于不同的设备中时这种情况我们称之为多个 SOC片上系统如果这两个设备的处理器要进行核间通信可以通过物理串行链路来完成其它的如 I2C、SPI、PCIE等此处只考虑串行链路的情况如下图 3.2.1 所示两个 SOC 可以通过串口进行核间通信例如开发板和我们的 PC 属于两个设备它们之间可以通过串口来互发数据。如果是多核 SOC一颗芯片中有多个处理器呢一般可以通过基于 IPC进程间通信的硬件邮箱Mailbox和可选的共享内存来完成如下图 3.2.2 所示在一个 SOC 上有两个处理器我们称之为多处理器 SOC或多核 SOC这两个处理器通过硬件邮箱和共享内存来完成核间通信。关于硬件邮箱和共享内存我们会在后面进行介绍下面我们先来了解硬件 IPCC。2.1 IPCC 框架IPCInter-Process Communication进程间通信是指两个进程的数据之间发生交互它是通过处理器间通信控制器 IPCCInter-Process Communication controller IPC 控制器来实现的IPCC属于硬件部分用于在两个CPU之间进行信号交换邮箱依赖于IPCCSTM32MP157的 IPCC 硬件模块有 6 个双向通道每个通道分为两个子通道6 个双向通道则共有 12 个子通道。如下图 3.2.1.1 所示是 A7 内核和 M4 内核通过 IPCC 进行通信的结构框图。对于上图 3.2.1.1其通信过程为① 处理器之间交互的数据存放于共享内存中上图 3.2.1.1 并未画出共享的内存共享的内存对参与核间通信的 CPU 都是可见的。对于 STM32MP157 来说在 ST 给的参考设计中共享内存是在 SRAM3 中众所周知SRAM3 并不是 IPCC 的一部分即共享的内存并不是 IPCC的一部分这点要注意。 IPCC起到一个消息通知的作用通过通知不同核彼此的发送状态如A和是否发送完成M核是否接收完成从而到对应的共享内存区进行数据的读取② 当一个数据包被放入共享内存时CPU 需要中断或“通知”另一个 CPU 有新的数据包在共享内存中要处理另外一个 CPU 收到信号后就去处理了这是使用 IPCC 硬件中断机制来完成的A7 内核的中断控制器是 GICM4 内核的中断控制器是 NVIC。IPCC 的作用就好比放哨员什么时候有数据可以接收什么时候可以发送数据整个过程是由 IPCC 来控制的。IPCC只是提供了处理器之间信息交换的机制它并不具有数据传输功能也就是说处理器之间要交互的数据并不是在 IPCC 中传输的是在共享内存中传输的。③ 从图中看到在 IPCC 处封装了邮箱Mailbox框架邮箱框架主要用于通知 CPU 在共享内存中有数据要处理即转发通知我们在后面会进行介绍。2.2 IPCC 通道IPCC 的 6 个通信的工作模式可分为单工、半双工和全双工下面我们来看 IPCC 的这 6个双向通道都有哪些用途从 CPU1 到 CPU2 的方向有 6 个通道P1_TO_P2 子通道P1 代表 CPU1P2 代表CPU2从 CPU2 到 CPU1 的方向有 6 个通道P2_TO_P1 子通道P1 代表 CPU1P2 代表CPU2如下表 3.2.2.1 所示在 ST 官方配置的 IPCC 通信模型中这 6 个通道被当做不同的软件框架来使用其中① 通道 3 为单工模式被当做 RemoteProc 框架主处理器可通过该框架来加载协处理器的固件以及控制协处理器的生命周期② 通道 2 为全双工模式被当做 RPMsg 框架用于将 A7 的消息传输到 M4③ 通道 1 为全双工模式被当做 RPMsg 框架用于将 M4 的消息传输到 A7。可以看到在ST配置好的框架中RemoteProc软件框架解决了远程处理器生命周期的问题RPMsg软件框架解决了核间通信的问题这两个就是在多核处理器通信中关心的问题在Linux内核下已经有ST移植好的RemoteProc和RPMsg软件框架在M4使用的OpenAMP库中也有对应的RemoteProc和RPMsg软件框架M4主要依赖OpenAMP库中已有的软件框架来实现和A7通信。 注意为了便于主核能够控制协处理器因此在linux端设计了OpenAMP框架但是同时为了兼容linux端OpenAMP框架M4的相关产商也设计了一个OpenAMP框架两者是可对接的但是还是有一定区别但是名字一样如下图3.2.2.1所示STM32MP157的A7和M4实际上是通过通道1和通道2来传递数据的2.3 IPCC 寄存器下面我们先了解如下表3.2.3.1所示和IPCC相关的8个寄存器寄存器区被分成两个区域每个处理器占用一个区域防止读——写访问冲突如下表中前4个寄存器被处理器1占用后4个寄存器被处理器2占用。IPCC为处理器提供专用的中断每个处理器都有自己的状态屏蔽寄存器位、每个通道的设置或清除寄存器位。对上表3.2.3.1中的寄存器说明如下第17~ 31和第1~15位保留位必须保持在复位值。第16位TXFIE处理器1发送TX通道空闲中断使能位与 IPCC_C1TOC2SR关联当该位为1使能处理器1发送TX通道空闲中断0关闭处理器1发送TX通道空闲中断。第0位RXOIE处理器1接收RX通道占用中断使能位与IPCC_C2TOC1SR关联当该位为1使能处理器1接收RX通道占用中断0关闭处理器1接收RX通道占用中断。第22~ 31位和第6~15位保留位必须保持在复位值。第16~ 21位CH1FM~CH6FM处理器1发送TX通道X空闲中断屏蔽位与 IPCC_C1TOC2SR.CHxF关联当该位为1发送TX通道X空闲中断被屏蔽0发送TX通道X空闲中断未被屏蔽。第05位CH1OMCH6OM处理器1接收RX通道X占用中断屏蔽位与IPCC_C2TOC1SR.CHxF相关当该位为1接收RX通道X占用中断被屏蔽0接收RX通道X占用中断未被屏蔽。第22~ 31位和第6~15位保留位必须保持在复位值。第16~ 21位CH1S~CH6S处理器1发送TX通道X状态设置位与IPCC_C1TOC2SR.CHxF 相关当设置该位1处理器1发送TX通道X状态位被设置即将CHnF设置为1表示通道被占用0无动作。第0~ 5位CH1C~CH6C处理器1接收RX通道X状态清除位与IPCC_C2TOC1SR.CHxF关联当设置该位1处理器1接收RX通道X状态位清零0无动作。2.4 IPCC 功能描述2.4.1 IPCC 概述IPCC 对处理器通信的控制其实是通过中断的方式来实现的称为核间中断IPI在每个处理器上都有两条中断线分别是① 一条用于 RX 通道占用发送处理器发布数据② 一条用于TX通道空闲接收处理器读取通信数据。每个通道都有中断屏蔽① 通道占用屏蔽位 CHnOM② 通道空闲屏蔽位CHnFM。每个子通道都有两种工作模式① 单工模式每个通道都有自己的通信数据存储位置② 半双工模式与双向通信数据信息存储位置关联的单个通道。通信的数据位于共享内存中注意共享内存不是 IPCC 的一部分每次通信IPCC 模块提供一个通道状态标志位 CHnFn 可取值 1~6表示对应的通道① 当 CHnF0 时表示相关的通道是空闲的也可以认为通信的数据已经被接收处理器读取了此时通道处于空闲状态了这个时候发送处理器可以占用这个通道用于发送数据② 当 CHnF1 时表示相关的通道已经被占用了即通信数据已经被发送处理器发布了这个时候接收处理器可以去访问该通道以读取数据。IPCC 为通道管理提供非阻塞信令机制① 消息可用性中断② 通道流控制如生成一个 TX 通道空闲中断则称为流开启当通道被占用时则称为流关闭。应用程序受益于基于非阻塞中断的消息交换和通道流控制来进行核间通信每个子通道会有一个传输方向① 从 CPU1 发送并由 CPU2 接收② 或者从 CPU2 发送并由 CPU1 接收。2.4.2 IPCC 通信模式下面我们来看 IPCC 是如何协调主处理器和协处理器进行核间通信的也就是如何控制处理器有序地访问共享内存。关于该部分了解即可。(1) IPCC 单工发送模式如下图 3.2.4.1 所示为 IPCC 单工发送模式示意图。当通道状态标志为通道占用时CHnF1这是因为接收方没有从先前的消息中释放通道这个时候通道空闲中断被取消屏蔽然后等待 TX 空闲中断。一旦接收方释放了通道就会产生通道空闲中断流开启。当产生通道空闲中断时通道空闲中断被屏蔽消息可以写入数据缓冲区。随后通道状态标志被设置为已占用这会触发接收端的通道占用中断。 即开启 IPCC 通道 n 的发送端空闲中断当接收端释放该通道时让发送端 CPU 收到中断知道可以继续发送下一条消息。2IPCC 单工接收模式如下图 3.2.4.2 所示为 IPCC 单工发送模式示意图。当产生通道占用中断时接收端确定是哪个通道被占用并屏蔽相应的通道占用中断随后可以从共享内存中读取数据一旦读取数据通道状态标志 CHnF 将被清除CHnF0通道占用中断被取消屏蔽。3IPCC 半双工发送模式如下图 3.2.4.3 所示为 IPCC 半双工发送模式示意图。半双工过程允许使用单个共享缓冲区将消息从发送方传输到接收方然后将响应Response pending从接收方发送回发送方。发送端发送数据过程软件变量 response pending1 表示发送端等待接收端的应答response pending0 表示获得接收端的应答。首先发送方检查通道状态标志如果通道状态标志指示通道被占用CHnF1即由于接收方尚未发送对先前消息的响应则发送方等待响应如果通道空闲发送方可以将消息写入共享内存中。随后通道状态标志被设置为被占用这会触发接收端的 RX 通道占用中断一旦通道状态标志 CHnF1通道空闲中断被取消屏蔽。通道空闲中断表示接收方发送的响应是否可用当产生通道空闲中断时响应就绪发送方确定释放哪个通道并屏蔽相应的通道空闲中断随后可以从共享内存中读取响应。接收端的响应过程接收处理器等待软件变量 response pending 是否等于 1如果等于 1则接收端将响应写入共享内存中发布响应一旦发布了响应通道状态标志 CHnF 被 CHnC清除则 CHnF 为 0且接收端取消屏蔽通道占用中断CHnOM 0。4IPCC 半双工接收模式如下图 3.2.4.4 所示为 IPCC 半双工接收模式示意图。接收端读取数据当产生通道占用中断时接收端判断哪个通道被占用并屏蔽响应的通道占用中断随后从共享内存中接收数据只有在接收方将响应发送到共享内存中后通道才会被释放。发送端读取响应为了接收响应通道空闲中断被取消屏蔽发送处理器会检查那个通道变为空闲屏蔽相关的通道空闲中断然后从共享内存中读取响应注意可能会有很多人疑问接受模式核发送模式的关系是什么会因为这两幅图混淆其实就博主个人理解接收模式涵盖在了发送模式中大概位置如下图红框所示IPCC 为 6 个双向通道提供了一种非阻塞信令机制以原子方式发布和检索通信数据。非阻塞方式允许处理器以非阻塞的方式交换信息例如读取数据当不满足条件、未能立刻得到结果时先挂起进程然后每隔一段时间去检查是否满足条件了若满足则进行读取操作若不满足则不读取这就是非阻塞方式。以上描述的通信过程可以用如下图 3.2.4.5 来表示通信的处理器都可以访问共享的内存围绕共享内存从主处理器到协处理器以及从协处理器到主处理器的方向可以配置一根中断线即内核间中断PPI简称核中断核中断发起方首先将消息数据写到共享内存中然后发起核间中断被中断的核线程在中断服务程序中读取该共享内存以获得发起方通知的数据。在配置OpenAMP时我们有开启了M4的IPCC中断如下图3.2.4.6所示在M4工程的stm32mp1xx_it.c文件中可以找到IPCC中断处理程序如下所示其处理过程和以上的过程分析的差不多此处就不再重复分析了。/** * brief IPCC RX1 占用中断 * param 无 * * retval 无 */voidIPCC_RX1_IRQHandler(void){/* 该函数处理 IPCC Rx 占用中断请求 */HAL_IPCC_RX_IRQHandler(hipcc);}/** * brief IPCC TX1 空闲中断 * param 无 * retval 无 */voidIPCC_TX1_IRQHandler(void){/* 该函数处理 IPCC Tx 空闲中断请求 */HAL_IPCC_TX_IRQHandler(hipcc);}以上的处理过程在 M4 工程中都已经自动为我们配置好了其实我们不用关注这部分的实现我们更应该关注的是 RemoteProc 框架和 RPMsg 框架部分。2.5 Mailbox 框架我们来看看和 IPCC 紧密联系的 Mailbox邮箱框架Mailbox 是一种驱动架构它依赖于硬件平台来实现例如STM32MP157 平台的 Mailbox 依赖 IPCC 外设其 Mailbox 框架如下图 3.2.5.1 所示 Mailbox算是一种消息传输的工具底层依赖IPCC但是IPCC不传输数据Mailbox在基于IPCC的基础上可以进行消息数据的传递上层应用如何知道数据已经发送完毕或者已经接收完全了呢这个工作就交给 Mailbox 框架来处理Mailbox 的实现分为邮箱控制器Mailbox contoller和邮箱客户端Mailbox client1邮箱控制器主要负责配置和处理来自 IPCC 外设的消息队列或者中断请求IRQ并为负责发送或接收通知消息的邮箱客户端提供一个通用的 API。2邮箱客户端主要负责发送或接收通知消息它通过邮箱控制器提供的通道来发送或接收通知消息这个通道就是 IPCC 通道。用户可以自己定义邮箱客户端如上图 3.2.5.1 所示Linux 下的邮箱控制器是 stm32_ipcc它配置和控制 IPCC 外设可以提供邮箱服务。stm32_rproc 是远程处理器平台驱动程序它主要处理与远程处理器关联的平台资源例如寄存器、看门狗、复位、时钟和存储器可将对应回调函数注册到 Remoteproc 框架中还可以通过邮箱框架将通知消息转发到远程处理器。邮箱框架的大概工作流程是① 先注册邮箱控制器② 邮箱客户端发送数据前先申请通道③ 客户端发送数据④ 邮箱客户端记录数据⑤ 邮箱控制器将底层接收到的数据回调给上层应用⑥ 当数据发完时邮箱控制器通知上层当前数据已经发送完成⑦ 邮箱客户端释放通道。关于 Mailbox 框架在 Linux 内核源码 drivers/mailbox 目录下有相关的驱动感兴趣的小伙伴可以自行研究本篇我们重点讲解的是 RPMsg 框架和 Remoteproc 框架。3 总结本章介绍IPCC通信框架STM32MP157的A核和M核之间通信底层将会使用这个框架进行消息交互。参考文献:【1】【正点原子】STM32MP1异核通信(基于CubeIDE) V1.14 其他章节【STM32MP157 异核通信框架学习篇】1SMP和AMP架构【STM32MP157 异核通信框架学习篇】2IPCC通信框架【STM32MP157 异核通信框架学习篇】3OpenAMP框架【STM32MP157 异核通信框架学习篇】4驱动文件介绍【STM32MP157 异核通信框架学习篇】5Remoteproc 相关驱动简析 ---- 资源表【STM32MP157 异核通信框架学习篇】6Remoteproc 相关驱动简析 ---- 存储和系统资源分配【STM32MP157 异核通信框架学习篇】7Remoteproc 相关驱动简析 ---- 链接脚本【STM32MP157 异核通信框架学习篇】8Remoteproc 相关驱动简析 ---- 重新划分存储区域【STM32MP157 异核通信框架学习篇】10Linux下Remoteproc相关API (上)【STM32MP157 异核通信框架学习篇】10Linux下Remoteproc相关API (下)【STM32MP157 异核通信框架学习篇】11链接脚本【STM32MP157 异核通信框架学习篇】11链接脚本 – [额外补充: MP157板子存储分配]【STM32MP157 异核通信框架学习篇】12Remoteproc 的使用 [加载和启动M4固件] (上)【STM32MP157 异核通信框架学习篇】12Remoteproc 的使用 [加载和启动M4固件] (下)
返回列表