APP下载

基于直接中断触发的OMAP-L138双核通信设计

2018-11-13葛科勇傅正财

现代电子技术 2018年21期
关键词:共享内存开发板双核

葛科勇,陈 坚,傅正财

(上海交通大学 电气工程系 电力传输与功率变换控制教育部重点实验室,上海 200030)

0 引 言

随着电子信息技术的飞速发展,嵌入式系统已经广泛应用于生产生活的方方面面[1]。同时,人们对嵌入式系统的性能要求也日趋提高。ARM和DSP是如今应用最广泛的两种嵌入式处理器,它们有着不同的工作特性,因而也被应用于不同的领域。DSP芯片由于其强大的数据处理能力和高运行速度,多被应用于对实时性要求较高的各类数据处理任务。与DSP相对,采用精简指令集计算机结构(Reduced Instruction Set Computer,RISC)的ARM芯片实时处理性能较弱,但因其交互性强、功耗低、价格低廉以及扩展功能丰富等特点,更加适用于控制类的电子产品[2]。为了充分利用这两种处理器的优点以完成复杂的工作,TI公司于2009年推出了OMAP-L138 DSP与ARM的双核嵌入式微处理器。该处理器的推出在极大地简化了电路设计复杂度的同时也对软件开发提出了更高的要求。嵌入式开发者在分别进行DSP与ARM应用程序开发的同时,也需考虑如何实现两个处理器之间的信号与数据交流。在大多数已发表的文献中,双核之间的通信设计是通过TI公司提供的SYSLINK或DSPLINK组件的进程间通信工具(Inter-Processor Communication,IPC)实现的[3-4]。该方法需在DSP处理器运行DSP/BIOS或SYS/BIOS实时操作系统,适用于逻辑复杂、进程庞大的双核通信任务。但这无形中也增加了软件开发难度,同时频繁地调用IPC函数也占用了一定的CPU资源,降低了通信效率。针对逻辑相对简单、数据交互量较大的双核通信任务,本文设计一种基于直接中断触发的双核通信方法。在该方法中ARM内核运行Linux操作系统,通过SYSLINK驱动中的slaveloader工具启动DSP内核并加载ARM与DSP端应用程序。双核间通信不再依赖IPC,DSP端可以裸机运行,双核之间可以通过中断直接触发的方式进行异步事件通知,极大地简化了程序设计的难度,提高了通信效率。

1 OMAP-L138处理器概述

OMAP-L138是TI公司推出的达芬奇架构嵌入式应用处理器,该处理器采用DSP与ARM结合的非对称多核结构,兼具DSP和精简指令集计算机(RISC)技术的特点[5]。图1为OMAP-L138的功能框图。

图1 OMAP-L138功能框图Fig.1 Function diagram of OMAP-L138

DSP子系统包含一块高性能的TMS320C674x DSP内核芯片以及相应的内部储存器(L1P,L1D和L2)。DSP子系统主要负责大批量的数据处理任务(如音频处理)。ARM子系统由一块32位RISC处理器ARM926EJ-S及相应内存空间组成,主要负责整个OMAP-L138系统的控制工作,如系统初始化、系统配置、电源管理、用户接口以及与上位机的通信工作。除了片上资源,OMAPL138还有大量外设和外部储存器供DSP与ARM子系统访问。

2 OMAP-L138双核通信构架

与一般的嵌入式处理器不同,OMAP-L138处理器为双核通信提供了特殊的硬件支持,这些硬件支持是所有双核通信设计的基础。首先,OMAP-L138的内存与外设采用统一编址,除了少部分内存仅DSP或ARM可以单独访问,其余内存及外设是两者共享的。同时,OMAP-L138虽然没有为双核通信提供指定的控制指令,但为此预留了用于双核相互控制的中断寄存器[6]。

2.1 中断资源

如图2所示,OMAP-L138在SYSCFG系统配置模块中的存储器映射寄存器(Memory Map Register,MMR)中分配5个CHIPINT中断位,用于DSP和ARM之间的信号交流。DSP可以通过其中的4位SYSCFG_CHIPIN[0~3]通知ARM,ARM也可以通过SYSCFG_CHIPIN[2~3]通知DSP。另外系统设置1位SYSCFG_CHIPIN[4]用来触发DSP不可屏蔽中断(None Masked Interrupt,NMI)。对中断寄存器的某一位置1操作将产生一个事件(event),该事件会被传递到相应的中断控制器(Interrupt Controller,INTC)。中断控制器将事件映射到相应CPU的中断输入,CPU接收到中断后可以进行相应的中断处理[7]。

2.2 共享内存

表1为OMAP-L138内存的访问权限设置。从表1中可以看出,OMAP-L138一共有3处存储空间是DSP与ARM内核共享的:256 KB的DSP L2 RAM,128 KB的内部共享内存以及256 MB的DDR外部共享空间[8]。这三种共享空间可以在不同场合下使用。256 KB的DSP L2 RAM可以用于ARM直接读写DSP RAM的双核通信方式[9],128 KB的内部共享空间可用于较小数据量的双核通信,当数据量较大时可以使用256 MB的DDR外部储存。

表1 OMAP-L138内存访问权限Table 1 Memory access permission of OMAP-L138

3 双核通信设计

如引言中所提到在已发表的文献中,OMAP-L138的双核通信都要依赖于SYSLINK或DSPLINK通信组件。这样的通信方式需要在DSP处理器上运行SYS/BIOS(或较早版本称为DSP/BIOS)操作系统。DSP运行操作系统在提高程序模块化和并行性的同时,也在一定程度上占用了DSP的CPU,影响了DSP的数据处理速度。另外,在事件通知和内存读取时,频繁调用IPC函数会降低通信效率,造成一些不必要的开销。因此本设计提出一种应用于DSP裸机运行情况下的双核通信方式。该方式适用于数据量较大、逻辑简单的ARM与DSP间的核间通信任务,即DSP与ARM将需要交互的数据写入共享内存,再通知对方读取。在该任务中,所要传递的消息是单义的,即“数据写入完成,可以读取”,因此消息的传递可以直接使用触发中断的方式。

3.1 软件开发环境

ARM核心处理器运行嵌入式Linux操作系统。由于ARM嵌入式处理器资源有限,无法完成庞大的Linux操作系统开发任务,所以嵌入式Linux的软件开发都是在一种交叉开发环境下完成的[10]。交叉开发环境由主机(host)和嵌入式开发板(target)构成。在软件开发过程中,引导程序(Bootloader)、开发板嵌入式Linux内核、文件系统以及应用程序都在主机上进行开发和编译,再烧写到开发板运行。

本文设计中所用的主机Linux系统为Ubuntu 12.04,嵌入式Linux内核为Linux 3.3.0,系统引导程序为UBoot(Universal Boot Loader),文件系统为根文件系统Rootfs(Root Filesystem)。内核文件、文件系统和U-Boot文件在使用交叉编译工具编译后生成对应的镜像文件。这些镜像文件可以通过Linux串口工具minicom烧写到开发板NAND FLASH中。

DSP软件开发工具为TI公司提供的集成开发环境CCS(Code Composer Studio)及 StarterWare DSP 软件开发包。StarterWare是TI公司提供的用于嵌入式裸机开发的免费软件开发包。该开发包提供了用于TI平台下DSP与ARM开发的库文件、封装函数以及运用例程[7]。通过调用这些函数,可以大大减轻开发难度。

3.2 开发板启动与程序加载

本设计采用U-Boot引导ARM嵌入式Linux系统启动,slaveloader引导DSP处理器启动的启动方式。该过程可以划分为U-Boot加载、内核引导、内核初始化和应用程序加载4个阶段,如图3所示。

第一阶段为RBL(ROM Boot Loader)加载 U-Boot。RBL为TI公司固化在芯片ROM中的引导程序。OMAPL138上电时首先运行RBL程序。当开发板设置为NAND FLASH启动时,开发板上电后RBL会自动运行位于NAND FLASH起始位置的UBL(User Boot Loader)程序。UBL从NAND FLASH中读取提前烧写的U-Boot镜像文件并将其拷贝至RAM中运行。

图3 OMAP-L138双核启动过程Fig.3 Dual-core start-up process of OMAP-L138

第二阶段为U-Boot引导Linux内核。U-Boot在完成部分初始化后开始解压Linux内核镜像,内核解压完成并校验通过后,U-Boot将引导Linux内核运行。

第三阶段为内核初始化系统。Linux系统开始运行后先进行一系列初始化工作,包括系统初始化、设备驱动初始化以及根文件系统初始化。

第四阶段为应用程序加载。系统初始化完成后,Linux系统启动DSP处理器并加载运行DSP和ARM的应用程序。

由于DSP裸机运行,DSP由ARM启动加载。DSP的启动使用SYSLINK中的slaveloader工具。slaveloader是TI公司提供的用来加载、启动和停止DSP处理器的DSP管理工具[3]。DSP的启动与应用程序的加载由Linux脚本程序完成,脚本内容如下:

3.3 ARM触发DSP中断

在双核通信设计中设置中断寄存器位SYSCFG_CHIPIN[2]与 SYSCFG_CHIPIN[3]为DSP 中 断专用,因此ARM端可以通过对SYSCFG_CHIPIN[2]或[3]相应位进行置1操作,实现对DSP中断的触发。由于ARM运行的Linux系统采用虚拟内存管理,寄存器的读写首先需要将SYSCFG_CHIPIN寄存器物理地址映射到Linux用户空间,然后再对用户空间内所对应虚拟地址进行置1操作。

DSP响应ARM触发的中断则通过调用StarterWare软件包中的DSP中断控制函数实现。可以通过调用表2中API函数实现DSP的中断控制。

表2 StarterWare DSP中断控制函数Table 2 DSP interrupt control functions in StarterWare

3.4 DSP触发ARM中断

与ARM触发DSP中断类似,DSP触发ARM中断可以直接对相应寄存器位置1。为了直接捕获DSP触发的中断,本设计编写了ARMLinux中断响应驱动程序。该驱动将对应的中断寄存器位注册为外部输入设备,通过对该设备的监听来获取中断信息。中断响应的原理如图4所示,当ARM中断被触发,即SYSCFG_CHIPIN[0]或[1]为1时,该驱动会向输入子系统报告。输入子系统随即通知相对应的事件管理器。事件管理器接收到通知后,将驱动提交的输入事件复制到相应的缓冲区。ARM程序可以通过输入设备的设备文件读取事件的值。通过判断读取的值即可确定中断源。

读取与判断的代码实现如下:

3.5 共享内存读写

当DSP或ARM捕获到中断后,就可以在中断服务函数中进行共享内存的读写。DSP读写内存使用直接指针转换的方式。DSP程序直接对所要操作的共享内存起始地址进行指针转换,再通过指针操作访问内存中的数据。ARM读写共享内存时,首先需要将共享内存映射到应用程序空间,然后才能通过指针访问内存中的数据。

4 OMAP-L138双核通信测试

利用广州创龙公司提供的OMAP-L138测试开发板TL138 Easy EVM设计前述介绍的基于直接中断触发的双核通信程序。为了测试直接中断触发通信方式的效率,分别使用IPC与直接中断触发的方式完成一个FFT计算任务,并对运行时间与CPU占用情况进行比较。

测试程序中ARM与DSP共同完成对给定时域数据的FFT计算。其中ARM负责与上位机进行通信,下载时域数据以及上传计算生成的频域数据。DSP通过调用StarterWare工具包中的API函数完成FFT计算。

对比程序的设计中除了双核通信部分,其他任务在两种方法中实现代码相同。表3为使用直接中断触发方式与使用IPC方式完成该任务的花费时间与占用CPU情况。由表3中数据可知,本文提出的直接中断触发双核通信方式用时更短,CPU占用率更低。

表3 直接中断与IPC通信方式运行结果比较Table 3 Comparison of running results of direct interrupt mode and IPC mode

5 结 论

本文通过直接中断触发的方式实现了OMAP-L138开发板ARM与DSP处理器间的双核通信,并通过测试程序完成了对通信方式的验证。测试结果显示,该方式可以满足双核通信的要求,且比IPC组件方式实现简单,CPU占用更少,通信效率更高。

猜你喜欢

共享内存开发板双核
全球金融“F20”在此召开!横沥进入“双核”时代
通过QT实现进程间的通信
基于Linux内核的文件服务器模型的研究与构建
基于PCI总线的多处理器协同机制研究
Microchip最新推出两款PIC32 Curiosity开发板
浅析单片机开发板的设计与制作
新型夹心双核配和物[Zn2(ABTC)(phen)2(H2O)6·2H2O]的合成及其荧光性能
Mouser为您呈上开发关键之STMicroelectronics Nucleo开发板
Arduino和Atmel发布Arduino Zero开发板
三螺旋N-N桥连的双核Co(Ⅲ)配合物的合成、结构和性质