APP下载

基于ARM平台AMP架构下从核重复加载设计与实现

2017-03-01李鑫志戈志华刘向明

计算机应用与软件 2017年1期
关键词:入口代码处理器

李鑫志 戈志华 刘向明

1(武汉工程大学机电工程学院 湖北 武汉 430073)2(深圳市深视智能科技有限公司 广东 深圳 518102)

基于ARM平台AMP架构下从核重复加载设计与实现

李鑫志1,2戈志华2刘向明1

1(武汉工程大学机电工程学院 湖北 武汉 430073)2(深圳市深视智能科技有限公司 广东 深圳 518102)

针对工业智能相机在不同工作场景的需求以及在二次开发方面的诸多不便,通过重点研究和分析基于多核ARM平台的AMP架构下主从核的启动机制,提出一种用户态从核重复加载方案,丰富了开发者解决实际工程问题的手段。以Zynq-7000为硬件平台,在双核Cortex-A9处理器上分别配置嵌入式Linux系统和Bare-Metal环境,实现了主核对从核的复位和重新唤醒控制和不同从核任务程序的自由切换,对工程应用有积极的参考价值。

ARM AMP架构 从核重复加载 嵌入式Linux系统 Bare-Metal环境

0 引 言

随着嵌入式技术应用领域的日益广泛和复杂,其对处理器性能、功耗等提出了更高的要求,越来越多的嵌入式应用采用多核处理器作为其硬件开发平台。多核并行计算技术[1]作为当前计算机系统提高处理能力、减小体积、降低功耗的主要方式,是未来嵌入式计算技术发展的主要方向。在多核并行计算环境中,主要有 SMP、AMP和BMP 三种架构[2-4]。对称多处理SMP(Symmetric Multi-Processing)架构所有的资源由多核操作系统负责,所有的资源都是共享的,可由操作系统统一管理,在编程的时候要考虑到并行编程的技术,不利于应用程序的移植。混合多处理BMP(Bound multiprocessing)架构,资源由操作系统统一管理,但是上层应用可以指定运行在某一个特定的核上。非对称多处理AMP(Asymmetric Multi-Processing)架构的特点是每个核都可以拥有自己专有的操作系统,通过共享内存和中断实现核间通信。其中有一个主核,其余为从核,核间有序启动且互不干扰。主从核之间的关系如图1所示。这样可根据不同系统的性能分配不同任务,具有更优秀的能量效率。

图1 主从核关系

Zynq-7000系列是Xilinx公司携手ARM公司,于2012年推出的全可编程片上系统AP SoC(All Programmable System on Chip)[5]可扩展的处理平台,采用微处理器加可编程逻辑(ARM+FPGA)的结构,并搭载双核Cortex-A9处理器。本文采用Zynq-7000系列可扩展的处理平台EPP(Extensible Processing Platform)[6]为硬件平台,在主核中搭建Linux操作系统(CPU0),从核(CPU1)设计为以Bare-Metal方式运行。CPU1的作用是高速计算,计算数据和结果通过共享内存与CPU0交流。CPU0的主要作用是提供人机交互界面,并控制CPU1的运行。

1 双核处理器的启动

1.1 主核(CPU0)启动

Zynq支持两种启动模式[7]:安全模式和非安全模式。在安全模式模式下,可以根据PS端配置不同选择从Quad-SPI Flash、Nand Flash、NOR Flash或SD卡启动;在非安全模式模式下,可以使用JTAG启动作为主要启动方式。CPU0的启动可以概要地描述为三个阶段,分别是:

阶段0:BootROM

阶段1:First Stage Boot Loader (FSBL)

阶段2:Second Stage Boot Loader (SSBL)

BootROM阶段控制着Zynq 7000芯片的整个初始化过程。BootROM中的代码主要对片上系统SoC(System on Chip)中的NOR, Quad-SPI, NAND, SD与基本外设控制器进行初始化,使得ARM核可以访问并使用这些外围设备,它还负责加载阶段1中的FSBL程序,将系统的控制权移交给FSBL继续执行。本文设计是从主频200 MHz 32 MB Quad-SPI Flash中启动。

第一阶段的初始启动引导程序FSBL(First Stage Boot Loader),是在BootROM之后启动引导过程,由Boot ROM将其加载到片上存储器OCM(On-Chip Memory)或直接在NOR Flash上运行。FSBL主要完成以下几项工作:1) 根据XPS中的配置,完成PS端的初始化;2) 使用比特流文件对PL进行配置;3) 加载CPU1程序;4) 加载阶段2段引导程序到内存中,并跳转到SSBL上进行执行程序。

第二阶段是SSBL阶段。对于运行在Zynq平台的Linux 系统而言,SSBL阶段就是U-Boot过程。它的作用是完成Linux内核启动之前所需的全部初始化工作,例如DDR控制器、NAND Flash控制器、SPI控制器等,并且支持从本地或网络中加载Linux内核、Device Tree文件以及根文件系统到内存中。

启动流程如图2所示。

图2 启动流程图

1.2 从核(CPU1)启动

在主核启动的FSBL阶段,会完成CPU1程序的加载。加载过程中拷贝cpu1_bootvec.bin文件到boot.bif文件中所指向([load = 0xFFFFFFF0]D:lxz ftpcpu1_bootvec.bin)的地址。cpu1_bootvec.bin文件中的内容是一段循环执行代码的入口地址(0xFFFFFF2C)。可以在XMD中通过命令①:

① XMD% connect arm hw -debugdevice cpunr 2

② XMD% mrd 0xffffff2c 0x10

③ XMD% rrd

连接到CPU1,通过命令②查看从0xFFFFFF2C位置开始的循环执行代码的内容,如下:

FFFFFF2C: F57FF04F

FFFFFF30: E320F002

FFFFFF34: E3E0000F

FFFFFF38: E590E000

FFFFFF3C: E37E00D4

FFFFFF40: 0AFFFFF9

FFFFFF44: EE070F15

FFFFFF48: EE070FD5

FFFFFF4C: EE080F17

FFFFFF50: E3A04000

FFFFFF54: EE014F18

FFFFFF58: E12FFF1E

循环执行的汇编代码在这里已经被编译成16个4字节的十六进制指令。当CPU1上电后会运行这段循环代码,代码的功能是自动检查地址0xFFFFFFF0处的值。也可以通过命令③查看此时PC的值为0x00000000。

2 从核重复加载

在AMP架构的情况下,Linux可以通过remotproc模块动态加载从核CPU1。这种方案需要先将remotproc模块安装到Linux内核,或者动态加载到内核,这样不利于开发者对CPU1的控制。而且remotproc模块本身也存在着诸多不稳定的因素。对比该方案,本文提出一种用户态从核加载方案。

该方案的原理是,当CPU0中Linux系统运行时,向系统级控制寄存器SLCR(System Level Control Registers)中的复位控制寄存器CPU_RCC(CPU Reset and Clock Control)发送命令复位CPU1,然后CPU0将CPU1要运行的新程序加载到DDR中相应位置,这一步在CPU0的代码中实现。然后重新唤醒CPU1。

由于CPU1在复位后会对CPU1复位时所有通用寄存器都将被清零,所以此时PC是指向0地址的。提前将CPU1的循环执行代码拷贝到0地址处,当CPU1重新运行起来后就开始执行循环代码,并检查地址0xFFFFFFF0的值是否为0,不为0即说明该处被写入了一个地址,此时CPU1就会跳转到被写入的地址处执行。基于这种CPU0唤醒CPU1的机制,可以实现在用户态下从核的加载。方案的具体步骤如下:

1) 在CPU1运行时,CPU0对其复位;

2) CPU0将CPU1要运行的新程序加载到DDR中;

3) CPU0重新启动CPU1。

重复以上三个步骤就可以完成在用户态从核重复加载的目的。方案的流程如图3所示。

图3 从核重复加载

从图3中不难看出,在CPU0与CPU1间完成几次简单的通信可以就实现从核重复加载,这使得开发者可以更加简便、灵活地解决实际工程中的相关问题。

3 实验过程及分析

实验的目的是通过主核(CPU0)控制从核(CPU1)完成重复加载,并先后执行Binarization.elf和RotatingCalipersal.elf两个图像处理的CPU1程序。Binarization.elf的功能是对图像进行二值化处理,RotatingCalipersal.elf的功能是利用旋转卡壳算法提取图像中的圆。

3.1 CPU1复位

首先,在CPU1运行时,CPU0是通过调用CPU1控制函数对其进行复位。控制函数实现如下:

#include

#define SYSTEM _REG_SIZE 0x1000

#define SYSTEM _REG_BASSADRESS 0xF8000000

#define SYSTEM _RELATIVE_OFFSET 0x00000244

/*CPU1控制函数实现*/

void Function_Ctrl_Cpu1 (unsigned int reg_value){

int rwmem_fd = -1;

unsigned int *gp_CPU_reset_vaddr = NULL;

rwmem_fd = open("/dev/rwmem", O_RDWR | O_SYNC);

gp_CPU_reset_vaddr = (unsigned int *)mmap(0, SYSTEM

_REG_SIZE,

//映射虚拟地址

PROT_READ|PROT_WRITE, MAP_SHARED,

rwmem_fd, SYSTEM _REG_BASSADRESS);

unsigned int base_addr = (unsigned nt)(gp_CPU_reset_vaddr);

(*(volatile unsigned int*)(base_addr+SYSTEM_RELATIVE

_OFFSET)) = reg_value;

}

参考Zynq-7000 All Programmable SoC Technical Reference Manual中系统级控制寄存器的CPU1复位控制寄存器,如表1所示。向寄存器A9_CPU_RST_CTRL(绝对地址:0xF8000244)写入值0x22。

表1 Register A9_CPU_RST_CTRL(部分)[7]

于是调用CPU1控制函数如下:

Function_Ctrl_Cpu1 (0x22);

//关闭CPU1时钟,复位CPU1

3.2 加载bin文件

方案是先将elf文件转编译成一个bin文件然后再加载到DDR中。在bin文件中没有任何段表信息,只需在编译bin文件时配置文件入口地址。这样就将原本只能在内核中完成的从核加载转化成bin可执行文件的用户态从核加载。

通过编译工具链中的objcopy工具将Binarization.elf文件和RotatingCalipersal.elf文件编译成bin文件,执行如下命令:

④ [root@localhost]#arm-none-linux-gnueabi-objcopy -O

binary Binarization.elf Binarization .bin

⑤ [root@localhost]#arm-none-linux-gnueabi-objcopy-O

binary RotatingCalipersal.elf RotatingCalipersal.bin

在Xilinx SDK[8]里面通过修改lscript.ld中text段的内存区域属性修改程序入口地址,此处配置Binarization.bin文件的入口地址为0x10200000。

3.3 重新启动CPU1

加载Binarization.bin文件成功后,通过两次调用上述CPU1控制函数,分别将CPU1的时钟开启以及重新唤醒CPU1:

Function_Ctrl_Cpu1 (0x20);

//时钟恢复

Function_Ctrl_Cpu1 (0x0);

//重新唤醒CPU1

在CPU1复位后,所有通用寄存器都被清零,PC指向0地址。将CPU1的循环执行代码提前拷贝到0地址处, CPU1复位后就开始执行这段代码,循环检查地址0xFFFFFFF0处的值。经过上述第二步操作,此时地址0xFFFFFFF0处值已经是0x10200000,即Binarization.bin文件的入口地址。于是CPU1跳转到Binarization.bin文件入口地址开始运行该可执行文件。同理,重复步骤1)-步骤3),并将可执行文件RotatingCalipersal.bin的入口地址写到地址0xFFFFFFF0。如此便实现了在用户态下对从核的重复加载。实验结果如图4所示。其中图4(a)为处理前图像,图4(b)为二值化处理后图像,图4(c)为原提取图像。

图4 实验结果

4 结 语

本文在Zynq-7000为平台上,详细分析了CPU0和CPU1的启动过程,并利用这种启动机制,提出了一种在用户态下从核重复加载方案。方案的特点是开发者可以灵活地在用户态下复位和唤醒CPU1。将CPU1的任务程序以bin文件的形式提前加载到DDR中,当需要切换时只需加载相应bin文件的入口地址到指定地址即可。通过实验证明此方案是行之有效且稳定可靠的。

[1] 张林波, 迟学斌, 莫则尧, 等. 并行计算导论[M]. 北京:清华大学出版社, 2006.

[2] Freescale Semiconductor Inc. Running AMP, SMP or BMP Mode for Multicore Embedded Systems[M].USA: Freescale Semiconductor Inc, 2014.

[3] 蒋建军, 刘彤. 一种AMP架构下的处理器负载均衡改进方法[J]. 山东农业大学学报(自然科学版), 2015 ,46(1):96-100.

[4] 肖学甲. 基于AMP架构的多核间任务同步与通信的设计与实现[D]. 西安:西安电子科技大学, 2011.

[5] 何宾. Xilinx All Programmable Zynq-7000 SoC设计指南[M]. 北京:清华大学出版社, 2013.

[6] Xilinx Inc. Zynq-7000 Extensible Processing Platform Summary[OL]. http://www.xilinx.com/support.html.

[7] Xilinx Inc. Zynq-7000 All Programmable SoC Technical Reference Manual[OL]. https://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf.

[8] Xilinx Inc. Xilinx Design Tools: Installation and Licensing Guide[OL]. http://www.xilinx.com/support.html.

DESIGN AND IMPLEMENTATION OF SALVE PROCESSOR RELOAD UNDER AMP ARCHITECTURE BASED ON ARM PLATFORM

Li Xinzhi1,2Ge Zhihua2Liu Xiangming1

1(SchoolofMechanicalandElectricalEngineering,WuhanInstituteofTechnology,Wuhan430073,Hubei,China)2(ShenzhenSincevisionTechnologyCo.,Ltd.,Shenzhen518102,Guangdong,China)

Aiming at the need of industrial smart cameras under different working scenes and the inconvenience during secondary development, a user-mode scheme of slave processor reload is proposed through studying and analyzing the booting mechanism of host-slave processor under AMP architecture based on multi-core ARM platform, enriching the approaches for developers to solve practical engineering problems. Choosing Zynq-7000 as hardware platform, then the embedded Linux system and Bare-Metal environment are deployed separately on the part of dual-core processor Cortex-A9. The host processor is able to control the slave processor to reset and re-wakeup, and switch different bare-metal program freely, which has high reference value in engineering applications.

ARM AMP architecture Slave processor reload Embedded Linux system Bare-Metal environment

2015-12-03。李鑫志,硕士生,主研领域:机器视觉在工程中的应用。戈志华,硕士。刘向明,教授。

TP3

A

10.3969/j.issn.1000-386x.2017.01.040

猜你喜欢

入口代码处理器
高速公路入口疏堵解决方案及应用
基于新一代称重设备的入口治超劝返系统分析
秘密入口
创世代码
创世代码
创世代码
创世代码
第九道 灵化阁入口保卫战
ADI推出新一代SigmaDSP处理器
火线热讯