• 资料介绍
  • 在线预览
  • 相关推荐
申请入驻 产业图谱

LAT6020 STM32MP15X核间通信常见问题解析

03/19 10:50
612
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

LAT6020 STM32MP15X核间通信常见问题解析

562.89 KB

引言

STM32 STM32MP15X 是基于 CM4+CA7 的异构 SOC,CM4 侧用于实时任务的处理,CA7 侧运行 Linux,负责更加复杂的计算和任务处理,CM4 侧采集到的数据通常会给到 CA7 去做处理,因此必然需要核间通信的机制,核间通信需要硬件软件的支持

硬件:

1)IPCC: 负责产生中断信号

2)共享内存:负责数据交互

软件:

1)CM4 侧 OPenAMP

2)CA7 Linux 侧 RPMsg framework(Mailbox,Remoteproc,RPMsg,VirtIO)

对于核间通信的基本原理请阅读相关 wiki 站点文档。

https://wiki.stmicroelectronics.cn/stm32mpu/wiki/Exchanging_buffers_with_the_coprocessor

https://wiki.stmicroelectronics.cn/stm32mpu/wiki/Linux_RPMsg_framework_overview

本文将结合几个实际案例讨论核间通信可能遇到的问题

  • 如何增加 RPMsg buffer size
  • 如何增加 RPMsg 通道数
  • RPMsg 通信过程出现死锁
  • 双核通信过程出现 No more buffer in queue,通信终止

如何增加 RPMsg buffer size

如何将通道数增加为 64,且通道 size 改为 256byte

通过前文的理解,我们已经知道如何计算 vdev0buffer 和 vdev0vring 的 size 了, 根据通道vdev size 的计算公式 vdev0buffer_size = buffer_size * number _of buffer * 2可计算所需的 vdev0buffer_size=256 * 64*2=32768byte=0x8000Vring size:16 通道,vring size 为 438byte, 那么可得 64 通道时的 vring_size 约为1752byte=0x6db,由于 reserve memory 按照 4K page size(0x1000)对齐,且 64 通道数的情况下所需要的vring_size 0x6db 仍然小于 0x1000,vring size 的大小可保持不变。

RPMSG 通信死锁案例解析

问题现象是 RPMSG 通信过程中出现死锁,导致通信中断,系统重启。

No more buffer in queue

该问题表现为在 RPMSG 正常通信一段时间后,CA7 linux 内核不停打印日志 No more bufferin queue,通信过程中断,此时即使重新加载 CM4 仍然不能恢复,只能重启系统,该问题仅在OPENSTLINUX_V1.0 版本,即对应的内核 v4.19 版本中出现,在后续版本中已修复。

在线预览

相关推荐