S32G2汽车网关开发(四):IPCF通信
本文进行IPCF点灯的实验操作,并对IPCF源码进行了分析。作为多核异构SOC,恩智浦为S32G2提供了核间通信方式——IPCF,作为Soc子系统,它使应用层程序可以通过共享内存进行通信。应用程序支持在同构或异构处理核心中,提供了两种核间通知方法,包括核间中断和轮询方式。接下来我将使用S32G274ARDB2的RGB LED灯和串口演示IPCF的使用过程。
作为多核异构SOC,恩智浦为S32G2提供了核间通信方式——IPCF,作为Soc子系统,它使应用层程序可以通过共享内存进行通信。应用程序支持在同构或异构处理核心中,提供了两种核间通知方法,包括核间中断和轮询方式。接下来我将使用S32G274ARDB2的RGB LED灯和串口演示IPCF的使用过程并进行了分析。
一. 准备环境
1.M7核心
在S32DS中下载好S32G2的SDK,并从官网上下载IPCF扩展软件包,并在S32DS新建example工程,将IPCF示例工程添加到工作区下。请注意使用的RTD软件包版本要与IPCF示例版本一致,具体可以看示例工程中的includes路径。
这一部分用于编译运行在M7核心裸机的镜像文件,可以在此工程基础之上进行移植与修改。不做改动进行编译,例程中保留通过虚拟串口的核间信息发送功能,编译出的二进制文件需按照上一篇文章同样的方法进行头部信息的添加生成最终的二进制文件,要注意二进制文件的起始地址与加载地址。
2.A53核心
使用官方bsp中提供的内核与根文件系统,提供驱动,ipc-shm-de.ko与ipc-shm-sample.ko,当前bsp版本会出现与M7镜像文件接发消息不一致的情况,可在M7工程中通过修改程序修正。
二.源码解析
在官方提供的ipcf支持包工程下进行功能拓展,实现A53核心异核点灯功能。
在基础工程中,ipcf使用了核间中断的方式进行通信。IPCF驱动程序通过中断合并技术减少了接收中断的开销。当接收中断被触发时,代码会禁用中断,处理接收FIFO中的所有缓冲区描述符,然后重新启用中断。
整体流程包括
1.初始化共享内存:这一步骤中,在M7中会使用Mpu_M7_Ip_SetRegionConfig函数初始化一片共享内存区域,这段区域位于SRAM中,在本工程中M7核心镜像启动后会先将0x34000000-0x342fffff区域划分为共享内存区域。
2.初始化外设与中断:在IntCtrl_Ip_Init() 函数中初始化外设使用中断,随后利用ipc_sample_configure_irq() 函数为核心中断方式接收信息功能设置中断优先级。在ipcf_Ip_Cfg.c文件中可以详细看到相关配置情况。
在这里可以详细看到对于remote core的选择,在这里工程利用IPCF进行M7和A53核的通信,IPCF还可以支持其它形式的核间通信方式,包括M7-M7等。当remote core也就是A53启动了shm驱动后,M7程序会进入等待中断读取消息的循环。
具体参数解释:
local_shm_addr:本地共享内存物理地址,这里的本地代表M7核心
remote_shm_addr:remote core的共享内存物理地址,指A53
inter_core_tx_irq/inter_core_rx_irq:在这里接收与发送中断不能使用同一中断
local_core:
type:选择local核心类型,这里的default表示驱动进行自动选择,这里是M7核
index:这里是remote core产生中断的核心索引,这里需要选择A53_0
trusted:这里写入trusted核心的掩码
remote_core:
type:remote core的类型,这里要指定为a53
index:指定索引,这里是a53_0
shm_size:共享内存大小
num_channels:共享内存通道数
要注意两个通信核心的通道数和缓冲区大小要一致。
3.等待消息和处理消息:通过类似信号量的方式等待remote core发送第一条消息,当接收到消息时,便进入了处理消息阶段,这里类似中断回调函数,可以在此定义功能。
在这里我们添加了点亮LED的操作。这里由于IPCF工程版本与我使用的内核IPCF驱动版本不一致,导致无法正常互传消息,此时要注意修改工程中回发字符串的内容,实现最终互传效果。
三.最终效果
使用的bsp33.0系统,IPCF版本为4.6.0,M核在接收到消息“10”时产生了中断并申请buf接收信息,同时点亮rgbled.
更多推荐
所有评论(0)