
本书基于TI公司的3个文献编译而成,它们分别是TMS320C6000 Optimizing Compiler User’s Guide、TMS320C6000 Assembly Language Tools User’s Guide和TMS320C6000 Programmer’s Guide。
本书详细介绍了C6000的软件开发过程、C环境的实现、编程工具的使用和程序优化方法等方面的内容,涉及了几乎所有在C6000的硬件平台上开发一个完整的软件程序所应用的知识(CCS和DSP/BIOS在本丛书另外的两本中介绍),这些知识是进行C6000软件开发所必须具备的。
本书内容实践性强,适合于研究、开发TI C6000 DSP的工程师和研究人员阅读,同时也可作为相关专业研究生的参考资料。
译 者 序
美国德州仪器公司的TMS320C6000 DSP系列,采用VILW体系结构,有8个功能单元,一个时钟周期最多可以并行执行8条指令。由于功能强大,从它们面市起,即受到业界的注意。 但是,德州仪器公司的资料繁复庞杂,学习比较困难。
2003年5月,德州仪器公司中国大学计划和清华大学出版社组织编译了TI DSP手册,北京理工大学电子工程系的教师接受了翻译与TMS320C6000软件编程有关的用户手册的任务。这些手册包括:《TMS320C6000优化编译器用户手册(TMS320C6000 Optimizing Compiler User’s Guide)》、《TMS320C6000汇编语言工具用户手册(TMS320C6000 Assembly Language Tools User’s Guide)》和《TMS320C6000程序员手册(TMS320C6000 Programmer’s Guide)》。
德州仪器公司资料的版本在不断更新。本书的“TMS320C6000优化编译器用户手册(TMS320C6000 Optimizing Compiler User’s Guide)”是根据[SPRU187K]翻译;“TMS320C6000汇编语言工具用户手册(TMS320C6000 Assembly Language Tools User’s Guide)”,是根据[SPRU186M]翻译。在2004年9月即将交稿时,从德州仪器公司网站发现,这两个手册都有了新版本。经对照,发现新版本的改动很大。在与清华大学出版社曾刚编辑商量后,决定按德州仪器公司新版修改,重新校译。现在交付的译稿,第1篇“TMS320C6000优化编译器用户手册”,原文是TMS320C6000 Optimizing Compiler User’s Guide([SPRU187L]),由田黎育博士主译;第2篇“TMS320C6000程序员手册”,原文是TMS320C6000 Programmer’s Guide([SPRU198G]),由朱梦宇博士主译;第3篇“TMS320C6000汇编语言工具用户手册”,原文是TMS320C6000 Assembly Language Tools User’s Guide([SPRU186N]),由何佩琨教授主译。
本书是手册,不是教材,所以不完全是根据学生和开发人员的学习过程来编排的。我们翻译此书,是想为初学TMS320C6000的学生和开发人员提供一本学习的工具书。虽然英文文档很容易找到,但读中文能够提高效率,这对多数人来说还是一个现实的情况。为了保存原手册面貌,除了页码标注等少数情况外,在翻译时,我们尽量接近原文。由于两种文化的差异,有些地方的翻译相当困难。加之我们水平有限,还有教学科研任务,时间有限,翻译中的不当之处,恳请读者批评指正。欢迎读者把反馈信息发到译者的邮箱:tianliyu@bit.edu.cn。
感谢电子工程系的几名研究生,他(她)们参与了本书的初译工作。他(她)们是:李旻岳、商容容、谢华、袁亮、顾文彬、刘明敬、刘基南、潘涛、江培华、马永刚和刘先康。
最后,还要特别感谢清华大学胡广书教授和清华大学出版社曾刚编辑。在他们大力支持下,我们才能完成本书的翻译。
田黎育 何佩琨 朱梦宇
2005年1月20日
于北京理工大学电子工程系
序
经过全体编译老师和编译委员会近一年的努力,“TI DSP系列中文手册”终于陆续和广大读者见面了。
数字信号处理器(Digital Signal Processing,DSP)是对信号和图像实现实时处理的一类高性能的CPU。所谓“实时(Real-Time)实现”,是指一个实际的系统能在人们听觉、视觉或按任务要求所允许的时间范围内实现对输入信号的处理并将其输出。目前,DSP已广泛应用于通信、家电、航空航天、工业测量、控制、生物医学工程及军事等许许多多需要实时实现的领域。
美国德州仪器(Texas Instruments,TI)公司是全球DSP研发和生产的领先者。自1982年推出第一块DSP芯片以来,到20世纪90年代中期,TI先后推出了C10、C20、C30、C40、C50及C80等6代TMS320系列的DSP产品。紧接着又推出了C2000系列、C5000系列和C6000系列三大主流产品,并推出了将DSP和ARM合为一体的OMAP系列。这些产品无论是在国外还是在国内都获得了广泛的应用。例如,“TI中国大学计划”在2003年举办的“TI DSP设计比赛”中,国内高校就有约90个队参加,足见DSP在我国已经得到普遍的重视。
凡是从事过含有CPU的系统设计(单片机或DSP)的设计人员都知道,为了顺利地实现设计任务,一本或几本好的手册是必不可少的,其中包括该CPU的结构手册、指令和汇编语言手册以及开发手册等。
由于TI的DSP发展迅速,产品更新快,因此其手册自然也非常多。由于手册需要更新和补充,因此,彼此之间难免会出现重复和种类繁多的现象。使用过TI DSP文档的用户都感觉到,其手册在使用上是有相当难度的。另外,TI DSP文档都是用英文写成,这也给部分工程技术人员带来一定的困难。
鉴于此,TI中国主管提出委托国内的高校老师对其文档进行编译,并授权清华大学出版社正式出版。在“TI中国大学计划”的建议下,2003年6月通过推荐和报名方式成立了编译委员会。
通过认真讨论,编译委员会首先确定了文档编译的原则,然后确定了编译的书目,最后确定了每一本书的编译者。
关于编译的原则,我们提出了如下两点:
(1)本文档的定位为“手册”。也就是说,每一位文档的编译者应全面了解和掌握所编译书目的所有英文文档,并了解各个文档之间的关系,在保证文档完整的基础上,选择最新的文档,并去除其中的重复内容和已经淘汰的内容。
(2)要尽可能地按照TI英文文档的“本意”来形成中文,以保证手册的准确性。允许作者按自己的经验有所发挥,以便于难点的理解。
这次编译的书目包含三大部分:一是各个系列的共用部分,如CCS、DSP/BIOS、算法标准、C语言编译器及开发工具等各个手册;二是按C2000、C5000和C6000三大系列分别编译它们的CPU结构及指令手册;三是分别编译它们的应用。
编译计划在“TI中国大学计划”的相关会议上提出后,得到了国内高校许多老师的热情支持,很快便将要编译的书目一一落实。这些老师都有着从事DSP教学和科研的丰富经验,正是由于他们的大力支持,才使这一庞大的工作计划能够付诸实施。在此,谨向参加本系列手册编译工作的全体老师表示衷心的感谢!
“TI中国大学计划”在本系列手册的编译过程中给予了多方面的大力支持,在此向他们表示衷心的感谢!
由于本系列手册的编译工作量大、时间紧,因此,尽管编译老师和编译委员会都尽了最大的努力,但也难免有不妥、甚至错误之处,编译委员会全体老师恳切地希望广大读者给以批判指正。
清华大学生物医学工程系
胡广书 教授
2004年3月
目 录
第1篇 TMS320C6000优化编译器手册
第1章 介绍 1
1.1 软件开发工具概述 1
1.2 C/C++编译器概述 3
1.3 CCS(Code Composer Studio)和编译器 5
第2章 使用C/C++编译器 6
2.1 关于编译器 6
2.2 执行C/C++编译器 7
2.3 设置选项改变编译器的行为 7
2.4 设置默认的编译选项(C_OPTION和C_C6X_OPTION) 17
2.5 控制预处理器 18
2.6 理解诊断信息(diagnostic messages) 21
2.7 其他信息 24
2.8 生成交叉引用(cross-reference)列表信息(-px选项) 24
2.9 生成未加工的(raw)列表文件(-pl选项) 25
2.10 使用内联(inline)函数扩展 26
2.11 中断门限选项(Interrupt Flexibility Options)(-mi选项) 29
2.12 把C6400的代码和C6200/6700/旧的C6400的目标代码一起连接 29
2.13 使用交叠工具(interlist feature) 30
第3章 优化代码 32
3.1 执行优化 32
3.2 优化软件流水(software pipelining) 33
3.3 冗余循环(Redundant Loops) 41
3.4 减小代码尺寸(-ms选项) 42
3.5 执行文件级(file-level)优化(-O3选项) 42
3.6 执行程序级(program-level)优化(-pm和-O3选项) 43
3.7 指明是否使用别名技术(aliasing techniques) 45
3.8 阻止相关浮点操作的重新排序(reodering of associative
floating-point operation) 47
3.9 优化代码中谨慎使用asm语句 47
3.10 自动内联扩展(inline expasion)(-oi选项) 47
3.11 优化时使用交叠工具 48
3.12 调试和剖析(profiling)优化代码 49
3.13 正在执行哪种优化 50
第4章 使用汇编优化器 58
4.1 增强性能的代码开发流程 58
4.2 关于汇编优化器 59
4.3 写线性汇编需要知道什么 59
4.4 汇编优化器伪指令 64
4.5 使用汇编优化器避免存储体(bank)冲突 78
4.6 存储器别名模糊消除(memory alias disambiguation) 83
第5章 连接C/C++代码 87
5.1 通过编译器执行连接器(-z选项) 87
5.2 连接器选项 88
5.3 控制连接过程 90
第6章 使用独立(stand-alone)软件仿真器 95
6.1 运行独立软件仿真器 95
6.2 独立软件仿真器的选项 96
6.3 通过加载器把参数传递给程序 97
6.4 使用独立软件仿真器的剖析功能 98
6.5 选择仿真的硅版本(silicon revision)(-rev选项) 98
6.6 独立软件仿真器的例子 99
第7章 TMS320C6000 C/C++语言实现 101
7.1 TMS320C6000 C语言的特征 101
7.2 TMS320C6000 C++语言的特点 103
7.3 数据类型 104
7.4 关键字 104
7.5 寄存器变量和参数 109
7.6 asm语句 110
7.7 pragma伪指令 110
7.8 连接名(linkname)的生成 120
7.9 静态变量和全局变量的初始化 121
7.10 改变ISO C语言的模式 122
第8章 运行时(run-time)环境 125
8.1 存储器模型(memory model) 125
8.2 对象的表示 128
8.3 寄存器使用规范(register conventions) 134
8.4 函数结构和调用约定 135
8.5 C/C++与汇编语言的接口 137
8.6 中断处理 151
8.7 运行时支持的算术程序(run-time-support arithmetic routines) 153
8.8 系统初始化 155
第9章 运行时支持函数 160
9.1 库 160
9.2 C的I/O函数 161
9.3 头文件 168
9.4 运行时支持函数和宏总结 177
9.5 运行时支持函数和宏的描述 184
第10章 建库工具和C++名还原工具 228
10.1 建库工具(library-build utility) 228
10.2 C++名还原工具(Name Demangler) 231
第2篇 TMS320C6000程序员手册
第11章 简介 235
11.1 TMS320C6000体系结构 235
11.2 TMS320C6000流水线 235
11.3 提高性能的代码开发流程 236
第12章 C/C++代码优化 240
12.1 编写C/C++代码 240
12.2 编译C/C++代码 241
12.3 代码剖析 245
12.4 优化C/C++代码 247
第13章 编译器优化指南 273
13.1 引言:简单的C代码调整 273
13.2 第1课:从存储器指针得到循环传递路径 275
13.3 第2课:利用双数据通道平衡资源 280
13.4 第3课:存储器带宽的打包数据优化 283
13.5 第4课:程序级优化 287
13.6 第5课:写线性汇编 288
第14章 反馈解决方案 293
14.1 理解反馈 293
14.2 循环的错误信息 297
14.3 流水失败信息 298
14.4 研究反馈信息 302
第15章 通过线性汇编优化汇编代码 304
15.1 线性汇编代码 304
15.2 汇编优化器选项和伪指令 305
15.3 写并行代码 308
15.4 对短字长的数据使用字访问,对于浮点数据采用双字访问 314
15.5 软件流水 320
15.6 多周期循环的模迭代 339
15.7 循环传递路径 350
15.8 循环中的If-Then-Else语句 356
15.9 循环展开 360
15.10 生命太长问题(Live-Too-Long) 364
15.11 消除冗余取数 369
15.12 存储体 374
15.13 软件流水外环 383
15.14 同内环一起条件地执行外环 386
第16章 C64系列编程注意事项 396
16.1 C64x增强型结构简介 396
16.2 在C64x中使用打包数据处理 397
16.3 线性汇编的考虑 422
第17章 汇编代码结构 429
17.1 标号 429
17.2 并行符号 429
17.3 条件 429
17.4 指令 430
17.5 功能单元 431
17.6 操作数 433
17.7 注释 433
第18章 中断 434
18.1 中断概述 434
18.2 单分配和多分配 434
18.3 中断循环 435
18.4 可中断的代码产生 435
18.5 中断子程序 438
第19章 连接问题 441
19.1 怎样使用连接错误信息 441
19.2 如何通过放RTS在片外来节省片内存储器 443
第3篇 TMS320C6000汇编语言工具用户手册
第20章 软件开发工具简介 449
20.1 软件开发工具概述 449
20.2 工具介绍 449
20.3 Code Composer Studio和代码产生工具 451
第21章 通用目标文件格式(COFF)简介 452
21.1 段(sections) 452
21.2 汇编器怎样处理段 453
21.3 连接器怎样处理段 457
21.4 重定位 459
21.5 运行时重定位 460
21.6 程序加载 460
21.7 在COFF文件里的符号 460
第22章 汇编器描述 462
22.1 汇编器概述 462
22.2 汇编器在软件开发流程中的作用 462
22.3 调用汇编器 462
22.4 指定备用的汇编器输入 464
22.5 源语句格式 466
22.6 常量 469
22.7 字符串 471
22.8 符号 471
22.9 表达式 477
22.10 源文件列表 480
22.11 调试汇编源程序 481
22.12 交叉引用列表 482
第23章 汇编器伪指令 484
23.1 伪指令综述 484
23.2 段定义伪指令 487
23.3 初始化常量的伪指令 489
23.4 使段程序计数器对齐的伪指令 491
23.5 指定输出列表格式的伪指令 491
23.6 引用其他文件的伪指令 492
23.7 激活条件汇编的伪指令 493
23.8 定义汇编时刻的符号的伪指令 493
23.9 其他伪指令 494
23.10 伪指令参考 495
第24章 宏语言 534
24.1 宏的使用 534
24.2 定义宏 534
24.3 宏参数/替代符号 535
24.4 宏库 540
24.5 在宏内使用条件汇编 541
24.6 在宏内使用标号 542
24.7 在宏内生成信息 543
24.8 使用伪指令指定输出列表的格式 544
24.9 使用递归和嵌套的宏 545
24.10 宏伪指令综述 546
第25章 文档管理器说明 548
25.1 文档管理器概述 548
25.2 在软件开发流程中文档管理器的作用 548
25.3 调用文档管理器 548
25.4 文档管理器举例 550
第26章 连接器描述 552
26.1 连接器概述 552
26.2 连接器在软件开发流程中的作用 552
26.3 调用连接器 552
26.4 连接器选项 554
26.5 连接器命令文件 565
26.6 目标库 567
26.7 MEMORY伪指令 568
26.8 SECTIONS伪指令 570
26.9 指定段的运行地址 578
26.10 使用GROUP和UNION语句 580
26.11 特殊的段类型(DSECT、COPY和NOLOAD) 584
26.12 默认的定位算法 584
26.13 连接时给符号赋值 586
26.14 创建与填充空穴 591
26.15 连接器产生的复制表 594
26.16 部分(增量)连接 602
26.17 连接C/C++代码 603
26.18 连接器实例 606
第27章 绝对地址列表工具说明 609
27.1 产生一个绝对地址列表 609
27.2 调用绝对地址列表工具 609
27.3 绝对地址列表工具举例 610
第28章 交叉引用列表工具说明 614
28.1 生成交叉引用列表 614
28.2 调用交叉引用列表工具 614
28.3 交叉引用列表举例 615
第29章 目标文件工具说明 617
29.1 调用目标文件显示工具 617
29.2 XML标志索引 617
29.3 XML用户例子 621
29.4 调用名称列表工具程序 627
29.5 调用剥离工具程序 627
第30章 十六进制转换工具说明 629
30.1 十六进制转换工具在软件开发流程中的作用 629
30.2 调用十六进制转换工具 629
30.3 理解存储器宽度 632
30.4 ROMS伪指令 636
30.5 SECTIONS伪指令 639
30.6 排除一个指定段 640
30.7 给输出文件赋名 641
30.8 图像模式和-fill选项 642
30.9 为片上导引加载器构建一张表 643
30.10 控制ROM器件地址 646
30.11 目标格式描述 647
30.12 十六进制转换工具程序的错误提示信息 650
附录A 通用目标文件格式 652
附录B 符号调试伪指令 662
附录C XML连接信息文件说明 664
附录D 术语表 671