异构处理器多操作系统协同技术研究①
2019-01-07冯瑞青赵俊才
冯瑞青,张 激,赵俊才
(华东计算技术研究所,上海 201808)
随着集成电路技术的快速发展,嵌入式处理器早已从单核过渡到多核时代[1].在移动通信、雷达信号处理、航天、工控、机器人等领域,不仅需要高性能、低功耗的处理器,而且要求单个芯片能够处理各种场景的应用,如系统控制、信号处理、通信技术、图形、图像显示等.同构多核处理器功能单一,如Cortex-A9[2],无法应对复杂多样的场景,异构多核处理器(Heterogeneous Multi-core Processor,HMP)应运而生.典型的异构多核处理器有IBM公司的Cell Broad-Band Engine[3]、ARM 公司的 big.LITTLE[4]、TI公司的SitaraTMAM57x系列[5]、华为公司的麒麟970等.
国内外针对某种特定构架(如ARM、MIPS、X86)的嵌入式操作系统比较多,典型的有RT-Thread、ReWorks、DeltaOs、VxWorks、QNX、RT-Linux、SYS/BIOS等.目前,异构多处理器大多采用单一的嵌入式操作系统.为充分发挥异构处理器的性能,需要在不同的核上运行不同的操作系统,因此多操作系统的通信协同技术非常关键.目前,对异构多核处理器的操作系统、片上通信技术等方面的研究还并不是十分成熟.由于异构多核处理器的特殊性,实现不同核上任务调度以及不同核之间的实时通信和调度,利用不同类型处理器的各自性能特点,才能充分发挥异构多核处理器的性能优势[6].
本文对异构多核处理器的发展以及异构多核的核间通信机制进行研究;着重研究分析了“ARM+DSP”片上基于共享总线的Mailbox异构多核间通信机制;以TI公司的SitaraTMAM571为例设计实现了ARM核上Linux与DSP核上ReWorks之间的多核通信组件、DSP核的动态加载程序、协同计算等功能.
1 相关工作
1.1 ARM+DSP异构多核处理器
“RISC+DSP”架构作为一种典型的异构多核架构在嵌入式领域应用非常广泛.“RISC+DSP”架构将通用处理器与专用处理器融合,集合了通用处理器的通用性好、任务管理能力强和专用处理器的计算能力强的优点,在功耗有限的前提下极大提升了系统性能[7,8].其中,“ARM+DSP”架构是最常见的"RISC+DSP"架构之一,见图1.
本文以TI公司的AM5718为实例完成了具体的设计与实现.TI公司在2015年推出的是一款为工业自动化应用包括人机交互(HMI),工业通信、自动化和控制,机器视觉以及其它通用应用设计的28 nm集成工艺的高性能处理器.ARM+DSP异构多核处理器构融合了可编程的视频处理功能与高度集成的外设,旨在提供集高集成度、可拓展性和外设与一体的芯片[9],见图2.
图1 ARM+DSP 异构多核处理器结构图
图2 AM5718 框图
1.2 嵌入式操作系统
目前异构多核处理器大多只有主核运行操作系统,其它核作为协处理器.这种架构的特点是主核功能较为复杂,负责全局任务、资源的管理和调度,从核功能单一接受主核的管理,负责执行由主核分配的任务.这种操作系统结构简单便于设计实现.如ARM+DSP异构处理器在ARM核上运行Linux,由ARM核通过指令或共享存储设备实现协处理器的运算.ARM负责事件管理和I/O接口等功能,DSP负责计算加速.这种多核协同加速处理的模式在大部分情况下可以同时满足通用性和计算能力的要求[10].上述模式存在DSP核无法直接连接外设、DSP计算程序固定且修改程序的工作量大等缺陷.如何避免ARM核的多余过程并且实现动态加载DSP程序成为关键问题.在主核的操作系统上对从核进行程序动态加载,并在从核上部署操作系统,通过核间通信组件可以简化上述模式流程,更好发挥从核的协同处理能力,灵活应对复杂应用场景.
本文在AM5718的ARM上运行TI官方提供的嵌入式Linux内核,在DSP核上运行锐华操作系统.嵌入式Linux操作系统是一款成熟稳定的开源操作系统,适用于不同的 CPU,支持如 X86,ARM,MIPS 等多种体系架构,具有内核小、稳定性高、资源丰富、可裁剪性强和结构灵活等特点.
在AM5718的DSP核上运行“锐华”ReWorks操作系统.“锐华”操作系统是中国电子科技集团公司第三十二研究所(华东计算技术研究所)自主研制的嵌入式实时操作系统,提供了面向主流DSP芯片的高性能国产基础软件解决方案.操作系统内核采用了“十二五”核高基成果--“锐华”ReWorks嵌入式实时操作系统.ReWorks内核可抢占,中断可嵌套,具备高效的中断管理机制和任务调度、上下文切换算法,具有强实时性;采用微内核的体系架构和面向对象的设计方法,具有良好的可裁剪性;支持C/C++编程语言,提供POSIX接口,具有较强的可移植性;提供故障检测、隔离和恢复框架,具有高可靠性;提供核心扩展接口,具备良好的系统可维护性;此外作为自主可控操作系统具有可持续性等特点[11].
锐华DSP操作系统软件组成,如图3所示,主要包括三部分:底层CSP(芯片级支持包)/BSP(板级支持包)、操作系统核心和扩展功能组件.
图3 “锐华”DSP 操作系统软件组成
“锐华”DSP实时操作系统在系统裁剪、实时性、易用性、性能、标准化方面具备一定的优势,与TI的DSP操作系统SYS/BIOS相比,ReWorks内核除了支持任务管理、信号量、消息队列的功能外还拥有条件变量、任务读写锁等SYS/BIOS不支持的功能点.经对比测试,“锐华”在相同的测试平台上多项功能、实时性优于SYS/BIOS,满足嵌入式实时操作系统的各项性能指标要求.在下一章中,本文将设计一系列核间通信组实现上述两种嵌入式操作系统在不同核上的部署以及核间的协同处理.
2 方案设计与实现
2.1 总体方案
首先在ARM、DSP核上分别完成Linux和ReWorks的适配移植工作.设计一种核间通信组件基于MailboxMessage(邮箱消息)机制实现片上处理器之间通信.其中,Mailbox中包含ARM和DSP的共享数据寄存器组以及各自的控制/状态寄存器.ARM和DSP通过访问共享寄存器和共享内存来完成数据交互,通过访问控制/状态寄存器来完成状态同步.多核通信组件使用队列邮箱中断机制允许两个不同的处理器之间通过一系列的寄存器和关联中断信号发送和接收消息来建立通信通道,总体框架见图4.
AM5718执行两种邮箱类型:一种是IVA邮箱,数量为1个,用于图像加速子系统与其它核之间的通信;另一种是系统级邮箱,共有13种,用来实现ARM与DSP、IPU等子系统之间的通信.每个邮箱模块支持如下特性:可配置参数,包括:用户数,邮箱消息、队列数,每个消息队列 (FIFO,先进先出)的消息数;32-bit的消息宽度;使用中断完成消息接收通知和队列未满的通知;支持 16/32-bit寻址空间[12].
总体的设计思路:ARM核作为主核先启动并且运行Linux操作系统,设计ImageLoader动态加载工具,在Linux运行ImageLoader将ReWorks镜像文件动态加载到DSP核上.DSP上ReWorks操作系统等待任务消息;Linux将任务数据写入共享内存,并发送任务消息给 ReWorks.收到消息后,ReWorks 从共享内存读取任务数据,并执行相应的操作,发送MailboxMessage通知ARM任务完成.接下来的章节将详细介绍具体实现方法.
2.2 Linux侧组件设计
TI公司将AM5718的ARM核设计为主核,上电后ARM核最先启动,首先对ARM核上Linux侧的MailboxDriver模块和ImageLoader动态加载工具进行设计.
设计Linux系统下MailboxDriver模块,MailboxDriver模块包括:DSP子时钟系统初始化模块、DSP子系统启动模块、邮箱设备初始化模块、MPU/DSP消息管理模块、邮箱中断模块、邮箱管理模块、共享内存管理模块等子模块.MailboxDriver模块初始化主要流程为:注册邮箱字符设备创建dsp_mailbox,配置MPU和DSP寄存器,分别为 ARM和DSP创建一个共享内存区域查找表,初始化DSP子系统时钟、唤醒DSP,初始化邮箱中断,模块初始化完成.
在MailboxDriver模块加载完成后,通过创建的dsp_mailbox设备可将ReWorks镜像文件动态加载到DSP核,设计ImageLoader动态加载工具将ReWorks镜像加载到DSP核.
ImageLoader动态加载工具的关键技术在于elf(coff)格式文件分析与加载;根据elf文件格式解析镜像文件信息,获取代码段、数据段等段的数据内容与相应地址、段长度等信息,将数据写到相应的内存地址.程序计数器获取入口地址,程序从入口开始执行.
创建dsp_mailbox设备句柄,将镜像入口地址传入dsp_mailbox设备并赋值给mailbox.ImageLoader的主要流程为先执行elf_load函数,得到入口地址entry;再执行start_dsp函数,镜像文件加载完成.ImageLoader工具允许用户自定义镜像文件和目标核,此设计同样适用于其他异构多核平台.
Linux启动后先安装侧完成MailboxDriver模块安装,创建mailbox字符设备并创建设备号等,运行ImageLoader工具加载镜像创建一个计算任务并将任务数据写入共享内存特定地址,检查DSP邮箱状态;当DSP邮箱可用时,向DSP发送消息;收到DSP发送来的消息后,读取信息并从共享内存的指定地址读取结果,完成计算任务并释放邮箱,Linux侧流程图见图5.
2.3 ReWorks侧组件设计
设计在 DSP ReWorks添加邮箱中断模块,ReWorks嵌入式实时操作系统从c_int00开始执行,逐步完成操作系统运行环境初始化(例如处理器寄存器初始化、堆栈初始化等).然后跳转到ReWorks内核的入口函数main中完成操作系统启动.设计在ReWorks启动过程的中断模块初始化(int_module_init)增加Mailbox中断模块,具体流程见图6.
图6 ReWorks邮箱中断模块初始化流程图
DSP核ReWorks启动后创建idle任务挂起.ReWorks收到消息后从共享内存特定地址读取数据并处理,将计算结果写入共享内存特定地址;检测ARM邮箱状态,ARM邮箱可用时,向ARM发送消息;使能中断,释放邮箱并退出中断,继续挂起.DSP 侧流程图见图7.
图7 ReWorks 侧流程图
2.4 Linux与ReWorks数据交互
Linux创建计算任务后需要将本地的任务数据写入共享内存地址.由于共享内存区域在异构多核处理器的不同核上会映射到不同的地址空间,即同一块共享内存区域在不同处理器的本地地址空间的逻辑位置不同,因此当ARM Linux创建计算任务后通过将查找共享内存地址表将本地内存地址映射到共享内存地址,根据本地指针及区域ID获取当前共享区域指针,将任务数据写入共享内存后,通过消息将共享内存地址发送给 DSP.ReWorks DSP 收到任务消息时,邮箱中断触发,进入中断程序后读取消息中的共享内存地址.ReWorks从共享内存读取任务数据需要先完成相应的地址转换,获取本地地址后从共享内存中读取任务数据并完成相应的计算;将结果写入转换后的共享内存地址,以消息形式发送给ARM核,ARM核得到计算结果后继续向下执行,至此一次数据交互完成,交互流程见图8.
图8 Linux 与 ReWorks交互流程图
3 测试与分析
在完成设计之后,我们在AM5718上进行了测试,ARM和DSP核分别使用RT-Linux和ReWorks-2.1实时DSP操作系统,依次进行下列操作:
(1)MailboxDriver模块安装,测试结果显示邮箱配置成功,DSP子系统初始化完成.
(2)创建设备号,使用 ImageLoader工具加载镜像,DSP程序的入口地址读取正确,将各个段写入相应地址成功.
(3)核间通信测试,由ARM向DSP发送消息,DSP收到消息后从共享内存读取运算数据,完成后向ARM发送消息.
(4)ReWorks 任务切换测试,在 ReWorks 创建两个任务进行任务切换.经测试,ReWorks任务切换符合实时性要求.
(5)协同计算:ReWorks接受 Linux 上发来的任务消息,成功调用FFT函数完成,并将结果以消息形式返回给Linux.
ImageLoader对ELF镜像程序进行分析,解析符号表并分配相应的内存空间后写入镜像.测试加载一个2 MB的镜像文件,使用ImageLoader的整个加载过程实际耗时6.8 s.而使用常用的J-TAG加载相同的镜像耗时 8.7 s.因此,ImageLoader在加载效率上具有优势.ImageLoader直接在 ARM 上运行,对 DSP进行动态加载不需要断电重启,相比J-TAG等工具加载的复位等过程加载完成后,在ReWorks操作系统可以实现DSP 核上的任务切换,任务切换时间为 0.25 us,符合实时性要求.继续使用ImageLoader向指定地址继续动态加载应用程序,这种逐层加载的方式具有灵活且简易的优势.
4 总结与展望
本文主要论述了国产DSP嵌入式实时操作系统ReWorks面向异构多核平台的核间通信研究和设计,基于RISC+DSP共享总线的邮箱机制,着重对ARM Linux与 DSP ReWorks核间通信进行了研究分析,设计并实现了Mailbox邮箱驱动模块、DSP镜像动态加载程序和ReWorks邮箱中断模块一系列核间通信组件.通过硬件开发板和软件程序对本文的设计进行了验证和测试分析.
本设计能够实现Linux端对DSP程序的动态加载并可以实现与ReWorks的核间通信,增强了DSP的协同处理能力,降低了DSP应用程序的开发难度,提高了开发效率.多核处理器的负载均衡等问题仍然是协同处理技术的难点,我们会在后续的研究工作中在ReWorks操作系统上继续改进或提出新的方案.