首页 理论教育 系统的启动和初始化

系统的启动和初始化

时间:2023-02-12 理论教育 版权反馈
【摘要】:启动过程主要完成系统的初始化,把CPU引导启动起来,并且配置其他外设设备,如FPGA、CCD、USB DEVICE等,使其处于工作状态,为操作系统的运行作准备。在系统中,启动代码和应用程序都固化在FLASH ROM中,系统从FLASH ROM加载启动。操作系统初始化是整个初始化过程的关键环节。Boot Loader将控制权交给操作系统的初始化代码后,操作系统需要完成:多任务的启动。如果应用没有定义初始化创建任务,系统会进入空闲任务执行;否则,系统进入应用的初始化任务执行。

系统的启动过程既是一个物理过程,也是一个操作系统软件的工作过程。启动过程主要完成系统的初始化,把CPU引导启动起来,并且配置其他外设设备,如FPGA、CCD、USB DEVICE等,使其处于工作状态,为操作系统的运行作准备。

系统的初始化流程主要包括加电或者复位、DSP芯片引导(Boot Loader)、CCD的初始化和配置、USB器件的初始化、FPGA的配置和操作系统的初始化。如图7-25所示。

图7-25 系统的初始化

7.4.1 Boot Loader

Boot Loader是一段汇编代码,主要作用是将系统的启动代码读入内存。TI公司的C6000系列DSP提供了不加载、ROM加载和主机HPI加载三种芯片引导方法。在系统(胡佳,2007年)中,启动代码和应用程序都固化在FLASH ROM中,系统从FLASH ROM加载启动。

加载过程在复位信号撤销之后开始,此时CPU内部保持复位状态。对C64X来讲,由EDMA从EMIF的CE1空间(FLASH所在的地址空间)拷贝1 kB的数据到地址0(内部RAM首地址),拷贝完后,CPU退出复位状态,开始执行地址0处的指令。因为应用程序的向量表、初始化段等需要到内存中运行的代码往往超过1 kB的大小,为了能在系统上电时自动引导应用程序运行,就需要在引导的1 kB代码中包括自定义的引导代码,以将额外需要的初始化代码段和数据段复制到内存中运行。

将FLASH ROM的数据复制到IRAM(内部RAM)中,我们采用了软件流水的方式使CPU直接快速搬移代码数据到内存中。前文介绍过,C64X的CPU内有8个并行的处理单元,一个时钟周期最多可以同时执行8条指令,这种工作方式称为“流水线”。所谓软件流水,即是利用这种处理器的结构特征来编排循环指令,是循环的多次迭代能够并行执行的技术。C6000的并行资源使得在前次迭代尚未完成之前可以开始新循环迭代。复制FLASH ROM中的数据到IRAM中,需要循环地将数据从FLASH中读到通用寄存器中(需要5个指令周期),然后将数据从通用寄存器中取到IRAM中(需要3个指令周期),于是一个数据的拷贝就需要8个指令周期。采用软件流水的思想后,前5个指令周期可连续读5个数(而不是等待第一个数完成),后5个指令周期再顺序地将读入通用寄存器的上述5个数取到IRAM。于是,在10个指令周期中,可完成5个数据的搬移,从而使搬移周期下降了2个指令周期,提高了CPU的运行效率。

在该系统中,除了常规的图像处理算法任务外,还有对DSP和FPGA进行在系统编程的任务。假如将上述两个任务安排在一个DSP程序内,代码会占用大量的DSP L2内存,可能导致算法所用的内存缓冲区不够用,并且上述后一任务被调用的频率很低,将其长期驻留在内存中完全没有必要。为解决这个问题,可以为上述两个任务建立两个独立的DSP程序,改进Boot Loader,使其能实现可选择的加载DSP代码。该方法的说明如图7-26所示。

图7-26 可选择的加载程序方法

该方法通过在启动代码中判断GPIO引脚的电平值,进而有选择地搬移相应的DSP程序到内存中,然后跳转到main函数处理。

7.4.2 FPGA的配置方法

传统的FPGA的配置方法是用串行配置器件,在程序调试成功后,利用FPGA的开发工具,将FPGA的代码编程固化到配置器件中。当FPGA上电后,FPGA从配置器件里读出程序数据,完成FPGA的加载配置。这种方法比较简单,但是也存在一些问题,如FPGA代码的安全问题,因为串行配置器件不能提供加密的功能,所以容易被人破解,非法获取FPGA的代码。

该系统(胡佳,2007年)所采用的方案是DSP配置FPGA的方法,设置FPGA的配置方式为PS被动模式,将DSP的五根GPIO引脚连到FPGA的配置引脚上,DSP读取FPGA的程序文件,并在GPIO引脚上产生对应的时序,实现FPGA的加载。图7-27为DSP与FPGA的引脚连接的示意图。

图7-27 DSP配置FPGA的硬件连接图

只需利用CPU的5个I/O线,就可按图7-28所指示的时序对FPGA进行PS方式配置。

图7-28 FPGA PS配置时序图

配置操作过程,DSP按下列步骤操作GPIO引脚时序,即可完成对FPGA的配置:

(1)nCONFIG=0、DCLK=0,保持2μs以上。

(2)检测nSTATUS,如果为0,表明FPGA已响应配置要求,可开始进行配置,否则报错。正常情况下,nCONFIG=0后1μs内nSTATUS将为0。

(3)nCONFIG=1,并等待5μs。

(4)Data0上放置数据的低位(LSB first),DCLK=1,延时。

(5)DCLK=0,并检测nSTATUS,若为0,则报错并重新开始。

(6)准备下一位数据,并重复执行步骤(4)、(5),直到所有数据送出为止。

(7)此时Conf_done应变成1,表明FPGA的配置已完成。如果所有数据送出后,Conf_done不为1,必须重新配置(从步骤1开始)。

(8)配置完成后,再送出10个周期的DCLK,以使FPGA完成初始化。

7.4.3 操作系统的初始化

操作系统初始化是整个初始化过程的关键环节。Boot Loader将控制权交给操作系统的初始化代码后,操作系统需要完成:

(1)CPU芯片级的初始化;

(2)调用所有硬件设备的初始化程序,进行设备初始化;

(3)初始化内核的所有变量和数据结构,并负责创建空闲任务;

(4)多任务的启动。如果应用没有定义初始化创建任务,系统会进入空闲任务执行;否则,系统进入应用的初始化任务执行。

嵌入式操作系统DSP/BIOS的启动顺序为:

①系统内核初始化由系统初始化函数BIOS_init初始化DSP/BIOS模块来实现:它初始化内核所有的变量和数据结构,然后调用MOD_init宏分别初始化每个用到的模块。

②调用应用程序main函数:在所有DSP/BIOS模块初始化之后,调用main函数。此时硬件中断和软件中断都是禁止的,应用程序可在main函数中添加必要的初始化代码。main函数初始化之后CPU的控制权交给DSP/BIOS。

③调用BIOS_start启动DSP/BIOS:BIOS_start函数是由配置工具产生的,它负责使能DSP/BIOS模块并为每个用到的模块调用MOD_startup宏使其开始工作。例如,CLK_startup设置PRD寄存器,SWI_startup使能软件中断,TSK_startup使能所有任务,HWI_startup使能硬件中断。

④在这些工作完成之后,DSP/BIOS调用IDL_loop引导程序进入DSP/BIOS空闲循环,此时硬件和软件中断可以抢先空闲循环的执行,主机也可以和目标系统之间开始数据传输。多任务的启动是通过调用TSK_startup()实现的。当调用BIOS_start()时,BIOS从任务就绪表中找出那个优先级最高任务的任务控制块。

初始化函数还负责建立空闲任务,这个任务比较特殊,表现在以下几点:

◣由初始化函数负责创建、实现代码体;

◣整个系统中优先级最低的就绪任务;

◣该任务被创建后一直留在系统中,不能被删除。

虽然,空闲任务只有当系统中其他任务因为各种原因被阻塞后才会运行,但是它的存在对系统是必要的。因为,系统中如果没有空闲任务,一旦其他任务全被阻塞,系统将处于不确定状态,整个系统将会崩溃。

7.4.4 DSP和FPGA的ISP技术

随着电子技术的不断发展,数字信号处理器和现场可编程门阵列的性能越来越高,由DSP+FPGA构成的系统结构广泛应用于各种数字信息处理系统。一般情况下,DSP和FPGA的程序数据固化在非易失性存储器FLASH中。FLASH器件在焊装后,如果要修改或者更新系统内DSP、FPGA的程序,则需要专业人士使用JTAG接口、硬件仿真器和EDA软件来操作完成,这种方法不仅操作不方便、通用性不强,而且增加了后期技术支持的成本。

本节介绍一种通过USB接口来更新数字系统内DSP和FPGA器件程序的方法。这种方法只需要一根USB电缆,配合应用软件便可以对系统进行在线编程配置。该方法的优点在于:方便实用,不需要额外的工具,用户获取系统升级文件,可自行对系统进行升级,大大降低了系统升级的成本。

7.4.4.1 工作原理

图7-29是一个采用典型的DSP+FPGA结构的图像处理系统组成框图。CCD成像器采集原始图像,FPGA的作用是缓存数据和产生控制信号,高性能DSP为图像处理的核心并且实现USB-SLAVE协议和程序数据的下载功能。

图7-29 系统组成框图

在下载系统固件程序时,常使用硬件仿真器通过JTAG接口对DSP进行在线系统编程,使用ByteBlaster下载线通过JTAG接口对FPGA下载配置程序,这些方法存在着下载线不通用、占用端口资源和速度慢的问题。

基于USB接口的在线编程技术克服了以上的问题,其原理是:针对DSP和FPGA引导和加载方式的特点,将DSP和FPGA的固件程序按照特定的数据格式存放在系统的FLASH器件中,主机上的应用软件通过USB接口给DSP发送在线编程的命令和配置数据,DSP收到命令后,从USB接口收取数据并且写入FLASH,由于系统是基于FLASH加载的,配置程序数据更新后,就达到了对DSP和FPGA重新配置的目的。

7.4.4.2 FLASH的加载特性

所选用的FLASH芯片型号为SST39VF080,存储大小为1 M×8位。整个系统是基于FLASH加载的,DSP和FPGA的配置程序都存储在FLASH里。FLASH的内部数据存储结构如下,前1 k个字节存放DSP的中断向量表和bootloader段,即DSP的引导程序段(用汇编语言编写)。从地址0X9000 0400到地址0X90080000,存放的是DSP应用程序代码,应用程序代码段包括DSP中断向量表、bootloader、USB通信函数代码、DSP配置FPGA函数代码、烧写FLASH函数代码和其他应用程序。FLASH的后半页(256 k字节)为FPGA配置数据段,用于存放FPGA的程序,Cyclone EP1C6的配置数据大小为1699136字节。具体分步如图7-30所示。

图7-30 FLASH的空间分布

系统通电后,DSP会自动加载其存放在FLASH里的应用程序,完成DSP的启动。FPGA的配置是由DSP完成的,DSP启动后,DSP应用程序读取FLASH中FPGA的配置数据,通过通用输入输出端口写入FPGA内,完成对FPGA的配置。

7.4.4.3 软件设计和实现

1.USB主机对设备的固件软件设计

设备固件是设备运行的核心,负责处理PC机发来的各种USB请求,以完成它们之间的数据传输。固件的功能主要包括:①加载后与主机驱动配合完成接口设备的第二次枚举;②处理与主机之间的USB接口的数据交换。下面依自底向上的软件设计方法实现USB主机对设备的枚举。

(1)DSP与CY7C68001的底层通信。这是整个USB模块的基础,主要包括对CY7C68001的端点的度/写函数。

(2)控制传输和USB协议栈标准请求命令的实现。控制传输主要用于发送和接收与USB设备的配置信息有关的数据,包括建立阶段、可选数据阶段和状态阶段。各个阶段都由特定的事务组成。建立阶段发送规定格式USB标准请求命令;数据阶段是可选的,它根据建立阶段指定的传输方向传输具体USB定义的数据;状态阶段用于报告建立阶段和数据阶段的传输结果。

(3)USB设备的枚举。根据USB协议的规定,在调用标准请求命令函数的基础上,实现主机对USB设备的枚举。首先通过缺省端口0获取设备描述符,如产品ID、厂商ID、设备类等信息;之后为设备分配新的地址,然后通过这个新地址与设备通信,获取配置描述符、端点描述符等;根据获取的配置描述符为设备设定一个配置。

(4)整个USB协议的框架。至此,整个USB主机的特性已了解。从(1)~(3)层层递进,一级比一级高级。简单地说,就是(3)中宏观USB主机活动由最底层(1)实现。而(1)中的函数是全与硬件相关的部分,越往上与硬件的关系越小,以至于(3)中的层就完全是与硬件无关的软件平台。这也为整个系统的移植奠定了基础,只需修改与硬件相关的函数即可。

2.配置程序数据的下载

在线编程技术需要应用软件的配合,应用软件包含两部分:计算机上的应用程序和DSP里常驻的固件程序。DSP里的固件程序是系统的核心部分,负责接收上位机发来的指令,并且完成和上位机的通信和对目标器件进行编程配置。当要对DSP或FPGA重新配置时,计算机应用程序首先读取新的程序数据文件,然后通过USB接口发送给DSP。每次传输由多个数据帧完成,一帧数据又由数据头和后面的数据包组成。数据包的内容就是要传输的程序数据,数据头的作用是用来标识数据的用途和校验信息。数据头的定义如下:

DSP收到了数据帧后,首先解析数据头的信息,调用相应的处理函数,根据处理结果给主机一个反馈信息,主机收到反馈消息后,也会调用相应的函数处理。具体的处理过程如下,DM642从USB总线每收到一个数据帧,首先解析数据头的信息,如果此帧数据是用于在线系统编程(ISP)的,则收取数据至SDRAM内,一帧数据接收完后,要校验数据传输的正确性。

数据校验由两个部分组成:第一个是检查本次收到的数据帧的序号是否等于上一次收到的数据帧的序号加一,如果相等,则校验成功,否则校验失败;第二个是要检查实际收到的数据的大小与数据头中数据包的大小信息是否相等,相等则校验成功,否则校验失败。只有上面两项的校验都成功,才算数据校验成功。校验成功后,反馈传输成功信息给主机,开始下一帧数据的传输;如果校验失败,则反馈传输失败信息给主机,要求主机重新传输数据帧。

主机应用程序和DSP固件程序的流程图如图7-31所示。当数据接收完毕后,DSP调用FLASH编程函数将存储在SDRAM里的数据编程写入FLASH中。如果接收的数据是FPGA的配置数据,DSP会调用配置FPGA的函数,完成对FPGA的配置;如果接收的数据是DSP的程序数据,DSP的重新配置在其复位后完成。

图7-31 应用程序流程图

在线系统编程(ISP)技术是目前国际、国内数字系统设计领域正在发展的技术,其目标是使用户在不改变用户系统PCB的条件下,直接对用户系统板上的ISP芯片进行功能上、逻辑上的修正和更新。本节介绍的采用USB接口的在线系统编程技术,能够方便地对FPGA和DSP进行重新配置,具有高速、高可靠性、通用性强等优点。该方法已成功应用于某一图像信息处理产品中,使用效果良好,并且它具有很好的移植性,稍作修改即可运用到其他图像或音视频数字处理系统中。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈