本文档记录了如何基于官方的rpmsg例程进行修改,达到个性化核间通信的目的。本文档完成了通过linux端控制舵机旋转特定角度。本文的前置博客为“MYZR RZ/V2H EK320 CM33 Freertos实战入门”,请确保自己已经完成此博客的学习。 1. 应用基础 瑞萨官方的rpmsg历程已经帮助我们完成了A55和M33在共享内存处的数据互访互取,所以我们直接调用顶层的封装函数或者直接在官方例程基础上进行改造,就可以简单地实现我们的个性化定制了 。我们在开发的过程中不需要去关心数据是怎么在共享内存中流动的,只需要做好两方的数据收发即可。 2. 修改官方linux端rpmsg例程 在“MYZR RZ/V2H EK320 多核异构与 Docker 适配镜像编译指南”这一篇博客,我们已经把multi-os层添加到了yocto工程中,在这里我们直接对rpmsg的源码进行修改重新编译即可。 打开wsl2,打开文件meta-rz-features/meta-rz-multi-os/meta-rzv2h/recipes-example/rpmsg-sample/files/main.c,在#include后添加我们的数据结构体: 由于这里我们使用了int32_t这种类型的变量,我们再引入一个头文件: #include <stdint.h> 待会儿我们在CM33的Freertos端定义一个完全相同的结构体我们就可以实现数据的收发了。 修改下面的“static int app (struct rpmsg_device *rdev, struct remoteproc *priv, unsigned long svcno)”函数,在LPRINTF("RPMSG service has created.");这行代码下,在最后一个error前插入以下代码: 完成修改后保存。进入命令行,进入目录rzv2h_ai_sdk_v500,激活编译工具: 编译rpmsg层: 编译成功后前往路径rzv2h_ai_sdk_v500/build/tmp/work/aarch64-poky-linux/rpmsg-sample/0.1-r0/image/usr/bin路径下提取生成的二进制文件,将它拷贝至U盘中。至此linux端的程序修改完毕。 3. 修改官方cm33端rpmsg例程 官方的rpmsg例程在cm33端也是作为Freertos的一个任务而存在的。所以之后我们在开发Freertos程序时可以将它当作一个“数据收发中心”,这极大地提高了我们编程地灵活性。 不同于信号量用来传递类似bool的状态,由于我们的rpmsg接收到数据后需要将数据发送至pwm_thread任务,所以我们这里增加一个队列queue用来传递我们接收到的数据。 依旧进入fsp配置界面,点击New Object,选择Queue,然后点击下方属性选项卡,进行设置。因为我们刚刚定义的结构体都是四个字节的数据,而我们待会儿也只会使用其中角度的四个字节数据,所以我们队列单独一个单元就设置为4字节,长度随意设置即可,如下图: 点击右上方绿色小箭头,生成代码。 回到资源管理器。rpmsg作为一个单独的任务,其实也存在入口函数和.c文件的,我们在src中寻找,实际上就是rpmsg_demo.c这个文件,现在对这个文件进行修改。 在文件的include中新增以下include,目的是把刚刚创建好的队列extern进来: 修改函数static int rpmsg_endpoint_cb0 (struct rpmsg_endpoint * cb_rp_ept, void * data, size_t len, uint32_t src, void * priv): 当我的任务接收到数据以后,将其中的角度信息拿出来,再将角度信息压入队列中,接下来pwm_thread再从队列中取得数据进行操作,修改pwm_thread文件: 当前代码实现的效果就是pwm_thread会持续等待队列中数据得到来然后被调度器踢醒进行工作。点击锤子进行编译,将编译得到的elf文件拷贝至U盘。 4. 启动程序查看效果 将U盘插上开发板开机,输入以下指令: 此时固件已经启动,接着在命令行敲入指令: 可以看到命令行输出以下信息: 输入1,点击回车,随后我们输入0-180°之间的角度可以发现舵机响应了我们的命令: 下面是实际工作视频: 以上就是这期博客的全部内容。后面可能会继续更新在docker环境中进行核间通信,以及怎么将核间通信代码封装为一个ROS节点。