S32G2汽车网关开发(四):IPCF通信

        作为多核异构SOC,恩智浦为S32G2提供了核间通信方式——IPCF,作为Soc子系统,它使应用层程序可以通过共享内存进行通信。应用程序支持在同构或异构处理核心中,提供了两种核间通知方法,包括核间中断和轮询方式。接下来我将使用S32G274ARDB2的RGB LED灯和串口演示IPCF的使用过程并进行了分析。

一. 准备环境

        1.M7核心       

        在S32DS中下载好S32G2的SDK,并从官网上下载IPCF扩展软件包,并在S32DS新建example工程,将IPCF示例工程添加到工作区下。请注意使用的RTD软件包版本要与IPCF示例版本一致,具体可以看示例工程中的includes路径。

450f071e4d504ad585771590764982d8.png

        

        这一部分用于编译运行在M7核心裸机的镜像文件,可以在此工程基础之上进行移植与修改。不做改动进行编译,例程中保留通过虚拟串口的核间信息发送功能,编译出的二进制文件需按照上一篇文章同样的方法进行头部信息的添加生成最终的二进制文件,要注意二进制文件的起始地址与加载地址。

       2.A53核心

        使用官方bsp中提供的内核与根文件系统,提供驱动,ipc-shm-de.ko与ipc-shm-sample.ko,当前bsp版本会出现与M7镜像文件接发消息不一致的情况,可在M7工程中通过修改程序修正。

二.源码解析

        在官方提供的ipcf支持包工程下进行功能拓展,实现A53核心异核点灯功能。

        在基础工程中,ipcf使用了核间中断的方式进行通信。IPCF驱动程序通过中断合并技术减少了接收中断的开销。当接收中断被触发时,代码会禁用中断,处理接收FIFO中的所有缓冲区描述符,然后重新启用中断。

91e4039ec5164d338dabff44faaaeba6.png

        整体流程包括

        1.初始化共享内存:这一步骤中,在M7中会使用Mpu_M7_Ip_SetRegionConfig函数初始化一片共享内存区域,这段区域位于SRAM中,在本工程中M7核心镜像启动后会先将0x34000000-0x342fffff区域划分为共享内存区域。

9065ecd48bd8446c8c968140d80dd52b.png

       2.初始化外设与中断:在IntCtrl_Ip_Init() 函数中初始化外设使用中断,随后利用ipc_sample_configure_irq() 函数为核心中断方式接收信息功能设置中断优先级。在ipcf_Ip_Cfg.c文件中可以详细看到相关配置情况。

e1da1ddb8e824165aea6898699beaccc.png

        在这里可以详细看到对于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发送第一条消息,当接收到消息时,便进入了处理消息阶段,这里类似中断回调函数,可以在此定义功能。

5cb9b29577924420b15e6585b77e0888.png

        在这里我们添加了点亮LED的操作。这里由于IPCF工程版本与我使用的内核IPCF驱动版本不一致,导致无法正常互传消息,此时要注意修改工程中回发字符串的内容,实现最终互传效果。

三.最终效果

ffb384f8b4eb4dccb8d777facd031cf7.png

使用的bsp33.0系统,IPCF版本为4.6.0,M核在接收到消息“10”时产生了中断并申请buf接收信息,同时点亮rgbled.

554a90015dcf4d4f954eb1e7c84a1d2a.png

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
NXP S32G2开发涉及使用M7裸机程序点亮LED,配置U-Boot引导加载程序,使用Linux BSP包含的内核映像和根文件系统。首先需要从NXP官网下载S32G2相关SDK,包括S32G2sdk包和RTD包。然后在S32DS软件中进行配置,可以通过S32DS的帮助菜单找到安装新软件的选项,选择之前下载好的SDK进行安装。接下来可以新建工程开始开发。U-Boot引导加载程序支持SD/MMC/eMMC和QSPI,而Linux内核映像基于Linux v5.10.41预编译,根文件系统包含了NXP库。具体操作可以参考官方文档提供的步骤和命令。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [S32G2汽车网关开发(三):点亮LED(M7裸机,异核启动)](https://blog.csdn.net/qq_64043757/article/details/130536342)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [NXP S32G2开发](https://blog.csdn.net/usstmiracle/article/details/125300939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值