五、建立M4 rtos和A7 linux之间的通信

介绍

上一小节已经成功运行了QT程序和M4 rtos程序,本小节旨在建立两个应用程序之间的通讯渠道。linux的程序我们可以通过正点原子板载的usb_ttl直接插上USB线来打印调试信息,但是M4内核程序还没有调试手段,所以我们先解决M4内核程序的调试问题。板载的usb_ttl接的是stm32mp157 的UART4,观察开发板给我们预留的排针接口里面只有一组UART7接口,这个是外接WIFI BT外设的,因为我们暂时还没有使用到这些,先把这组接口给M4当调试接口使用。
五、建立M4 rtos和A7 linux之间的通信_第1张图片

配置M4 UART打印调试信息

UART7对应的pin脚是PF6 PF7,所以第一步需要配置这两个gpio给M4使用且功能复用为UART:
五、建立M4 rtos和A7 linux之间的通信_第2张图片
然后在Connectivity-》UART7下配置使能UART7,
五、建立M4 rtos和A7 linux之间的通信_第3张图片
同时在System core-》GPIO-》UART下面配置uart7的两个gpio为上拉模式
五、建立M4 rtos和A7 linux之间的通信_第4张图片
配置完成,ctl+s初始化生成代码以后想要使用printf还需要修改底层接口函数,映射到我们的UART7上才行,所以在mian函数中添加如下代码:
五、建立M4 rtos和A7 linux之间的通信_第5张图片
这样以后就可以在M4的程序代码中使用printf来调试程序啦,在上一小节的M4 RTOS点灯测试程序中添加printf来打印LED的信息:
五、建立M4 rtos和A7 linux之间的通信_第6张图片
然后外接一个340的串口线接到开发板底板的PF6 PF7引脚,把stm32cubeide编译生成的新的m4test_CM4.elf发送到根文件系统中,使用QT程序来控制 M4RTOS程序固件的运行,发现在串口工具上能够看到我们添加的调试信息。
五、建立M4 rtos和A7 linux之间的通信_第7张图片
com7为linux使用串口,打印linux的内核信息,com8为m4使用串口,打印m4程序调试信息。

添加OPENAMP组件建立M4和A7的通讯接口

stm32mp157的跨核通信在linux侧是基于 RPMsg 服务面向 Linux 用户空
间提供“/dev/ttyRPMSG”串口节点收发数据,在M4侧则是基于 OpenAMP 库调用虚拟串口函数“virtual_hal_uart()”收发数据。应用角度来看类似于串口透传,硬件角度来看,信号通知(Mailbox)服务基于内部 IPCC(Inter-Processor communicationcontroller),数据传输基于共享内存。
五、建立M4 rtos和A7 linux之间的通信_第8张图片
所以本小节先来实现通信的基础透传功能,在上小节的QT程序中添加一个pushbutton来让M4输出调试信息。
首先配置M4使能OPENAMP功能接口,同时给A7 和M4,使能中断
五、建立M4 rtos和A7 linux之间的通信_第9张图片
在Middleware下面配置OPENAMP给M4核心

五、建立M4 rtos和A7 linux之间的通信_第10张图片
配置完成以后就可以在我们的rtos中起一个task用于接收A7侧发过来的数据了,关键代码如下:
五、建立M4 rtos和A7 linux之间的通信_第11张图片
这段代码有2个注意点:
1.while(1) 里面要一直调用OPENAMP_check_for_message 去检查是否有消息更新,这样才能最终调用到我们注册的callback函数。
2.就这几段代码调试时发现接收到一次A7发的数据以后系统就hung住了,任务调度也无法进行,后面排查测试发现是task的堆栈大小超了,默认按照最小128配置的,修改到512以后就能正常工作了。这里提醒大家开始一定要把任务的大小设置的大一些,后续在根据堆栈使用率来微调这个大小,不要一开始就设置的很小,很容易再添加功能的时候出现异常。

至此M4 freertos程序和A7之间的通讯完成。

你可能感兴趣的:(STM32MP157学习笔记,linux,单片机,运维)