DSP

DSP/BIOS设计指导书

2019-07-13 10:39发布

DSP/BIOS设计指导书

1 概述

CCS是TI的DSP芯片集成开发环境,v3.2版本中集成了DSP/BIOS v5.21,支持Himalaya TCI6482芯片。 下面对CCS v3.2和DSP/BIOS的使用作一些介绍。

2 CCS的安装

目前TI提供的CCS最新版本是Code_Composer_Studio_v3.2.39.5,安装时最好卸载以前版本的CCS,或者选择不同的目录安装,以免出现冲突。 在安装目录中直接点击setup.exe开始安装,如图 1: 图 1 点击Next继续安装,如图 2: 图 2 在此页面,可以选择Custom Install安装模式自定义需要安装的模块,不安装不需要的部分,以节省硬盘空间。为简便起见,这里选用Typical Install来进行全部安装,进入下一页面选择安装目录,如图 3选择G:CCStudio_v3.2目录进行安装: 图 3 继续Next,如图 4确认信息后就开始了安装过程: 图 4 安装过程如图 5所示: 图 5 等待安装过程结束,出现如图 6页面,CCS v3.2的安装顺利完成。 图 6

3 CCS的使用

CCS在使用前,必须设置好目标环境配置,可以是Emulator环境或者是Simulator环境。只有配置好环境后,才能进入CCS的集成开发界面,进行工程的建立、编译、调试和性能检测等操作。

3.1 环境配置

通过Setup CCStudio v3.2来进行目标环境的配置。可以通过已经提供的器件家族、运行平台、大小端模式来选择一个合适的目标环境,也可以直接import一个已经做好的配置文件完成环境配置。以Himalaya TCI6482的EVM板仿真器环境,使用TI提供的配置文件直接导入为例,如图 7所示: 图 7 选择配置文件TCI6482 EVM with Mezzanine card XDS560 Emulator_bf.ccs,如图 8: 图 8 完成后如图 9所示,显示系统上有两个DSP芯片,可以同时进行调试。 图 9 配制好后,点击Save & Quit并启动CCS,出现如图 10界面。这是CCS的并行调试管理器,可以通过它并行操作多个DSP的调试过程。双击单个DSP的图标即可打开一个CCS集成开发环境界面,对单个DSP进行开发调试。 图 10 如果没有仿真器和EVM板环境,也可配置模拟器环境,选择默认提供的相应DSP内核和大小端模式的Simulator即可,如图 11: 图 11 在环境配置为单个DSP的情况下,启动CCS后不出现并行调试管理器,而将直接进入CCS集成开发环境界面。

3.2 CCS简介

CCS的界面如图 12所示: 图 12 它包括菜单栏、工具栏、项目视图窗口、文件编辑窗口、编译报告窗口等。常用的功能有工程菜单中的新建工程、打开工程、编译文件、编译工程、编译选项设置等,如图 13: 图 13 文件菜单下的程序加载功能是在进行Debug前必须执行的步骤,它把编译好的程序文件加载到目标环境中去,如图 14: 图 14 将.out文件加载到目标环境后,就可以利用Debug菜单或者左侧调试工具栏中的功能来进行调试了,如图 15: 图 15

3.2.1 创建、打开和关闭工程

选择菜单栏中的Projectànew…,弹出如图 16所示对话框,输入项目名称,设置路径。Project Type项选择“Executable.out)”,Target项选择“TMS320C64XX”。设置完成点击“Finish”按钮,完成创建Project 图 16 选择菜单ProjectàOpen可以打开一个已经存在的项目。项目文件包含的信息也同时会加载进来。     选择菜单ProjectàClose可以关闭当前项目。

3.2.2 添加文件到Project

单击菜单栏projectàAdd files to project…或使用项目视图窗口中的快捷菜单(单击项目文件名并单击右键选择快捷菜单Add Files),弹出如对话框: 选择被添加文件的类型,找到相应路径,选中文件后,点击“Open”按钮就可以完成文件的添加操作了。若需要添加多个文件,请重复添加文件操作。 目前工作中几种常用文件类型介绍: *.asm :DSP汇编源文件 *.c   : C语言源文件 *.tcf  :DSP/BIOS配置文件(CCS v2.x中是*.cdb文件) *.cmd :链接命令文件 *.out  :编译输出的可执行文件 *.lib  :库文件 注意:*.h/*.h62等头文件不是手工添加到项目中的,而是在CCS扫描所有源文件(Scan All File Dependencies)后自动添加到项目视图窗口中的Include目录下的。

3.2.3 建立DSP/BIOS配置文件

如果项目需要使用DSP/BIOS,则需要建立一个tcf文件,它是一个可编辑的文本文件,记录DSP/BIOS配置的命令,实际的配置文件是一个只读的cdb文件。 点击菜单 FileàNewàDSP/BIOS Configuration…,弹出对话框,如图 17所示。 图 17 这是一些DSP/BIOS的模板,可以选择合适的创建。如果要针对Himalaya EVM板的DSP/BIOS,则需要使用TI提供的一个evm6482模板,将其拷贝到CCS安装目录下的bios_5_21packagesmyplatforms目录下(对应Platform.tci文件中的*  !NAME! myplatforms.evm6482一行),点击Browse Platforms…选择bios_5_21packagesmyplatformevm6482Platform.tci文件,如图 18: 图 18 创建好的配置文件图形界面如图 19,配置完成保存后,在工程中使用Add files to projecttcf文件加入到工程中去即可。 图 19 也可以使用文本模式编辑配置文件,在工程视图窗口到相应的tcf文件上右键选择DSP/BIOS ConfigàText Edit后,出现文本编辑窗口,如图: 需要注意第一行Platform的路径是否跟自己拷贝的目录一致,特别是从别处拷贝过来的工程,需要首先检查一下此项,如果不一致,CCS无法打开图形化的配置界面,并且会产生严重错误,导致程序强行退出。

3.2.4 工程编译

当建立好Project,并编写、添加源文件到工程后,还需要添加一个cmd链接命令文件,指示工程中代码、数据、模块等的内存分布,如图 20添加: 图 20 接下来就可以编译并运行调试程序了。

3.2.4.1 编译和运行程序基本步骤

按照以下步骤,编译和运行程序: Step 1:选择Project→Rebuild 或 点击快捷栏按钮(Rebuid All),编译信息可查看如图 21所示输出窗口: 图 21 Step 2:缺省输出文件*.out编译后存放在当前工程目录的Debug文件夹中,也可以Project Toolbar栏中更改。如图 22所示: 图 22 Step 3:点击File→Load Program,选择之前编译输出的*.out文件,点击“Open”。 Step 4:选择 View→Mixed Source/ASM,可同时查看C源代码和编译后汇编代码。 Step 5:选择Debug菜单或工具栏中的Go Main,执行到main函数入口处停止,并在代码显示窗中用标记PC指针的当前位置。 Step 6:在代码显示窗左侧相应代码行上双击鼠标左键设置端点,以标记断点。 Step 7:选择debugàRun 或 点击快捷栏按钮,运行程序。 Step 8:选择debugàHalt 或 点击快捷栏按钮,停止运行程序。

3.2.4.2 编译选项设置

CCS环境下,可以为工程文件(.pjt)指定编译选项,也可以为具体的每一个文件指定编译选项。 编译选项可以通过工程文件或者某个具体的.c文件单击鼠标右键,然后在弹出窗口中选这“Build Options”,或者点击菜单栏ProjectàBuild Options,弹出如图 23窗口: 图 23 编译选项分为:Basic,Advanced,Feedback,Files,Assembly,Parser,Preprocessor,,Diagnositcs共八类。每一类又细分为若干选项设置。 单击右下角的Help,可以获得每个具体选项的含义。下表中列出与编译调试密切相关的编译选项。表中未说明的选项使用默认选项即可。 类 配置 说明 Basic->Target Version C64x+(-mv6400+) 选择所使用的DSP芯片类型。 Basic-> Generate Debug Info Full Symbolic Debug (-g) 为了方便调试,通常选择包含全部符号信息 Basic->Opt Speed vs Size speed Most Critical (no -ms) 优化选项,在编译调试阶段不设置。 Basic->Opt Level None Basic->Program Level Opt None Advanced->Endianness 1) Big Endian (-me) 2) Little Endian 选择产生的目标代码的格式。 Preprocessor->Include Search Path(-i) - 指明头文件的存放位置 Preprocessor->Define Symbols (-d) 举例:_DEBUG 宏开关定义,如:_DEBUG,即定义了该宏等于1。 Preprocessor->Undefine Symbols (-U) — 不定义预先设置的宏,可覆盖之前的定义。即如果在Define Symbols 选项中定义了的宏,在此处如果又定义一次,则该宏值为“0”。 Preprocessor->Preprocessing None Standard C/C++ preprocessing functions. 在链接选项页中,可设置输出文件和内存映射文件的路径以及需要包含的库文件,如图 24所示: 图 24 在Serach Path和Libraries中,可将芯片支持库(CSL)的路径和使用的库文件设置好,这样就不需要在工程中添加库文件了。由于CCS v3.2默认没有带支持TCI6482的CSL v3.x的库,可将最新的CSL拷贝到CCS目录下,建议统一路径名称,以免不同机器建立的工程不能兼容。通常库文件中末尾带e的为Big Endian库,不带e的为Little Endian库,需要根据Complier选项中的选择分别选用。

3.2.5 调试

编译成功后CCS软件会自动在工程目录下生成可执行文件*.out文件(前提条件:Build Opints窗口中已经设置可执行文件类型为*.out),点击菜单栏FileàLoad Program,在弹出的对话框中找到*.out文件的存放位置,打开文件完成加载后,就可以调试程序了。

3.2.5.1 Breakpoint

断点可以停止程序的运行。程序停止运行后,可以观察程序的状态,修改变量以及检查调用堆栈等。有软件断点和硬件断点之分。如果是使用Simulator仿真,那么使用的是软件断点;如果是通过XDS560等仿真器硬件,那么使用的是硬件断点。点击菜单DebugàBreakpoints后会弹出如图 25所示窗口。 断点可以将光标定位到源程序中的一条C语句上,使用按钮,快捷键F9设置。已设置断点的地方可以在代码行前面看到红 {MOD}的圆圈标识。断点的删除可以将光标移动到断点处按或F9删除断点。也可以按删除全部断点。断点的添加、删除、使能和禁止都可以在图 25所示窗口中操作。 图 25

3.2.5.2 Watch Window

在Watch Window窗口可以观察和修改变量或C表达式。观察变量可以按不同格式进行。快速查看(Quick Watch)功能还可以快速地将变量加到Watch Window窗口。 Watch工具栏如图 26: 图 26 点击快捷键或菜单栏Viewà Watch Window,也可以打开如图 27所示界面: 图 27 如图 28所示,程序运行到If语句,被断点打断, 图 28 此时如果想知道变量byReturnVal当前的值,有下面几种操作方法: 1) 移动鼠标悬停在该变量名上片刻就可以看到提示,如: 。 2) 在源程序窗口中在变量名上点击鼠标右键,在弹出的菜单栏中选择“Add to Watch Window”,这样就把该变量添加到了Watch Window窗口中。 3) 选中被查看的变量名,点击右键,在弹出的菜单栏中选择“Quick Watch”,则会弹出如图 29所示对话框,可以看到变量的值。点击“Add To Watch”按钮可以将变量加入到Watch Window窗口。 图 29 4) 打开Watch Window窗口,按Insert键,在其编辑框中直接键入需要添加的变量名或表达式,如图 27。也可以在Watch窗口中点击右键选择“Add Tab”分类显示各种变量。

3.2.5.3 Memory

在CCS软件中可以观察某个特定地址内存单元的数据。提供了直接查看目标内存数据的功能。 图 30 点击快捷键或菜单栏的“ViewàMemory”,会弹出如图 31所示内存显示框: 图 31

3.2.5.4 Registers

Registers窗口可以观察CPU内核寄存器或各种外围设备的寄存器(如EDMA寄存器和串口寄存器等)。在寄存器窗口中双击某寄存器就可以直接编辑寄存器的值。 图 32 点击快捷键或菜单栏Viewà RegistersàCore Registers,将会弹出如图 33所示CPU内核寄存器窗口,就可以查看如辅助寄存器A/B的值了。在Viewà Registers菜单中还可以选择查看HPI寄存器、EDMA寄存器等的状态。 图 33

3.2.5.5 Displaying Graphs

CCS提供数据的图表显示功能,目前常用的功能为Time/Frequency,即:可以灵活地使用此工具显示Buffer中的数据的时域波形图或频域特性图。点击ViewàGraphàTime/Frequency…后弹出如图 34所示对话框。 其参数设置,主要是以下5个,分别是: Start Address:起始地址(可以写符号); Acquisition Buffer Size:缓冲区长度; Index Incremeng:数据间隔一般是1,如果一个隔着一个画,就改为2,以此类推; Display Data Size:一般设成buffer size一样大; DSP Data Type,选择8位,16位或32位,视具体数据类型而定。 图 34 其他参数的作用及设置请点击“Help”按钮查看。 设置好之后点击“OK”就行了,如果窗口中无波形显示,可以点击“Refresh”就可以看到,下面举例说明,设置起始地址为0x60000000,长度为100,数据间隔为1,显示数据长度为200,数据类型为:8-bit signed integer,设置完成确认后则显示的波形如图 35所示。 图 35 图形窗口还可以按照其他方式显示数据,即Constellation Diagram(星图)、Eye Diagram(眼图)和Image(图像)。具体请查看CCS的帮助,检索关键字:Graph。

3.2.5.6 Command Window

点击菜单栏ToolsàCommand Window,弹出如图 36所示对话框: 图 36 在命令输入栏中键入“help”可以打开帮助文档。此窗口可以和CMD脚本文件配合使用。例如:编写了给变量赋值的脚本文件testgptDLDpramInfo.cmd,在程序运行到测试用断点后,就可以直接在Commad窗口的命令输入栏中用赋值命令语句或打开预先编译好的赋值脚本文件。

3.2.5.7 Message Event Logs

为调试查看方便,可以打印输出调试信息到LOG窗口(快捷键)。调用CCS库函数LOG_printf()可以打印输出调试信息到LOG窗口。 如:LOG_printf( &LOG_drv, "DPRAM: DL FP buffer meet 0xFF fill!!" ); 其中LOG_drv是在*.cdb文件的Instrumentation àLOG项中设置。如图 37所示。 图 37

3.2.5.8 Kernel/Object View

Kernel/Object View窗口可以显示当前正在运行的目标代码的DSP/BIOS配置、状态等信息。动态和静态配置都能显示,如图 38所示: 图 38 详细内容请查看CCS帮助,检索关键字:Kernel/Object View。

4 DSP/BIOS简介

DSP/BIOS是CCS中集成的一个简易的嵌入式实时操作系统,能够大大方便用户编写多任务应用程序。DSP/BIOS拥有很多实时嵌入式操作系统的功能,如任务的调度,任务间的同步和通信,内存管理,实时时钟管理,中断服务管理等。有了它,用户可以编写复杂的多线程程序,并且会占用更少的CPU和内存资源。 DSP/BIOS是一个可用于实时调度、同步,主机和目标机通信,以及实时分析系统上的一个可裁减实时内核,它提供了抢占式的多任务调度,对硬件的及时反应,实时分析和配置工具等。同时提供标准的API接口,易于使用。它是TI的eXpressDSP实时软件技术的的一个关键部分。

4.1 DSP/BIOS的组件构成

DSP/BIOS在一个主机/目标机环境中的组件分布如图 39所示: 图 39 Ø DSP/BIOS API:编写的程序可以调用API接口函数; Ø DSP/BIOS配置:创建的配置文件定义了程序使用的静态BIOS对象; Ø DSP/BIOS分析工具:集成在CCS上的一些BIOS分析工具可以对运行与目标设备上的程序进行监测,包括CPU负载、时间、日志、线程执行状态等。 DSP/BIOS分为很多模块,提供的所有API函数都按照模块分类,以模块名加下划线开头来命名,如图 40所示为DSP/BIOS的全部模块。 图 40

4.2 DSP/BIOS的启动顺序

当DSP/BIOS的应用程序启动时,一般遵循下面的步骤: 1) 初始化DSP:DSP/BIOS程序从C/C++环境入口c_int00开始运行。对于C6000平台,在c_int00开始处,系统栈指针(B15)和全局页指针(B14)被分别设置在堆栈断的末尾和.bss断的开始。控制寄存器AMR、IER、CSR等被初始化; 2) 初始化.bss段:当堆栈被设置完成后,初始化任务被调用,利用.cinit的记录对.bss断的变量进行初始化; 3) 调用BIOS_init初始化用到的各个模块:BIOS_init调用MOD_init对配置用到的各个模块进行初始化,包括HWI_init、HST_init、IDL_init等; 4) 处理.pinit表:.pinit表包含一些指向初始化函数的指针,对C++程序,全局对象类的创建也在此时完成; 5) 调用用户程序的main函数:用户main函数可以是C/C++函数或者汇编语言函数,对于汇编函数,使用_main的函数名。由于此时的硬件、软件中断还没有被使能,所以在用户主函数的初始化中需要注意,可以使能单独的中断屏蔽位,但是不能调用类似HWI_enable的接口来使能全局中断; 6) 调用BIOS_start启动DSP/BIOS:BIOS_start在用户main函数退出后被调用,它负责使能使用的各个模块并调用MOD_startup启动每个模块。包括CLK_startup、PIP_startup、SWI_startup、HWI_startup等。当TSK管理模块在配置中被使用时,TSK_startup被执行,并且BIOS_start将不会结束返回; 7) 执行idle循环:有两种方式进入idle循环。当TSK管理模块使能时,任务调度器运行的TSK_idle任务调用IDL_loop在其它任务空闲时进入idle循环;当TSK模块未被使用时,BIOS_start调用将返回,并执行IDL_loop进入永久的idle循环,此时硬件和软件中断可以抢占idle循环得到执行。由于idle循环中管理和主机的通信,因此主机和目标机之间的数据交互可以进行了。

4.3 DSP/BIOS的配置

DSP/BIOS的静态配置是利用CCS提供的配置工具完成,包括图形化配置工具和文本配置工具。图形化工具层次清晰,比较直观,而文本工具更加灵活。通常使用图形化的配置方法,下面对主要的模块配置做一些介绍。

4.3.1 Global Setting Properties

右键点击“Global Settings”,点击“What’s This”,会弹出帮助窗口,该文件中有Global Setting Properties的各项设置说明。下面介绍的其他如MEMLOG等配置都可以用同样的方法得到相应的帮助。 选择弹出菜单中的“Properties”,如图 41所示。 图 41 弹出如图 42所示对话框: 图 42 一般选择默认设置即可,CLKOUT项需要根据DSP硬件单板提供的工作时钟设置,Himalaya通常运行在1GHz频率。 DSP Endian Mode 项根据实际情况设置。

4.3.2 MEM设置

MEM模块设置中可以根据具体情况设置不同的内存段,其中存在一个默认的IRAM片内内存段。需要注意的是,首先必须在IRAM段上设置一个heap段落,用于BIOS的内部使用。设置方法是在IRAM段上右键选择“Properties”,弹出如图 43对话框,必须设置红线框中的选项,heap size可根据情况具体设置。 图 43 接下来配置MEM全局属性,右键点击配置窗口中的“MEM…”,如图 44所示: 图 44 点击“Properties”,弹出如图 45所示窗口: 图 45 如图红线框中,两个heap段都要选择为IRAM,“Stack Size”项需要根据实际情况设置最大的栈大小,其他使用缺省设置即可。 在图 44的菜单中,点击“Insert MEM”可创建新的内存段。在新的内存段名上右键选择“Properties”弹出如图 43窗口,根据情况设置base(基地址)、len(段长度)、heap size(用于MEM动态内存分配的堆大小)。

4.3.3 LOG设置

LOG用于输出和记录一些打印信息,默认存在一个LOG_system对象,是系统内部用来处理打印信息的,不需要去设置。可以增加新的LOG对象,用来在应用程序中输出打印信息。如图 46,在LOG标签上右键选择“Insert LOG”,填写对象名LOG_test即建立了一个新的LOG对象。 图 46 在LOG_test标签上右键选择“Properties”,弹出如图 47窗口,可对此LOG对象属性作一些设置。具体设置含义可通过Help查看。 图 47

4.3.4 CLK设置

CLK属性中通常选择定时器Timer0作为DSP/BIOS的基准时钟,计时分辩率设置为每秒1000次中断,在1GHz系统时钟下,近似为每次定时中断间隔999.996微秒。Timer Mode选择为32bit unchained模式,即使用TCI6482TMR0TIMLO作为Timer0,而TIMHI还可以作其它用途使用。CLK属性配置界面如图 48所示: 图 48

4.3.5 HWI设置

HWI(硬中断)中包含HWI_INT4到HWI_INT15可用来定义用户自己的硬件中断,HWI_RESET、HWI_NMI和HWI_RESERVED不要去改动。如图 49,每个硬HWI的优先级从上到下逐渐降低。 图 49 选择HWI_INT10为例,来设置EMAC/MDIO的中断,需要填写中断事件号17,并且填写中断服务程序名(C函数前面需要加下划线)如图 50所示: 图 50 在Dispatcher页面,选择“Use Dispatcher”由BIOS代理控制中断的确认和清除,不需要用户中断服务程序干预,比较简便。如图 51: 图 51

4.3.6 SWI设置

SWI(软中断)的优先级在HWI之后,但是比TSK高,可以通过右键菜单中的“Insert SWI”创建一个SWI对象,可以指定SWI内部优先级,从0(最低)14(最高)。如图 52: 图 52

4.3.7 TSK设置

TSK Manager(任务管理器)中可以根据需要创建各种任务,任务间是根据优先级抢占策略来进行调度的,TSK提供有多种优先级别,包括-1(Suspend)0(Idle)1(最低)15(最高)。如图 53: 图 53 在TSK Manager上右键选择“Insert TSK”并填写任务名称后就可以创建一个任务,在相应任务上右键选择“Properties”可对任务属性进行设置,如图 54: 图 54 Stack Size(最大堆栈大小)和Priority(优先级)需要根据任务的具体情况进行设置。在Function页面,填写任务实体函数名(C函数前面加一个下划线),如图 55: 图 55

4.3.8 Synchronization设置

DSP/BIOS中任务间的通信和同步可由SEM、MBX、QUE、LCK四个模块完成: Ø SEM(信号量):用于任务同步和互斥,有计数功能,根据需要使用; Ø MBX(邮箱):也用于任务同步,可以传递少量数据,根据需要使用; Ø QUE(队列):可实现任务同步和资源的共享,根据需要使用; Ø LCK(资源锁):实现对共享资源的互斥,根据需要使用。 四种同步模块对象都可以通过各自的右键菜单中“Insert …”来创建,并可对其属性作相应的设置。如图 56所示: 图 56

4.3.9 Input/Output设置

  这里可以设置一些输入/输出相关的高级设置,具体可通过CCS的帮助项来了解。一般不需要进行设置。只有RTDX(实时数据交换),需要根据目标环境的情况对数据交换模式进行一下选择,用来在调试中主机和目标机进行数据交换。可以是仿真器环境的JTAG模式,或者是模拟器环境的Simulator模式。如图 57所示: 图 57