Download presentation
Presentation is loading. Please wait.
Published byGuido Geiger Modified 6年之前
1
第九章 DSP集成软件开发环境 CCS直译“谱写代码的工作室”. DSP界第一个集成的代码开发工具. 以C6000为例讲解CCS.
软件开发环境在一个应用中的位置和作用。
2
第九章 DSP集成软件开发环境 9.1 CCS集成开发环境 9.2 C语言程序基础 9.3 混合语言编程 9.4 芯片支持库(CSL)
3
9.1 CCS集成开发环境 CCS(Code Composer Studio)是TI公司为DSP推出的集成软件开发环境(IDE),提供了配置、建立、调试、跟踪和分析的工具,包括了应用程序开发必需的所有功能,便于对实时信号处理程序的编制和测试,能够加速开发进程,提高工作效率。
4
CCS调试界面 CCS是DSP领域第一个 完整的、开放型集成开发环境(IDE) 直观、易用 无需停止DSP运行即可观察DSP的信息
具有实时分析功能开放的环境 可加入第三方插件(Plug-Ins)
5
CCS调试界面 标题区 菜单条 编辑工具条 编译工具条 反汇编调试 窗口 数据显示窗口 工程管理窗口 图形显示窗口 C源程序编辑窗口 调试
变量观察窗口 编译运行结果显示窗口
6
可视化图形 信号分析图形化 以自然的格式观察信号 在变量有效时修改其值 并观察它们的影响 多种专用的画图工具 时域/频域图 FFT
Eye diagram Constellation plot Image displays
7
CCS集成环境的组成 包括主机和目标系统两部分
CCS 首先是作为代码生成工具,作为代码生成工具有这样一些输入:配置工具产生的配置文件,DSP/BIOS API的库函数。自己的程序文件.c,.h=》生成可执行文件 主机方:最低层是JTAG,上面是调试器,再上面是CCS的各种插件,包括DSP/BIOS插件(实时调试),还用RTDX(实时数据交换) 目标系统一方:最底层是硬件和JTAG,向上是DSP/BIOS实时操作系统(这是可选的也可以没有操作系统,完全自己管理),再向上是应用程序.
8
软件开发流程 每个白色框代表一种代码生成工具,条纹框是它的输入文件类型
比如:C编译器(C程序),汇编优化器(线性汇编程序),汇编器(汇编),建库工具,连接器 最后可执行文件由调试器加载目标系统 以上的工具时常用和通用的. 其它的工具: hex conversion utility 16进制转换工具,把COFF 转换为其它格式文件写到EPROM中 cross-reference lister 产生交叉参考列表, 它列出定义的symbol, 定义symbol的行, 以及用到symbol的位置(行),还有symbol的类型, 编译和连接时分配给symbol的值. absolute lister, 产生连接后的coff文件的绝对地址列表 Archiver: 文档管理工具—打包.
9
CCS集成开发环境 提供一些类似VC的代码编辑功能 原程序,反汇编同时显示. 逐条语句对应, 但优化后是模块对应.
语法高亮显示,自动缩近,文字查找等等 原程序可以与反汇编同时显示 提供一些类似VC的代码编辑功能 语法高亮显示,自动缩近,文字查找, 替换,撤销, 重做, 用户化键盘命令.等等 原程序,反汇编同时显示. 逐条语句对应, 但优化后是模块对应.
10
CCS项目管理 应用程序按项目来管理,按层次以图形化的方式显示 *.cmd 文件 *.h 头文件 *.lib 库文件 *.c 源程序
项目窗口,显示一个项目的组成,项目文件(.pjt),cmd文件,.h头文件,.c源程序 编译时,可选用全编译和仅对修改的文件编译
11
CCS图形化设置 各种编译选项,如C编译器选项,连接器选项等通过图形化方式来设置,不需要手工添加选项 有C编译器的选项,汇编选项,连接选项;
2。0之后没有汇编选项。都用cl6x编译.asm文件
12
CCS 常用功能 1、设置断点 将光标放置在需要设置断点的程序行前,点击Debug →Breakpoints,或点击工具栏按钮 ,即可完成一个断点的设置,点击工具栏按钮 可清除所有的断点。 2、复位的3种方法 (1) Reset DSP:点击Debug →Reset CPU,初始化所有的寄存器内容并暂停运行中的程序。使用此命令后,要重新装载.out 文件后,再执行程序。 (2) Restart:点击Debug → Restart ,将PC 值恢复到当前载入程序的入口地址。 (3) Go main:点击Debug →Go main,将程序运行到主程序的入口处暂停。 3、执行程序的4种方法 (1) 连续 执行:点击Debug →Run ,程序运行直到遇到断点为止。 (2) 暂停执行:点击Debug →Halt ,程序停止运行。 (3) 动画执行:点击Debug →Animate,用户反复运行程序,直到遇到断点为止。 (4) 自由执行:点击Debug →Run Free ,禁止所有断点运行程序。 断点设置:多种step方法: single step(step into, 源程序级单步); step over(函数级单步); step out(跳出); run to cursor 运行到光标处. 运行到断点处自动更新窗口 观察和编辑变量、寄存器和存储器 调用堆栈(call stack),显示函数调用层次关系. 补充上电时的工作:$ASM$(simulator, 硬件上电复位RESET中断服务程序)c_int00_auto_init(C变量初始化)返回后c_int00调main()函数…. Main()完成后,c_int00调exit(1),做一些清楚工作,如关闭打开的文件.exit在调abort,无限循环. 利用探点(probe point)流入流出(stream in and out)存储器数据:
13
CCS 常用功能 4、单步执行的4 种方法 (1) 单步进入:快捷键F8,Debug →Step Into,当调试语句不是基本的汇编指令时,此操作进入语句内部 (2) 单步执行:点击Debug → Step Over,此命令将函数或子函数当作一条语句执行,不进入内部调试 (3) 单步跳出:点击Debug →Step Out,此命令作用为从子程序中跳出 (4) 执行到光标处:快捷键Crtl+F10,Debug → Run to Cursor,此命令作用为将程序运行到光标处 5、查看内存与变量 (1) 查看变量:使用View →Watch Window 命令 (2) 查看寄存器:使用View →Registers →CPU Registers 命令 (3) 查看内存:使用View →Memory 命令 断点设置:多种step方法: single step(step into, 源程序级单步); step over(函数级单步); step out(跳出); run to cursor 运行到光标处. 运行到断点处自动更新窗口 观察和编辑变量、寄存器和存储器 调用堆栈(call stack),显示函数调用层次关系. 补充上电时的工作:$ASM$(simulator, 硬件上电复位RESET中断服务程序)c_int00_auto_init(C变量初始化)返回后c_int00调main()函数…. Main()完成后,c_int00调exit(1),做一些清楚工作,如关闭打开的文件.exit在调abort,无限循环. 利用探点(probe point)流入流出(stream in and out)存储器数据:
14
CCS 常用功能 6、探针(Probe Point) 1)适合于算法的开发,功能验证 示例0901 2)可以完成这样的功能
从一个文件中读入数据到一个DSP的缓冲区 将一个DSP的缓冲区内容写到文件中 3)探点类似于断点,又不同于断点 运行到Probe point,DSP会停顿下来 完成一些动作后(读写文件),程序继续运行 4)文件输入输出的设置:FileFile I/O… 5) Probe的设置:类似断点的设置(用工具条) 示例0901
15
CCS 常用功能 7. 图形显示 CCS支持一维图形,二维图象(标准的数据格式),眼图等显示方式 有放大、缩小等功能
可以方便直观地判断算法执行的效果
16
CCS 常用功能 在CCS中可以将数据按图形化方式显示出来,包括时频图、星图、眼图和图像4种类型。
各种图形方式都是采用双缓冲区(采集缓冲区和显示缓冲区)分别存储和显示图形的。 采集缓冲区在目标处理器上,包含需要显示的数据。显示缓冲区在主机上,用于保存采集缓冲区数据的拷贝。图形是由显示缓冲区的数据生成的。 当刷新图形时,采集缓冲区内容会被读到显示缓冲区中。设置好显示参数后,CCS就可以从采集缓冲区读取Acquisition Buffer Size长度的数据到显示缓冲区并显示数据了。
19
CCS 常用功能 GEL=General Extension Language 一种类似C的解释型语言,可实现循环等程序结构
提供基本的程序控制命令,类似以前emulator提供的命令,GEL_Go(), GEL_Reset() 等等 可以制作菜单(可以加入到CCS主菜单),对话框,滑动条
20
9.2 C语言程序基础 一个最小的C应用程序至少要包含如下几个文件:
1. 主程序文件program.c:这个文件必需包含一个main()函数作为C程序的入口点; 2. 链接器命令文件link.cmd:这个文件定义了DSP的存储空间以及代码段、数据段是如何分配到这些存储空间的; 3. C运行库rts6700.lib:C运行库提供了标准C函数,以及C环境下的初始化函数c_int00()函数。库文件及其源代码位于CCS安装目录下的c6000\cgtools\lib子目录下。 4. 中断向量表文件vectors.asm:这个文件的代码作为中断服务表,必须由链接命令文件分配到0地址,或由ISTP指向的地址。DSP复位后,首先从0地址开始运行,然后跳转到rts6700.lib库内C运行环境的入口点_c_int00,完成初始化操作,再调用main()函数,执行用户的程序。
21
CCS 常用文件 文件名 描述 program.c C程序源文件 program.asm 汇编程序源文件 program.sa
线性汇编程序源文件 vectors.asm 中断向量表文件 filename.h C程序的头文件,包含DSP/BIOS API 模块的头文件 filename.lib 库文件 project.cmd 链接命令文件 program.obj 由源文件编译或汇编而得的目标文件 program.out 经完整的编译、汇编以及链接后生成的可执行文件 program.map 经完整的编译、汇编以及链接后生成的空间分配文件 project.pjt 存储环境设置信息的工程文件
22
CMD文件 CMD文件由3部分组成: 输入/输出定义: MEMORY命令:描述系统实际的硬件资源 SECTIONS命令:描述“段”如何定位
*.obj文件: 链接器要链接的目标文件 *.lib文件: 链接器要链接的库文件 *.map文件:链接器生成的交叉索引文件 *.out文件: 链接器生成的可执行代码 链接器选项 MEMORY命令:描述系统实际的硬件资源 SECTIONS命令:描述“段”如何定位 链接器调用的.cmd文件有3部分组成: 输入/输出定义:定义要链接的目标文件、库文件等,链接生成的交叉索引文件和可执行代码文件,以及链接器的选项,这一部分现在基本上在CCS集成调试环境中的编译选项中设置,所以在.cmd文件中不再需要,.map文件中能看到各“段”实际定位的情况,所以强烈建议链接产生此文件,便于你对系统整个存储空间的实际使用情况有个清晰地理解。 MEMORY命令:这部分具体描述系统实际的硬件资源 SECTIONS命令:这部分具体描述各“段”如何定位
23
MEMORY命令描述目标系统的存储空间 MEMORY { 存储器空间名: o = 十六进制存储器起始地址 , l = 十六进制存储器长度 }
PMEM: o = h, l = h BMEM: o = h, l = h } PAGE用于指出存储空间,PAGE 0表示程序存储空间,PAGE 1表示数据存储空间。 给每个存储体命名一个代表性的名字,origin指出该存储体的起始地址,length则指出该存储体的长度 names origins Lengths
24
SECTIONS命令描述“段”如何定位 SECTIONS { 段名 > 存储器空间名 } SECTIONS {
段名 > 存储器空间名 } SECTIONS { .text > PMEM .csldata > PMEM .stack > PMEM .far > PMEM .switch > BMEM .tables > BMEM .data > BMEM .bss > BMEM .sysmem > BMEM .cinit > PMEM .const > BMEM .cio > BMEM }
25
CMD 文件示例 -o sample.out//定义输出文件名 -m sample.map//定义存储器空间分配文件名
-stack 100 //定义堆栈大小 -l rts6700.lib //引用库文件 MEMORY { PMEM: o = h l = h BMEM: o = h l = h } SECTIONS .text > PMEM .csldata > PMEM .stack > PMEM .far > PMEM .switch > BMEM .tables > BMEM .data > BMEM .bss > BMEM .sysmem > BMEM .cinit > PMEM .const > BMEM .cio > BMEM
26
CMD 文件常用段名含义 段名 描述 .cinit 存放C程序中的变量初值和常量 .const
.text 存放C程序的代码 .bss 为C程序中的全局和静态变量保留存储空间 .far 为C程序中用far 声明的全局和静态变量保留空间 .stack 为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果 .sysmem 用于C 程序中malloc、calloc 和realloc 函数动态分配存储空间
27
SECTION “段” Section “段”概念:一块连续的存储空间,用于存放代码块或数据块,目标文件的每一段都是单独的、独有的。
在编程时,“段”没有绝对定位,每个“段”都认为是从0地址开始的一块连续的储存空间,所以软件开发人员只需要将不同代码块和数据块放到不同的“段”中,而无需关心这些“段”究竟定位于系统何处 优点:便于程序的模块化编程;便于工程化管理:可将软件开发人员和硬件开发人员基本上分离开 重定位:由于所有的“段”都是从0地址开始,所以程序编译完成后无法直接运行,要让程序正确运行,必须对“段”进行重新定位,这个工作由链接器完成 cmd文件: MEMORY命令描述系统硬件资源, SECTIONS命令描述软件人员程序中用到的“段”如何定位到恰当的硬件资源上 DSP汇编程序中引进了一个非常简单,但又非常有效的概念Section,中文称着“段”。 “段”即为一块连续的储存空间,可以用来存放代码块或数据块。 在编程时,“段”没有绝对定位,每个“段”都认为是从0地址开始的一块连续的储存空间,所以软件开发人员只需要将不同代码块和数据块放到不同的“段”中,而无需关心这些“段”究竟定位于系统何处。这样,一方面便于程序的模块化编程,另一方面,可以将软件开发人员和硬件开发人员基本上分离开,便于工程化管理。 由于所有的“段”都是从0地址开始,所以程序编译完成后无法直接运行的,要想程序正确运行,必须对“段”进行重新定位,这个工作由链接器完成。 对于链接器来说,首先要知道系统的硬件资源,其次要知道程序中用了哪些“段”,这些“段”究竟如何定位到系统的硬件资源上去。所以要由硬件人员描述系统的硬件资源,软件人员描述程序中用到的“段”,而由系统分析员将相应的“段”定位到恰当的硬件资源上。链接器还将检查各“段”是否重叠、是否超界,避免了人工检查边界带来的隐患。
28
SECTION “段” 汇编语言程序中,COFF目标文件总是包含三 个默认段: .text段:通常包含可执行代码;
.data段:通常包含已初始化的变量; .bss段:通常为未初始化的变量保留空间。 汇编器和链接器允许用户创建、命名和链接自 定义的段,这些段的使用与.data,.text和.bss段相同。
29
链接器的功能之一是将段重新定位到目标系统的存储器映射,这一功能称作重定位。
30
SECTION 伪指令 汇编语言程序中,有5个SECTION伪指令 .bss symbol,size in word:在.bss段内保留空间
.text:创建已初始化的段 .data:创建已初始化的段 .sect “section name”:创建初始化段,像.text和.data段那样可以包含代码和数据。 symbol .usect “section name”,size in word:创建未初始化段,可以象.bss段那样使用。 其中symbol相当于变量名,size in word保留的存储单元长度(以字为单位) 5个SECTION伪指令 .bss一般用于存放变量 .text一般用于存放程序代码 .data一般用于存放常量 .sect用于给用户命名一个段,存放特定的代码或有初值的数据 .usect用于给用户命名一个段,为变量、堆栈等无初值的数据块保留存储空间,在目标文件中,这些“段”不含任何实际内容 其中symbol相当于变量名,size in word保留的存储单元长度(以字为单位) 初试化段和未初试化段 .bss和.usect为未初试化段,用于为变量、堆栈等保留一块存储空间 .text、.data和.sect为初试化段,用于存放代码块或有初值的数据块 系统定义的段和用户定义的段 .text、.data和.bss为系统已定义好的段名 用户根据需要用. sect和.usect伪指令来定义段名,创建相应的“段” 汇编程序中,程序员用“段”伪指令来组织程序代码和数据。用“段”来组织程序代码大多数程序员均能做到,但用“段”来组织数据,很多程序员不能很好做到,往往会用绝对定位的方法来组织数据。比如为A/D采样开辟一缓冲器,很多程序员往往会为A/D缓冲器分配一绝对地址,然后将此绝对地址赋给指针,用指针来引用A/D数据。这不仅不利于边界检查,而且不利于程序的调整。正确的方法是用.usect伪指令为A/D缓冲器定义一个“段”,访问A/D的数据时,引用该段的标号,A/D缓冲器的定位由链接器完成。
31
SECTION 伪指令 初始化段和未初始化段: .bss和.usect为未初始化段,用于为变量、堆栈等保留一块存储空间
.text、.data和.sect为初始化段,用于存放代码块或有初值的数据块 系统定义的段和用户定义的段: .text、.data和.bss为系统已定义好的段名 用户根据需要用. sect和.usect伪指令来定义段名,创建相应的“段” 汇编程序中,程序员用“段”伪指令来组织程序的代码和数据
32
汇编器对“段”的处理 汇编器第一次遇到新“段”时,将该“段”的段程序计数器(SPC)置为0,并将随后的程序代码或数据顺序编译进该“段”中
汇编器遇到同名“段”时,将它们合并,然后将随后的程序代码或数据顺序编译进该“段”中 当汇编器遇到.text、.data和.sect伪指令时,汇编器停止将随后的程序代码或数据顺序编译进当前“段”中,而是顺序编译进遇到的“段”中 当汇编器遇到.bss和.usect伪指令时,汇编器并不结束当前“段”,而只是简单地暂时脱离当前“段”,随后的程序代码或数据仍将顺序编译进当前“段”中。 .bss和.usect伪指令,可以出现在.text、.data或.sect“段”中的任何位置,它们不会影响这些“段”的内容 汇编器第一次遇到新“段”时,将该“段”的段程序计数器(SPC)置为0,并将随后的程序代码或数据顺序编译进该“段”中 汇编器遇到同名“段”时,将它们合并,然后将随后的程序代码或数据顺序编译进该“段”中 当汇编器遇到.text、.data和.sect伪指令时,汇编器停止将随后的程序代码或数据顺序编译进当前“段”中,而是顺序编译进遇到的“段”中 当汇编器遇到.bss和.usect伪指令时,汇编器并不结束当前“段”,而只是简单地暂时脱离当前“段”,随后的程序代码或数据仍将顺序编译进当前“段”中。 .bss和.usect伪指令,可以出现在.text、.data或.sect“段”中的任何位置,它们不会影响这些“段”的内容
35
newvars段为.usect伪指令创建的自定义段,在存储器中保留8个字存储空间。
以上程序最终创建了4个段: .text段包含12个16位的目标代码。 .data包含712个16位的目标代码。 .bss段在存储器中保留10个字的空间。 newvars段为.usect伪指令创建的自定义段,在存储器中保留8个字存储空间。
36
链接器对“段”的处理 链接器对“段”的处理有2个方面: 链接器通过*.cmd文件来获得上述这些信息
将输入“段”组合产生输出“段” 将多个.obj文件中的同名“段”合并一个输出“段” 也可将不同名的“段”合并产生一个输出“段” 将输出“段”定位到实际的存储空间中 MEMORY命令: 用于扫描系统实际的硬件资源 SECTIONS命令:用于描述程序中定义了哪些“段”,这些“段”是否需要合并?如何合并?合并产生的输出“段”定位到实际硬件资源的何处? 链接器通过*.cmd文件来获得上述这些信息 链接器还将检查各输出“段”是否重叠、是否超界,避免了人工检查边界带来的隐患 链接器对“段”的处理有2个方面: 将多个.obj文件中的同名段合并成一个输出“段”,也可将不同名的“段”合并产生一个输出“段” 将输出“段”定位到实际的存储空间中 为了将输出“段”定位到实际的存储空间中,则链接器首先要知道系统实际的硬件资源,其次要知道程序中用了哪些“段”,这些“段”究竟如何定位到系统的硬件资源上去。所以要由硬件人员描述系统的硬件资源,软件人员描述程序中用到的“段”,而由系统分析员决定哪些“段”需要合并,哪些“段”不能合并,并将最终的输出“段”定位到恰当的硬件资源上。 链接器是通过一个.cmd文件来获取上述这些信息的,所以在对程序进行链接前,用户需要编写一个.cmd文件来描述这些信息 链接器还将检查各“段”是否重叠、是否超界,避免了人工检查边界带来的隐患。
38
C运行环境 .cinit 存放C程序中的变量初值和常 .const 存放C程序中的字符常量、浮点常量和const声明的常量
在代码生成工具程序中,除了汇编器和链接器等程序外,TI还提供了 可将C语言程序编译为汇编语言程序的C编译器。C编译器对C程序编译后 也产生已初始化段和未初始化段两种,具体的段名稍有不同。除了不使 用.data段之外,还产生了一些新的段。 已初始化段包括:.text段、.cinit段、.const段和.switch段。 未初始化段包括:.bss段、.stack段和.sysmem段。 .cinit 存放C程序中的变量初值和常 .const 存放C程序中的字符常量、浮点常量和const声明的常量 .switch 存放C程序中switch语句的跳针表 .text 存放C程序的代码 .bss 为C程序中的全局和静态变量保留存储空间 .far 为C程序中用far声明的全局和静态变量保留空间 .stack 为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参 数传递、存储局部变量和保存中间结果 .sysmem 用于C程序中malloc、calloc和realloc函数动态分配存储空间
39
栈(stack)是系统自动管理的一片内容,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果。
堆(heap)是用户想要自己独立灵活地控制一些内存时,用malloc( )、calloc() 和realloc()等函数开辟的一些动态内存区,将这些动态内存区称为堆。 C语言中有三种情况会产生.const段: ①由关键字const限定的带有全局变量的初始化值,如“const int a=100;”,但由关键字const限定的局部变量的初始化值不会产生.const段,局部变量都是运行时开辟在.bss段中的。 ②出现在表达式中的字符串常数和用来初始化指针变量的字符串常数,如“strcpy(s,“abc”);”及“char *p=“abc”;”。但当字符串常数用来初始化数组变量时,无论是全局还是局部数组变量,都不会产生.const段,此时字符串常数生成的是.cinit段。如“char s[4]=“abc”;”。 ③数组和结构体的初始值。数组和结构体是局部变量,其初始值会产生.const段。如“int a[8]={1,2,3};”。但当数组和结构体是全局变量时,其初始值不会产生.const段,此时生成的是.cinit段。
40
C运行环境 #pragma是标准C中保留的预处理命令。用户可以 通过#pragma来定义自己的段。 #pragma的语法是:
用户定义 #pragma是标准C中保留的预处理命令。用户可以 通过#pragma来定义自己的段。 #pragma的语法是: #pragma CODE_SECTION (symbol, "section name") #pragma DATA_SECTION (symbol, "section name") 说明: ①Symbol是符合,可以是函数名也可以是全局变量名。 Section name是用户自己定义在程序空间或数据空间的段名。 ②CODE_SECTION用来定义代码段,DATA_SECTION用来定义 数据段。 #pragma必须在符合被定义和使用前使用,并且不能在函数体内 声明#pragma。 存储模型:C程序的代码和数据如何定位 系统定义,C编译器将C程序中的特定成分编译进特定的“段”中,最后由链接器将这些“段”映射到目标系统的实际物理存储空间中,C编译器编译产生下列这些“段” .cinit 存放C程序中的变量初值和常量 .const 存放C程序中的字符常量、浮点常量和用const声明的常量 .switch 存放C程序中switch语句的跳针表 .text 存放C程序的代码 .bss 为C程序中的全局和静态变量保留存储空间 .far 为C程序中用far声明的全局和静态变量保留空间 .stack 为C程序系统堆栈保留存储空间,用于函数间的参数传递和存储局部变量 .sysmem 用于C程序中malloc、calloc和realloc函数动态分配存储空间 不同系列的DSP,C编译器产生的“段”略有不同,具体参考《Optimizing C Compiler User’s Guide》 用户定义,除了C编译器确省生成的“段”以外,用户还可为特殊的代码(函数)和数据(变量或常量)命名“段”,方法如下: #pragma CODE_SECTION (symbol, "section name") #pragma DATA_SECTION (symbol, "section name")
41
下例程序将全局变量数组a[100]单独编译成一个新的段,取名为“newsection”
#pragma DATA_SECTION(a ,“newsection”) unsigned int a[100]; main( ) { 程序内容 }
42
C运行环境 寄存器使用规则 C编译器如何使用DSP的寄存器 函数进入和返回前,寄存器的保护 函数调用规则
函数间的参数传递通过寄存器和系统堆栈进行 调用函数与被调用函数必须对各自的寄存器进行保护 从被调用函数返回前,被调用函数必须归还所有已占用的堆栈空间 C和ASM混合编程 C和ASM混合编程时,必须遵循寄存器使用规则和函数调用规则 被C调用的ASM函数,其函数名前应加“_” 中断服务程序 ASM编写的中断服务程序必须对所有用到寄存器进行保护,以免破坏C运行环境 C编写的中断服务程序应用interrupt关键字声明 寄存器使用规则 C编译器如何使用DSP的寄存器 函数进入和返回前,寄存器的保护 函数调用规则 函数间的参数传递通过寄存器和系统堆栈进行 调用函数与被调用函数必须对各自的寄存器进行保护 从被调用函数返回前,被调用函数必须归还所有已占用的堆栈空间 C和ASM混合编程 C和ASM混合编程时,必须遵循寄存器使用规则和函数调用规则 被C调用的ASM函数,其函数名前应加“_” 中断服务程序 ASM编写的中断服务程序必须对所有用到寄存器进行保护,以免破坏C运行环境 C编写的中断服务程序应用interrupt关键字声明
43
C运行环境 系统初始化 在运行C程序前,必须建立C运行环境,此任务由C引导程序c _ int00完成
_c_int00包含在库函数中,build时自动将其链接进可执行程序中,程序的入口地址必须设为_c_int00起始地址 _c_int00的源程序存放在由rts.src分离出来的boot.asm中,用户可根据需要修改 设置堆栈指针 初试化全局变量:将.cinit”段“中数据拷贝到.bss段中 调用C程序的主函数main( ) 系统初试化 在运行C程序前,必须建立C运行环境,此任务由C引导程序_c_int00完成 _c_int00包含在库函数中,build时自动将其链接进可执行程序中,程序的入口地址必须设为_c_int00起始地址 _c_int00的源程序存放在由rts.src分离出来的boot.asm中,用户可根据需要修改 设置堆栈指针 初试化全局变量:将.cinit”段“中数据拷贝到.bss”段“中 调用C程序的主函数main() 不同系列的DSP,其C编译器对C运行环境的处理略有不同,具体参考各自的《Optimizing C Compiler User’s Guide》
44
软件编译流程 目标文件地址是浮动的,能被重定位 链接器用.cmd文件对链接目标,进行重定位 Hex转换程序也使用cmd文件,配置转换选项
.CPP file .ASM file .C file .OBJ file Assembler .OUT file .HEX file Linker 目标文件地址是浮动的,能被重定位 链接器用.cmd文件对链接目标,进行重定位 列出目标文件、库文件和链接器选项 用MEMORY命令描述目标系统存储空间配置 用SECTIONS命令描述“段”如何定位 Hex转换程序也使用cmd文件,配置转换选项 C编译器将C/C++文件编译为ASM文件 汇编器将ASM文件编译为目标文件 链接器将一个或多个目标文件链接为一个可执行的OUT文件 OUT文件格式为COFF,一般编程器只接受HEX格式。HEX转换程序就是将OUT文件转换为HEX文件,编程器将HEX文件编程进ROM或Flash中
45
中断向量表 .ref _timer0_isr INT5: NOP 8 .ref _exint4_isr
.ref _c_int00 .global RESET_RST .sect "vectors“ RESET_RST: mvkl .S2 _c_int00, B0 mvkh .S2 _c_int00, B0 B S2 B0 NOP 5 NMI_RST: NOP 8 RESV1: NOP 8 RESV2: NOP 8 INT4: b _exint4_isr NOP 7 INT5: NOP 8 INT6: b _exint6_isr NOP 7 INT7: NOP 8 INT8: NOP 8 INT9: NOP 8 INT10: NOP 8 INT11: NOP 8 INT12: NOP 8 INT13: NOP 8 INT14: b _timer0_isr INT15: NOP 8
46
9.3 混合语言编程 C 语言语法接近自然语言,其可读性强、便于理解,在编制、修改、实现算法方面比用汇编语言开发容易。
47
混合编程的方法 C语言和汇编语言的混合编程有三种形式:
1. 在编写C语言代码中插入汇编语句,只需在汇编语句两边加上双引号和括号,在括号前面加上标识asm,如: asm(“ NOP 5”); 2. 在编写C代码的过程中调用直接映射为内联的C6000指令的特殊函数,内联函数用前下划线表示,使用时同调用C语言的库函数一样调用它,如: m = _int_abs(n); 3. 用汇编代码编写独立的函数,在C代码中直接调用
48
混合编程的接口规范 1. 采用C语言和汇编语言混合编程时,定义了一套严格的寄存器规则,调用函数保护了寄存器A0~A9和B0~B9,但当使用到寄存器A10~A15或B10~B15的时候,则必须自行对它们进行保护。在默认情况下: A3用作返回结构指针寄存器 B3用作被调用函数返回地址寄存器 A15用作帧指针寄存器 B14用作数据页指针寄存器 B15用作堆栈指针寄存器
49
混合编程的接口规范 2. 调用函数将参数传递到被调用函数中,前十个参数将被从左到右依次放入寄存器A4、B4、A6、B6、A8、B8、A10、B10、A12和B12,如果传递的参数是长型、双精度型或者是长双精度型,则将参数依次放入寄存器组A5:A4、B5:B4、A7:A6等,并将剩下的变量按相反的顺序放在堆栈里。注意,如果传递的参数是一个结构类型的参数,则传递的是该结构类型的地址。 3. 如果在C/C++调用函数中做了正确的函数返回声明,则被调用的汇编函数可以返回有效值。如果返回值是整型或32位的浮点型,则放在寄存器A4中返回;如果返回值是双精度或是长双精度型,则放在A5:A4中返回;如果返回值是一个结构类型,则将其结构的地址放在A3中返回。
50
混合编程的接口规范 4. 对于只在汇编语言模块中用到的变量的标识符,不能从下划线开始。
任何一个在汇编语言中声明的对象都要使其在C/C++中是可访问的,那么在汇编语言中必须用.def 或.global将其声明为外部变量。 同样在汇编语言中要引用C/C++函数或对象时,必须用.ref或.global将C/C++对象声明。 中断子程序必须把该子程序将要用到的所有寄存器进行入栈处理; 除了全局变量的初始化外,汇编语言的模块不得因为任何目的而使用.cinit段; 汇编代码的结束需用指令 “B B3” 将程序执行从被调用函数返回到C语言调用函数中。
51
混合编程示例程序 打开工程ComplexDelay.pjt,可以看到该工程包含如下文件:
main.c:C语言编写的主程序文件,调用使用汇编语言编写的延时程序asm_delay()函数进行精确延时 delay.asm:汇编语言编写的延时函数 示例0903
52
9.4 芯片支持库CSL 为什么要设计CSL DSP片上外设种类及其应用日趋复杂 提供一组标准的方法用于访问和控制片上外设
免除用户编写配置和控制片上外设所必需的定义和代码 什么是CSL:Chip Support Library 用于配置、控制和管理DSP片上外设 已为C6000和C5000系列DSP设计了各自的CSL库 CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化 CSL库是可裁剪的:即只有被使用的CSL模块才会包含进应用程序中 CSL库是可扩展的:每个片上外设的API相互独立,增加新的API,对其他片上外设没有影响 DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
53
CSL 的特点 片上外设编程的标准协议: 定义一组标准的APIs:函数、数据类型、宏 对硬件进行抽象,提取符号化的片上外设描述
定义一组宏,用于访问和建立寄存器及其域值 基本的资源管理 对多资源的片上外设进行管理 已集成到DSP/BIOS中 通过图形用户接口GUI对CSL进行配置 使片上外设容易使用 缩短开发时间,增加可移植性 CSL是用于对片上外设进行编程的一组标准协议,它为硬件提供了一个符号化的接口,通过抽象出必需的硬件寄存器和寄存器域信息,由C程序来控制片上外设。它包含每一个寄存器的定义,和寄存器所包含的每一个位域的定义。 对于相同类型的多个片上外设(如多个McBSPs)、或有多个资源的单个片上外设(如多通道DMAs) ,CSL为它们提供了基本的资源管理。CSL已完全被集成进DSP/BIOS中,正因为如此,它也提供图形用户接口(GUI),以方便配置片上外设和管理相应的资源。CSL的GUI是通过DSP/BIOS™图形化配置工具(GCONF)来进行访问。 因为用户不再需要开发和维护访问DSP片上外设的程序,大大减少用户编程的工作量,缩短开发周期,另外CSL的APIs是标准的,所以增加了不同DSP平台之间的可移植性。
54
CSL 的结构 CSL中,每一个外设都有一个对应的API模块,如: 直接存取器存取(EDMA)API模块
多通道缓冲串行端口(MsBCP)API模块 这种结构允许对CSL进行扩展,因为可以添加新的API模块作为新的外设形式。 DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
55
通用外设模块 外设 (PER) 描述 Include File Module Support Symbol
EDMA Enhanced direct memory access module csl_edma.h EDMA_SUPPORT EMIF External memory interface module csl_emif.h EMIF_SUPPORT GPIO General-Purpose input/output module csl_gpio.h GPIO_SUPPORT HPI Host port interface module csl_hpi.h HPI_SUPPORT I2C Inter−Integrated circuit module csl_i2c.h I2C_SUPPORT IRQ Interrupt controller module csl_irq.h IRQ_SUPPORT McASP Multichannel audio serial port module csl_mcasp.h MCASP_SUPPORT McBSP Multichannel buffered serial port module csl_mcbsp.h MCBSP_SUPPORT TIMER Timer module csl_timer.h TIMER_SUPPORT DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
56
CSL 命名规则和数据类型 对象类型 名称 Naming Convention Function PER_funcName()
Variable PER_varName Macro PER_MACRO_NAME Typedef PER_Typename Function Argument funcArg Structure Member memberName Data Type Description Uint8 unsigned char Uint16 unsigned short Uint32 unsigned int Uint40 unsigned long Int8 char Int16 short Int32 int Int40 long DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
57
通用的CSL 函数 handle = PER_open( channelNumber, [priority] flags )
功能:打开一个外设 通道,根据标志执行相应的操作。使用通道前必须调用此函数,返回一个唯一的设备句柄用于后续API调用。优先级(priority)参数仅适用于DAT模块。 PER_config( [handle,] *configStructure ) 功能:将配置结构的值写入外设寄存器。使用整型常量、整型变量、CSL符号常量 PER_REG_DEFAULT 、PER_REG_RMK宏生成的合并域值进行初始化。 PER_configArgs( [handle,] regval_1, regval_n ) 功能:写值 (regval_n) 到外设寄存器。可写值包括:整型常量、整型变量、CSL符号常量 PER_REG_DEFAULT 、PER_REG_RMK宏生成的合并域值。 PER_reset( [handle] ) 功能:复位外设,将其所有值恢复到上电缺省值。 PER_close( handle ) 功能:关闭由PER_open()函数打开的外设通道。通道寄存器恢复上电初始值,清除所有未执行的中断。 DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
58
通过寄存器来实现外设初始化 CSL提供了两种函数来初始化外设的寄存器:
1、PER-config() 用来初始化控制PER 外设的寄存器,其中PER 是CSL模块之一。这个函数需要一个地址来作为他的参数。这个地址指出了这个结构的位置,他代表了外设寄存器的值。每一个外设模块都定义了他的配置结构数据类型,包括PER-config()函数。 PER_Config MyConfig = { reg0, reg1, …}; … PER_config(&MyConfig); 2、PER-configArgs() 允许将个别寄存器的值传给函数的变量,然后将独立的值传给寄存器。 PER_configArgs(reg0, reg1, …); DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
59
通用CSL宏 1、PER 表示外设,如 EDMA 2、REG 表示寄存器名,如PRICTL0,AUXCTL
3、FIELD 表示寄存器域,如 ESIZE 4、regval 表示外设域生成宏PER-FMK( )产生的整型常量,整型变量,符号常量(PER_REG_DEFAULT),或者融合域值 5、fieldval 表示的是整常量,整型变量,或者符号常数(PER_REG_FIELD_SYMVAL) 6、x 表示整型常量,整型变量 7、sym 表示符号常量 DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
60
通用CSL宏 PER_REG_RMK( fieldval_n, . . . fieldval_0 )
功能:产生外设寄存器值;_RMK宏基于位域,使构建寄存器值变得很简单。_RMK宏使用规则:域必须可写。首先指定域参数的最高有效位(MSB),不管用到与否,必须包含所有可写域的值。如果所传值超出特定域所允许的位宽,_RMK宏将截断该域值。 PER_RGET(REG ) 功能:返回外设寄存器值。 PER_RSET(REG, regval ) 功能:将值写入外设寄存器。 PER_FMK(REG, FIELD , fieldval ) 功能:可与其他_FMK宏的结果进行或(OR)操作后,生成移位的 fieldval 值,对REG寄存器进行初始化。 作为_RMK宏的替代者,该宏允许初始化REG寄存器中的几个域,而不像_RMK宏那样必须初始化REG寄存器的所有域。 PER_FGET(REG, FIELD ) 功能:返回外设寄存中指定域(FIELD)的值 。 PER_FSET(REG, FIELD, fieldval ) 功能:将 fieldval写入外设寄存器中指定域(FIELD)。 PER_REG_ADDR(REG ) 功能:如果可用,取得外设寄存器(REG)的内存地址(或子地址) PER_FSETS(REG, FIELD, sym ) 功能:将符号值写入外设指定域中。 PER_FMKS(REG, FIELD, sym macro) 功能:可与其他_FMK/_FMKS宏的结果进行或(OR)操作,生成移位的符号值,对REG寄存器进行初始化。 DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
61
通用CSL宏 PER_ADDRH (h, REG ) Returns the address of a memory-mapped register for a given handle. PER_RGETH (h, REG ) Returns the value of a register for a given handle. PER_RSETH (h, REG, x ) Sets the register value to x for a given handle. PER_FGETH (h, REG, FIELD ) Returns the value of the field for a given handle. PER_FSETH (h, REG, FIELD, x ) Sets the field value to x for a given handle. PER_FSETSH (h, REG, FIELD, SYM ) Sets the field value to the symbol value for a given handle. DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
62
CSL符号常量值 PER_REG_DEFAULT 寄存器的缺省值,复位操作后对应的寄存器值或者复位失效后归零。
PER_REG_FIELD_SYMVAL 该符号常量用于指定特定外设寄存器中某个域的值。符号值的详细信息请参见附录B:CSL Registers PER_REG_FIELD_DEFAULT 域的缺省值,复位操作后对应的寄存器值或者复位失效后归零。 DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
63
使用CSL句柄 使用函数PER_open()来打开设备,获得一个句柄 Handle,若打开设备失败,那么PER_open()函数返回 INV 。 使用函数PER_close()来关闭设备。 EDMA_Handle myEdma; /* Defines a DMA_Handle object, myEdma */ /* Once defined, the CSL handle object is initialized by a call to PER_open.*/ myEdma = EDMA_open (EDMA_CHA0, EDMA_OPEN_RESET); /* Open EDMA channel 0 */ /* The call to DMA_open initializes the handle, myDma. This handle can then be used in calls to other API functions.*/ if(myEdma != INV) { EDMA_start (myEdma); /* Begin transfer */ EDMA_close (myEdma); /* Free DMA channel */ } DSP片上外设种类及其应用越来越复杂,大大增加了配置和控制片上外设的软件工作量。开发一套访问和控制片上外设的标准方法,可使大家共享,重复利用这些代码,从而避免每个用户重复编写配置和控制片上外设的定义和代码,让用户从这方面的工作中解放出来,加速产品的开发,缩短产品投放市场的时间。 CSL是一个运行时间库,可使你方便地配置、控制和管理片上外设。目前TI已为C6000和C5000系列DSP,开发了各自的CSL库。CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化。每个片上外设的API均以独立模块形式实现,这保证模块的粒度、可裁剪性和可扩展性。比如,如果用CSL来配置McBSP,那么只有来自McBSP API直接被使用的代码和函数包含到源程序中。因为每个片上外设的API模块是相互独立的,用户可以自己增加新的APIs更好地支持McBSP,但这对任何其他外设不产生影响。
64
DSP/BIOS操作系统 DSP/BIOS是一个实时操作系统RTOS 提供通常的RTOS的功能(任务调度,任务间通讯)
提供驱动程序模型,层次化地设计应用程序 DSP/BIOS以CCS插件的形式提供一些实时分析工具 程序跟踪:观察任务的调度、切换 性能监视:观察CPU的负载 状态统计:对事件做统计 提供RTDX(实时数据交换),不打断DSP运行的情况下实现主机和DSP的数据交换
65
DSP/BIOS 功能 抢先型实时、多任务操作系统内核 基于优先级的、抢先型实时调度程序 支持多线程管理与调度
支持4种线程类型:HWI、SWI、TSK、IDL 支持3种作业间的通信方式:Mailboxes、Semaphores、Queues 支持周期函数,方便实现固定时间间隔的数据采集,简化多速率系统的设计 提供存储器管理,实现动态存储器分配 实时分析模块 分析信息实时获取、传输和显示,为早期的系统级排错提供帮助 DSP/BIOS模块中内含分析信息的实时获取功能 分析信息的实时传输由RTDX( Real-Time Data Exchange)技术实现,完成目标DSP与主机之间的实时通信,C6000 RTDX的带宽为20KByte,RTDX是在idle作业期间完成,所以对程序执行速度的影响最小 主机可以显示:事件记录、线程执行顺序、执行次数的最大值或平均值和总的CPU负载等信息 DSP/BIOS是TI DSP软件架构的核心,由2个功能块组成: 抢先型实时、多任务操作系统内核: 基于优先级的、抢先型实时调度程序 支持多线程管理与调度 支持4种线程类型:HWI、SWI、TSK、IDL 支持3种作业间的通信方式:Mailboxes、Semaphores、Queues 支持周期函数,方便实现固定时间间隔的数据采集,简化多速率系统的设计 提供存储器管理,实现动态存储器分配 实时分析模块 分析信息实时获取、传输和显示,为早期的系统级排错提供帮助 DSP/BIOS模块中内含分析信息的实时获取 分析信息的实时传输由RTDX( Real-Time Data Exchange)技术实现,通过JTAG接口完成目标DSP与主机之间的实时通信,C6000 RTDX的带宽为20KByte,RTDX是在idle作业期间工作,所以对程序执行速度的影响最小 主机可以显示:事件记录、线程执行顺序、执行次数的最大值或平均值和总的CPU负载等信息
66
DSP/BIOS 使用 为了方便使用,TI提供一个可视化的配置工具,用于配置实际系统中所需的DSP/BIOS模块
代码大小:1K Words CPU占用:1MIPS DSP/BIOS采用标准的API,所以不同系列DSP之间的移植容易 DSP/BIOS集成在CCS中,无需使用许可费 为了方便使用,TI提供一个可视化的配置工具,用于配置实际系统中所需的DSP/BIOS模块 DSP/BIOS是可裁剪的,只有被应用程序使用的模块才会被链接到应用程序中 DSP/BIOS开销小: 代码大小:1K Words CPU占用:1MIPS DSP/BIOS采用标准的API,所以不同系列DSP之间的移植容易 DSP/BIOS集成在CCS中,无需使用许可费
67
简单程序开发流程(1)建立项目 ProjectNew 选择一个目录位置,生成一个项目文件test.pjt 补充CCS的setup.
68
简单程序开发流程(2)添加文件 ProjectAdd Files to Project…添加文件(.c,.lib,.cmd,.sa,.asm…) 1)vectors.asm 包含汇编指令处理reset中断服务程序,跳转到C c的入口.c_int00. 2)扫描dependencie: .h
69
简单程序开发流程(3)代码编辑 双击项目窗口的文件名,开始编辑源程序 可回CCS局面(1)再讲一遍
70
简单程序开发流程(4)设置编译选项 ProjectOptions
71
简单程序开发流程(5)Build 查找错误 ProjectBuild
72
简单程序开发流程(5)简单的调试 加载程序FileLoad Program… 设置断点,通过Watch Window观察变量 单步执行
黄色条代表当前执行到那条语句 紫色条代表断点位置
73
简单程序开发流程(6)Profile(剖析)
ProfileEnable Clock,start new session 设置profile point(绿色条) 每个绿色条在窗口中对应有一行统计数字,用来统计profile point(绿色条)之间的时钟数 调试器内部有时钟计数, 最后查看每一个观测点的运行时间
74
基本应用程序框架 在主程序main()函数里, 首先进行初始化, 随后进入死循环while(1), 在中断函数里响应各种事件,
int main( ) { int num = 1; Sys_Initialize( ); while(1) switch(num) case 1: num = 2; break; case 2: num = 1; break; default: break; } }; 在主程序main()函数里, 首先进行初始化, 随后进入死循环while(1), 在中断函数里响应各种事件, 然后在死循环while(1)里执行各种相应的任务
Similar presentations