NCS初探--基于nRF5340的双核通信(2)

本文档介绍了如何在Zephyr操作系统中使用RPMSG服务进行双核通信。通过创建一个应用核作为master,网络核作为remote的示例,详细阐述了数据在两核间的传递流程。在应用核中,数据通过RPC服务发送到远程核心,经过加1操作后再返回,直到达到特定条件(数据加1大于100)为止。文章提供了代码下载、编译和运行指导,并对比了这种方法与上一章中基于RPC的通信方式的优缺点。
摘要由CSDN通过智能技术生成

接上一章:NCS初探--基于nRF5340的双核通信

上一章介绍了nrf里基于RPC的双核通信例子,本章介绍一下zephyr里的双核通信例程。

此工程把应用核当成master core,网络核当成remote core,master先发送0到remote,remote收到后+1,然后发回给master,然后master再+1,再发送,一直循环,直到master收到数据+1后>=100则停止。实际效果打印如下图:

 代码下载

首先打开工程,项目目录为

v1.5.1\zephyr\samples\subsys\ipc\rpmsg_service\

在SES中编译好应用核代码后还是推荐使用【west flash】下载。

网络核代码目录为 v1.5.1\zephyr\samples\subsys\ipc\rpmsg_service\remote ,装载项目如下:

 编译完成后直接下载或者使用【west flash】下载。

如果一开始就使用【west build -b nrf5340dk_nrf5340_cpuapp】构建项目,则应用核和网络核代码会一起编译,编译完成后,网络核代码的构建目录路径为:

\v1.5.1\zephyr\samples\subsys\ipc\rpmsg_service\build\rpmsg_service_remote-prefix\src\rpmsg_service_remote-build

你可以直接cd到这个目录使用【west flash】下载。

代码分析

首先看应用核代码,在main()前的初始化,和上一章一样,使用SYS_INIT宏定义:

网络核和应用核通信就是围绕着这个端点展开,而端点ID是区分端点的关键。而在申请端点时,需要传入一个有数据到来的回调函数去处理数据,在应用核该函数如下:

这个回调函数内的信号量是为了告诉某个等待数据的线程,有数据到来。 

在应用核main()里创建了一个线程专门用来发送和接收数据:

有关线程内容并非此章讨论重点,不再展开,只开线程loop函数:

 数据发送很简单,直接调用了库函数:

函数原型:

 获取数据更加简单:

 可以看到,数据其实就是在一开始的回调里获取的,把数据赋值给了一个全局变量,然后释放一个信号量,接收数据即获取信号量,然后返回全局变量的值。

同理,在网络核中,所有函数基本和应用核中一模一样,先申请端点,再创建线程,最后再线程中收发:

 总结

可以看到本章方法比上一章简单很多,数据收发都更为灵活,但是在进程间通信可能引发的数据问题则需要自己去解决,上一章看似繁琐,但是需要考虑的东西反而比较少。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值