文献标识码:A
文章编号: 0258-7998(2013)05-0025-04
目前,嵌入式系统中的双核处理器系统在功耗、散热、控制计算能力等方面具有单核系统无法比拟的优势,所以在嵌入式发展趋势中占据了主导地位。考虑到ARM处理器流水结构和DSP处理器强大的数据处理能力,采用ARM+DSP结合的非对称双核架构[1],既能够保持算法的灵活性,又能提供强大的处理能力。本文所介绍的BootLoader正是基于ARM+DSP两个处理器。ARM负责外围接口、外围存储设备及子处理器(DSP)的配置和控制,DSP则负责算法加速。这样DSP的算法代码作为ARM端OS文件系统的一个文件存在,通过应用程序进行DSP程序的下载和DSP芯片的控制[2]。
目前关于嵌入式处理器BootLoader实现的文献很多,但大多都仅限于对单核处理器的某个方面进行介绍和研究,如介绍怎样进行重映射[3]、进行存储器的初始化[4]等,因此本文在这些方面只做简单介绍,而详细介绍非对称双核架构系统自启动过程中的关键部分并对具体环境中的不同技术方案进行对比分析。
在嵌入式系统中,BootLoader指系统上电或复位之后在操作系统内核运行之前要执行的代码,其功能是对以处理器内核为主的系统硬件和软件运行环境进行必要的初始化,初始化完成后跳转到用户程序。本文基于C6A8168的ARM+DSP双核系统研究并实现了BootLoader,其上电启动时系统默认为:ARM核被使能,DSP核被禁止,所以只有通过程序先启动ARM核,然后通过其应用代码再使能DSP电源域把DSP设置为复位状态,对DSP核进行最小的初始化以使其可以被唤醒,系统开始ARM核初始化。ARM核启动完成后再解除DSP复位状态使DSP启动并进入启动路径开始向量初始化。BootLoader的详细过程如图1所示。
1 启动模式配置
C6A8168开机上电或复位时,BOOT管脚上配置的启动模式被锁定到系统配置模块中的BOOTCFG寄存器,从而可以确定处理器的启动方式。启动配置引脚的不同还将决定存储设备片选总线、等待使能及数据和地址的复用情况等,本芯片支持包括NOR Flash、NAND Flash、SD、EMAC、UART等多种启动模式。在本系统中,BootLoader采用系统默认的NAND Flash boot,对于NAND Flash基本是由ARM访问。DSP的算法代码作为AEM端OS文件系统的一个文件存在,通过应用程序进行DSP程序的下载和DSP芯片的控制,外部RAM空间即DDR存储区是ARM和DSP共享的,在设计和实现BootLoader时需要把ARM和DSP使用的内存从物理上严格分开,并预留一部分用于双核系统的交互。
C6A8168启动模式与以往的不同在于,芯片在启动时根据启动引脚的配置按顺序自动搜寻启动设备表中的设备以搜寻可以执行的启动镜像。找到镜像后将其拷贝到目标RAM,再通过重映射机制把RAM映射为零地址,系统上电或者复位时就可以从RAM中的BootLoader开始执行[4]。启动设备表包括片内存储器表和片外存储器表两部分。部分有代表性的启动设备顺序表如图2所示。
2 双核处理器启动准备
C6A8168启动并不是双核同时启动,系统上电或复位时默认的芯片启动配置是ARM核使能,DSP禁能。关闭看门狗和其他所有中断是为BootLoader的成功执行做准备。看门狗本来的作用是防止程序无限制地运行而造成死循环,但是如果在超过规定的时间不给看门狗电路清零,看门狗计数器就会溢出从而引起看门狗中断,造成系统的复位[5]。考虑到看门狗此特征和启动过程中有可能会发生中断或循环复位而影响启动,看门计数器和中断在启动时要关闭。
在关闭中断和看门狗之后ARM核初始化开始前需要使能DSP电源域使DSP进入到Reset模式。这个过程包括对DSP的一些最简单的初始化,例如分配一个能使DSP唤醒的最小的时钟等。
3 ARM核初始化
本文将重点阐述作为双核系统主处理器的ARM处理器自启动过程与单核ARM处理器自启动的异同点。
3.1 中断向量表
双核处理器中ARM核中断向量表与单核类似,其最大差距在于,通常的中断向量表只有一个,但在ARM+DSP双核系统中是先设置ARM处理器的中断向量表,待ARM核初始化完成后再唤醒DSP核,DSP核被释放后进行启动时,对应有DSP核的中断向量表。中断向量表详细写法不再详细赘述,本文着重详细介绍向量表中两个方案,如表1所示。
这两个方案各有优缺点,在调试过程中经过对两个方案的对比和分析,依据TD-LTE射频一致性测试仪表系统的具体特性和应用要求选择了第一个方案,原因有二。其一,B指令再被复制时没有LDR简单,这里所说的复制是指搬运异常向量表。由于B指令在搬运过程中常常出错,所以稳定性不够。其二,B指令的跳转范围小于32 MB,如果异常中断处理程序起始地址大于32 MB,则不适合使用B指令,而LDR指令虽然只能跳转到PC 4 KB范围之内,但在LDR指令不远处用DCD指令定义一个字,这个字里面存放最终异常服务程序的地址就可以实现4 GB全范围跳转[4]。
在综合考虑TD-LTE射频一致性测试仪系统需求及其对稳定性的特殊要求,本BootLoader采用第一种方案。
3.2 堆栈的初始化
堆栈的初始化是和ARM处理器运行模式对应的,由于ARM处理器有七种运行模式,各个模式都需处理各自相关的调用、中断等,所以必须为每一种模式提供独立的堆栈空间,在需要改变处理器为其他模式时就需要通过各处理器模式对应的堆栈指针来修改各模式对应的堆栈指针(SP)。在堆栈设置时需要注意,如果切换到User模式,则不能再从操作状态寄存器CPSR回到其他模式,可能会对接下来的程序执行造成影响。由于堆栈大小、位置及其初始化方式与单核ARM处理器的BootLoader并无区别,故不再赘述。
需要注意的是,堆栈初始化的顺序会决定系统在初始化完成后所处的处理器模式,即最后初始化哪种模式的堆栈系统就将运行在哪种模式。
3.3 时钟初始化
时钟的初始化是在双核系统中的PRCM(Power,Reset,Clocking Management)模块中进行。PRCM模块负责对系统的电源域、复位和时钟进行管理,在BootLoader中只需对时钟管理进行初始化即可。在锁相环初始化完成后再使能系统各功能模块时钟就完成了对该模块的初始化。在C6A8168中内嵌有4个PLL(Main,Audio,Video,DDR)以为系统各个不同的部分提供不同时钟[6]。其中各PLL初始化过程相似。时钟的产生途径如图3所示。
由图3可知,时钟初始化共需配置3个主要结构:多相位PLL、时钟合成器和PRCM模块。时钟合成器的个数由SYSCLK个数来决定,这样就可以根据系统需要为各模块提供不同的时钟。多相位锁相环把输入的参考时钟与N分频相乘后与K相位值一起输出给PLLCLK合成器,该合成器会根据多相位PLL输入和输入参数FREQ_N2根据公式fs=fvco×k/FREQ[6]输出PLLCLK时钟给PRCM模块作进一步的分频,其中FREQ_N2是一个由4位整数和24位小数组成的参数[5]。除了几个特殊的锁相环以外,大部分锁相环在系统复位或者上电后都处于旁路(bypass)模式,在这种模式中参考时钟绕过PLL直接输出到系统具体模块或者经PRCM分频后再输出。需要注意的是,在把时钟提供给系统模块前需要一个等待时间以使PLL输出达到稳定状态,其中除了audio PLL需要等待8 ?滋s外,其他锁相环都只需要等待5μs。
对PLL初始化时,必须保证PLL是在旁路模式,否则初始化无效。经过测试发现PLL上电启动后默认为断电模式,所以在进入旁路模式后要使PLL退出断电模式,再根据系统各模块时钟对上文提到的各个参数进行配置,配置完成后必须使PLL为非旁路模式才能使能时钟。
3.4 应用程序执行环境的初始化
所谓应用程序执行环境的初始化就是完成从NAND Flash 到RAM的必要的数据传输和内容清零。系统上电之后即从地址0开始取得第一条指令,所以0地址必须在上电时就存放可执行的正确代码。由于本系统采用NAND Flash 启动模式,地址0的地方应该是NAND Flash,因此上电时系统会通过硬件机制把NAND Flash 中block0的前8个page的数据自动加载到SRAM,剩余的数据搬移需要在BootLoader中实现。启动路径完成数据拷贝后会跑到由目标文件定义的入口点,可以根据map文件在指令文件中通过--entry_point制定新的入口地址。
4 DSP核唤醒启动
ARM处理器启动完后,由于其初始化后大部分系统相关功能已初始化,DSP核作为辅处理器其启动相较于ARM核要简单很多。ARM处理器启动完成后DSP处理器处于默认的复位状态,必须把主处理器(ARM)模式改为管理模式才能使DSP处理器从复位状态中退出。当系统处于调试模式时,通过.GEL文件中DSP核唤醒函数使处理器退出Reset状态后连接DSP核就可以进入该核的启动流程。当系统处于自启动模式时,需主处理器ARM进入到管理模式,在后续的初始化操作进行之前还必须把DSP相关BootLoader放在特定的启动地址处才能唤醒辅处理器,这一过程是由ARM处理器负责完成的。
DSP核的BootLoader组成上与ARM核中的BootLoader基本相似,只是部分公用模块有区别,不同的模块如PLL和中断向量表写法也都大同小异,其启动流程与ARM核类似,所以在此不再详细描述。
在TD-LTE双核系统中通过测试板测试两个时钟以验证双核系统启动是否成功。第一个测试点为该系统中PLL时钟Main5,按需要其时钟频率应该配置为125 MHz,之所以会选择该测试点是由于Main5时钟代表ARM核配置时钟与相关地址总线读写成功与否[6]。第二个为DDR时钟频率,由于DDR时钟初始化与DSP核启动相关,所以该时钟的正确性将直接决定DSP的启动是否成功。通过芯片外延测试点由示波器测试得到频率波形图,如图4、图5所示。
图4中所测时钟频率与系统理论值基本相符,图5中,在芯片外延测试点引脚拉高时向DDR中写1 MB数据,拉低后马上拉高,通过示波器观察写数据需要20.10 ms,由此可得DDR时钟频率为400 MHz,与系统理论值一样。两测试点与理论值的一致既反应了时钟配置方法的正确性,也说明了系统启动成功(BootLoader正确性)。
根据TD-LTE系统需求和ARM+DSP嵌入式系统的特点,本文设计并实现了综合硬件和软件两个方面的BootLoader,在双核非对称架构系统的自启动中有较高的参考价值。以上启动过程已经通过程序实现并在Code Composer Studio 5.2中顺利经过编译调试和测试板验证,所得结果均与理论值一致。本BootLoader在保证具有较强稳定性的前提下满足了国家重大科技专项“TD-LTE射频一致性测试仪表”对包括硬件和软件在内的系统需求并已成功应用在其中。
参考文献
[1] 蒋建春,曾索华,岑明.一种基于异构双核处理器的嵌入式操作系统构架设计[J].计算机应用,2008,28(10):2686-2689.
[2] 何永泰.ARM单片机启动代码研究[J].微处理机,2008(3):88-90.
[3] Peng Li,Yu Lu,Wei Hongxing.Realization of embedded multimedia system based on dual-core processor OMAP5910[J].Computational Engineering in Systems Applications (CESA),2008(4):101-105.
[4] SINGH G,BIPIN K,DHAWAN R.Optimizing the boot time of Android on embedded system[C].2011 IEEE 15th International Symposium on Consumer Electronics,Greater Noida,India,June,2011:503-508.
[5] 杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.
[6] TI公司.TMS320C6A816x C6-Integra DSP+ARM processors user′s manual[R].2011.