一种TI的C66X的快速启动方法

2016-06-18 01:21:20潘慕晗刘云武汉数字工程研究所第二研究室430074
电子制作 2016年6期
关键词:用户程序环境变量代码

潘慕晗 刘云 武汉数字工程研究所第二研究室 430074



一种TI的C66X的快速启动方法

潘慕晗刘云武汉数字工程研究所第二研究室430074

【文章摘要】

随着DSP应用技术的发展,其架构和规模不断扩大,DSP系统的启动方式也逐步向多元化和自动化发展。本文介绍C66X启动的过程并分析NOR FLASH启动的原理。通过对二级引导中的交互程序进行研究,实现了DSP的快速启动以及具有较好交互性的操作界面。

【关键词】

C66X;NOR FLASH启动;bootloader;交互

【Abstarct】

As DSP develops to the 21st century, its architecture and scale has changed a lot. Boot Method is also progressing towards the development of diversified automation point of view. Introduce the process of C66X-boot, Analyze the advantage of NOR-FLASH-Boot. Design the user interface program in the 2ndbootloader.Readlize the flexible quick-boot, and a better interface environment.

【Keyword】

C66X; NOR-FLASH-Boot; bootloader; interactive

0 引言

自2010年TI公司推出keystone C66X系列的DSP之后,关于该系列DSP的启动方式也成为技术难点之一。C66X系列DSP板提供了多种方式启动:本地的或者远程的,基于ROM的或基于flash的。总结一下,共有以下7种:EMIF16启动、SRIO启动、以太网启动、PCI-e启动、I2C启动、SPI启动以及Hyper-Link启动。

对于本地启动,一般使用I2C模式启动,由于启动的代码存放在EEPROM上,读取速度慢,导致启动速度较慢,耗时2-3秒。同时I2C启动的代码大小也受到EEPROM的容量限制。相较之下,使用EMIF16模式启动,把启动代码放在NOR FLASH上,不仅启动速度快,而且可以增加代码的容量以及灵活性。本文主要介绍了C66X系列DSP基于NOR FLASH的加载原理,并设计了一种可以通过串口进行交互的二级引导程序。

1 NOR FLASH启动原理

因为NOR FLASH是按字节寻址的,所以可以在NOR FLASH上直接执行代码。因此我们将一段引导代码烧入到NOR FLASH的基地址,选择EMIF模式启动DSP时,该段代码会将其后的初始化代码搬移到指定位置。然后跳转到C语言环境初始化程序入口地址“_c_ int00”。将这段代码称为一级bootloader。这段代码的执行时间,会随着其后代码的大小变化,在400微秒左右。

初始化代码称为二级bootloader,依据环境参数对PLL、DDR、UART、网络等进行初始化。初始化过程约10ms(初始化成功)。二级bootloader支持对用户程序的多种方式的引导,可以进行单核引导、多核引导、网络加载引导、以及直接跳转。

图1 .bin文件格式

总结来说,一级bootloader负责将代码引导起来,二级bootloader负责将系统初始化。

2 一级bootloader的分析

一级bootloader是直接运行在NOR FLASH上的。即PC指针指向NOR FLASH的基地址时,一级bootloader就开始工作了。

一级bootloader的工作是解析并引导其后的二级bootloader,所以二级bootloader 在NOR FLASH上的存储格式就有一定的要求。该种文件一共分3部分,代码入口地址、代码段信息、结束标识。代码入口地址,即图1的“_c_int00”,即文件头部的4个字节。代码段信息包含段的大小、段的起始地址、段的内容。根据段的大小以及起始地址,我们可以将其后的段内容搬移到指定的位置,也就是实现引导过程。结束标志是在文件的尾部值为0的4字节整型。当一级bootloader识别到段大小为0时,就认为搬移工作已经结束,然后跳转到代码入口地址“_c_int00”。图1即为二级bootloader的存储格式。总的来说,一级bootloader工作就是把所有的段内容搬移到指定的地址空间,然后再跳转到“_c_ int00”。

因为二级bootloader的格式是固定的,所有生成一个该格式的文件是相当重要的一个步骤。使用CCS5.5编译生成的执行文件(后缀.out)是ELF格式的。我们需要通过一定的工具链将ELF文件转换为图1所示的文件格式。工具链如图2所示。首先,向hex6x.exe输入.out文件以及一个.rmd的配置文件;得到一个.hex的中间文件,再将其输入到b2ccs.exe,得到一个.dat的中间文件,再将其输入到ccs2bin.exe,得到我们需要的.bin文件。

《会稽志》王右军宅记:“旧经云:‘羲之别业有养鹅池、洗砚池、题扇桥存焉。’……既谓之别业,则疑宅不在是,或云嵊县金庭观,乃右军旧宅,尝舍读书楼为观,在县东南七十二里孝嘉乡。”[2]1951

图2 .bin文件工具链

3 二级bootloader的研究与实现

二级bootloader的首要工作是完成整个系统的初始化,包含PLL串口、I2C以及DDR等。初始化的参数是从环境变量中获取的,如果环境变量不存在,则使用默认参数。在完成系统的初始化后,会提示用户是否进入交互界面,不进入交互界面则继续启动用户程序。下面主要介绍交互程序的设计。

用户交互界面是通过串口构建的。启动后,系统打印一些DSP的参数,如DDR大小、主频、初始化信息等,再进入自动启动,等待数秒后按照设定的启动模式引导用户程序(在等待过程中,按下任意键可进入交互界面)。

交互功能主要由以下几个方面组成:

串口输入输出功能,输出使用与printf类似的sys_printf,实现变参打印。而输入则使用sys_read_line,每次读取一整行的输入,同时实现退格、插入删除、查找最近的输入等功能。主要是实现上下左右、退格以及ESC键的功能。

为实现查找最新输入的功能,需要一个环形储存池,用于保存前面使用过的指令。环形池使用链表实现,用于实现上下键查找最近的输入。环形池内单个节点,包含的信息有输入的信息cmd_t[]、输入信息长度size_t、使用标记used、上一个节点的地址、下一个节点的地址。

指令解析及指令库。如查看内存数据“dm 80000000 100”,首先在指令库内查找与dm对应的指令,然后进入“dm”的处理函数(查看某地址的数据),读取输入中的参数,地址参数0x80000000,大小参数0x10,然后进行输出0x80000000开始的0x10字节的数据,并打印每个字节对应的ASCII码,不能显示的字符以‘.’代替。

指令库是由一张指令名表及指令函数组成,指令名表的每个条目由3个项组成。指令名:用于指令解析时,查找相应条目,如“dm”;指令入口:查找到指令条目后,根据条目内的该项可以调用相应的指令函数;指令说明:用于打印指令表的帮助信息。

打印帮助信息:{"help", &cmd_help, "show the help table"}

添加指令,需要在指令名表里,加入相应条目,同时实现相应的指令函数即可。

功能函数封装,将底层驱动与功能函数隔离。使代码对于不同硬件平台具有较好适应性以及可移植性。

如对于不同的FLASH,只需要在FLASH表内添加相应的条目以及相应的底层驱动即可。

static FLASHTable f_table[2]=

{{0, &S29GL_write, &S29GL_erase, "S29GL"},

{-1, NULL, NULL, ""}};

脚本功能,在启动用户程序之前,执行一些特定的动作,以此达到不修改代码,而增加功能。脚本会被保存在环境变量中,每次启动都会根据环境变量中的设置来决定是否执行脚本,以及脚本中的内容。

环境变量,是二级bootloader中的重要组成部分。它控制了系统的整体初始化,功能的选择,用户程序的启动方式等。对于不同应用环境下,启动时的参数也是不同的。如对于不同的DDR3,我们需要在环境变量中设置不同的DDR初始化参数。

环境变量是可以在交互界面下修改的,修改后通过指令保存到设定的NOR FLASH的某片区域上。为了保证环境变量的可靠性,在环境变量的尾部加入一个CRC32的校验。每次读取环境变量时,把读取的环境变量计算CRC32的值与NOR FLASH上的校验值对比,以确认读取到的环境变量是有效的。

计时功能,是启动流程控制的一个重要组成部分,主要用于超时等待和刷新打印。使得bootloader的启动时间在一个可控的范围内。在主频比较高的DSP上,选择以1微秒为计数单位。超时等待的功能一般用在硬件初始化等待。刷新打印则是用在自启动中,提示用户剩余时间。

通过实现以上的几点,我们可以搭建一个简单的交互界面。当系统启动后,打印当前的版本为1.5.0以及系统相关参数。然后读取环境变量的内容(如果NOR FLASH上没有环境变量则用默认参数),再根据环境变量对系统初始化并提示用户是否进入交互界面。进入交互界面后,用户可以输入相应的指令来执行一些操作。如“?”,查看帮助信息;“dm 80000000 10”,查看内存信息;“ddr test”,测试内存单元;“flash”,固化用户程序等。图3展示了一次DSP启动,并进入交互界面的全部打印。

图3 DSP启动打印信息

4 结论

本文通过分析TI的C66X DSP的NOR FLASH的启动原理,研究设计了用户交互程序,实现DSP的快速启动以及多样的启动方式,使得用户可以通过可视化的界面来进行程序的固化以及引导。

【参考文献】

[1] 乐燕芬. ARM嵌入式系统启动过程分析及实现[J].仪器仪表学报,2006年S3期

[2]肖启阳 方元 张忠慧. 基于TMS320VC55X系列DSP的外部FLASH并行二次引导加载方法研究[J].计算机应用与软件,2013年04期

[3] 冯林琳 耿恒山. 基于S3C6410的Uboot分析与移植[J].计算机与现代化,2013 年10期

[4] 李飞平 卿粼波 滕奇志 舒君 何小海. 基于TMS320C6678的多核程序加载研究与实现[J]. 电子技术应用,2015年03期

[5] 卫晋 刘峰 龙腾. 大规模多DSP实时网络加载系统关键技术研究[J]. 计算机工程与应用,2007年05期

猜你喜欢
用户程序环境变量代码
基于最大熵模型的云南思茅松潜在分布区
从桌面右键菜单调用环境变量选项
变速箱控制系统Bootloader设计与实现
彻底弄懂Windows 10环境变量
创世代码
动漫星空(2018年11期)2018-10-26 02:24:02
创世代码
动漫星空(2018年2期)2018-10-26 02:11:00
创世代码
动漫星空(2018年9期)2018-10-26 01:16:48
创世代码
动漫星空(2018年5期)2018-10-26 01:15:02
嵌入式设备远程升级方案设计
基于三阶段DEA—Malmquist模型的中国省域城镇化效率测度及其收敛分析