上一章介绍了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函数:
数据发送很简单,直接调用了库函数:
函数原型:
获取数据更加简单:
可以看到,数据其实就是在一开始的回调里获取的,把数据赋值给了一个全局变量,然后释放一个信号量,接收数据即获取信号量,然后返回全局变量的值。
同理,在网络核中,所有函数基本和应用核中一模一样,先申请端点,再创建线程,最后再线程中收发:
总结
可以看到本章方法比上一章简单很多,数据收发都更为灵活,但是在进程间通信可能引发的数据问题则需要自己去解决,上一章看似繁琐,但是需要考虑的东西反而比较少。