发明内容
针对现有技术存在的上述不足之处,本发明提供了一种适用于嵌入式ARM+DSP双核架构数控系统平台的通信方法,该方法采用直接访问共享存储器的方式实现,能充分发挥ARM和DSP双核各自的优势,从而解决了现有双核通信中数据传输延迟过高问题,提高ARM与DSP数据通信效率及双核数控系统整体性能。
本发明为实现上述目的所采用的技术方案是:一种用于嵌入式数控系统的双核数据通信方法,包括以下步骤:
将嵌入式数控系统的内存划分为用于ARM端LINUX操作系统、用于DSP端BIOS伪操作系统、通信共享以及通信软件四个部分,其中通信共享部分用于通信数据的存储;
ARM端和DSP端初始化,创建使ARM端和DSP端不能同时进行通信数据读写的互斥锁管理对象,建立握手协议;
当ARM端或DSP端使用互斥锁加锁访问共享存储区,获得互斥锁后,直接对通信数据进行读写,完成读写后释放互斥锁。
所述ARM端初始化为对硬件电源、时钟、复位、内存管理单元、中断处理控制进行初始化,内核空间基于通信共享的物理内存创建内存池,用户空间使用内存池分配共享数据、运用中断实现握手协议。
所述DSP端初始化包括获取共享存储区地址、初始化中断、设置CPU频率以及设置时钟,通过调用DSP端BIOS伪操作系统的应用程序接口实现。
所述建立握手协议为:启动DSP执行后,ARM端等待DSP端应用程序初始化完成的通知消息,当ARM端接收到该通知消息后,ARM端发送共享存储区的DSP地址到DSP端,完成握手协议的建立。
本发明具有以下优点:不使用额外的硬件芯片,降低硬件成本;第三方软件不需要改动就可以移植,降低了软件移植成本;采用共享存储区和核间消息实现数据传输,实现大块数据零拷贝,提高多核之间数据通信效率。应用于数控系统上,ARM核作为主要的控制器,将复杂的算法计算放到DSP核上完成,高效完成ARM与DSP核间大块数据的实时通信。
具体实施方式
下面结合附图及实施例对本发明做进一步的详细说明。
图1为本发明应用的嵌入式数控系统架构平台,包括电机、伺服、控制器以及人机接口单元。如图2所示,为本发明一个实施例的硬件结构图,包括一个ARM核和一个DSP核,一个芯片外的DDR用于发明中的通信数据共享。其中,ARM作为数控系统的主控制器,DSP作为运算器,ARM处理器将底层板卡传入的数据写到共享存储区中,DSP从中获得数据进行运算并将运算结果写入到共享存储区供ARM处理器传回底层板卡以及界面显示;本发明的实施例基于OMAP3530处理器,其他实施例可扩展到其他处理器。本发明的实施例对通信共享的DDR划分细节如图3,1M空间用于ARM核和DSP核的数据通信。
本发明提供了一种用于数控系统的ARM与DSP双核间数据通信方法,该方法的核心思想为:通过本发明中实现的ARM核与DSP核通信管理接口,创建双核之间的共享存储区,建立握手协议,实现地址空间的转换,数据互斥读写。其中,实现的ARM与DSP通信管理接口主要包括以下模块:
1.管理模块,用于初始化ARM与DSP软硬件,加载DSP端可执行文件,分配共享数据,控制信息管理以及数据访问控制;
2.数据读写模块,用于数据的读出和写回、打开需要分配数据或消息的数据池;
管理模块具体包括如下子模块:
1.初始化子模块,对基本的组件以及硬件环境进行初始化;
2.DSP端可执行文件管理模块,负责加载DSP端可执行文件到DSP核,为通信的ARM端关联指定的DSP核,DSP端MMU的关闭与开启、程序的启动与停止;
3.共享数据分配管理模块,用于从共享存储区分配和回收存储空间以及物理地址映射与核间地址转换;
4.通知注册模块,用于以消息方式建立双核间握手协议;
5.数据访问控制模块,用于信号量的创建、清除、打开与关闭,共享存储区的互斥访问控制;
如图4,该多核通信方法具体包括以下执行步骤:
ARM端
1.初始化软硬件通信环境。
初始化分为内核空间和用户空间,其中硬件初始化有Linux内核程序实现,具体的硬件初始化工作包括电源、复位和时钟初始化,IPC(Inter ProcessorCommunication)初始化,内存管理初始化。其中图5为OMAP3530电源、复位和时钟管理硬件原理结构,PRCM(Power,Reset,Clock Management)模块接受来自外部复位、时钟、和电源信号,通过CM(Clock Management)和PRM寄存器组进行控制。图6为OMAP3530基于硬件的IPC管理机制,ARM和DSP处理器通过邮箱进行通信,当一方将发送的消息到达另一方邮箱时,硬件触发一个中断,该中断产生一个通知消息通知该处理器。图7为OMAP3530的MMU(MemoryManagement)硬件结构图,OMAP3530系列的设备具有Camera、IVA2.2、MPU三个独立的MMU,使用寄存器来区分。本实施例使用其中的IVA2.2 MMU,对应寄存器起始地址为0x5D000000。为管理上面组件,本实施例使用的硬件寄存器组包括VA2_CM、CORE_CM、PER_CM、IVA2_PRM、MLB以及MMU2。
ARM端采用Linux操作系统,硬件初始化的编写采用Linux内核模块并基于Linux字符设备驱动模型。包括模块初始化函数init_module和模块退出函数exit_module。
内核模块初始化流程图如图8所示,通信软件的内核驱动部分在这一流程中注册。图中加标注的若干步骤具体实施方法如下:
[1]创建并初始化内核互斥锁,用于互斥访问内核中一些全局变量;
[2]用全局变量标识中断服务组件已经经过初始化;
[3]初始化用于获取数据的结构链表;
[4]调用内核函数register_chrdev注册字符设备驱动;
通信软件的字符设备驱动基于Linux字符设备驱动模型,但仅实现了read、mmap和ioctl接口。read用于读取设备文件,mmap将内存区域重映射。ioctl根据不同的命令执行不同的操作,也是用户空间和内核交互的主要方式。用户空间使用open打开通过mknod建立的设备文件,通过对应的函数与内核空间进行交互。
模块退出函数exit_module清除资源并调用unregister_chrdev内核函数实现驱动卸载。
本发明对应的通信软件具体初始化流程如图9所示,包括用户输入数据解析、建立并初始化用于双核通信的数据结构、建立共享内存池、为通信的ARM处理器关联指定的DSP核以及打开用于分配内存的内存池。本发明同样适合具有多个DSP处理器的情况,通过用户输入各个DSP的配置信息以建立软件支撑的数据结构;同时,本发明在初始化中为通信控制信息以及通信数据的内存分配建立一个内存池。
2.资源管理与分配。
资源分配管理流程如图10,需要说明的部分如下:
[1]打开内存池,所述内存池为初始化过程中建立的;
[2]分配内存,从打开的内存池中分配;
[3]地址转化,将ARM和DSP的地址空间进行相互转化;
ARM到DSP地址空间转化关键代码:
#define ADDR_ARM_TO_DSP(armBaseAddr,dspBaseAddr,addr,dspMaduSize)\
((((Uint32)(addr)-(armBaseAddr))/(dspMaduSize))+(dspBaseAddr))
DSP到ARM地址空间转化关键代码:
#define ADDR_DSP_TO_ARM(armBaseAddr,dspBaseAddr,addr,dspMaduSize)\
((((Uint32)(addr)-(dspBaseAddr))*(dspMaduSize))+(armBaseAddr))
[4]如果有必要,初始化临界管理区对象,用户空间中采用Linux的semop、semget等系统调用完成。
3.DSP可执行文件加载和启动。
DSP可执行文件使用arm-none-linux-guneabi-gcc交叉器编译器编译,arm-none-linux-gnueabi-ld链接器链接生成。ARM端将其加载到指定的空间中并启动执行。
4.握手协议建立。
如图11,启动DSP执行后,ARM端等待DSP通知消息,当ARM接收到DSP端通知消息后,表示DSP应用程序初始化完成;ARM端发送通信共享的DSP地址到DSP端,完成握手协议的建立。
5.数据传输。
如图12所示,当处理器使用互斥锁访问通信共享,获得互斥锁后,可直接对数据进行读写,完成读写后释放锁。
6.释放资源。
数据传输结束后,释放获得的所有资源,包括内存、用于管理的各种数据结构。
DSP端
DSP端编程基于DSP BIOS,执行流程如图5右半部分。除了初始化部分,各个处理步骤原理和ARM端相同,初始化部分流程如图13,包括获取共享存储区地址、初始化中断、设置CPU频率以及设置时钟,都调用DSP BIOS的API接口实现。